Changeset d3109ff in mainline for uspace/srv/hid/remcons/remcons.c


Ignore:
Timestamp:
2024-09-24T17:59:36Z (16 months ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
6a753a9c
Parents:
3fcea34
Message:

Cursor and color control in remote console + RGB

Move vt100 module from output server into separate vt library
Add cursor and color control to remcons using libvt
Add RGB color control to serial console and remote console

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/hid/remcons/remcons.c

    r3fcea34 rd3109ff  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * Copyright (c) 2012 Vojtech Horky
    44 * All rights reserved.
     
    5151#include <inttypes.h>
    5252#include <str.h>
     53#include <vt/vt100.h>
    5354#include "telnet.h"
    5455#include "user.h"
     56#include "remcons.h"
    5557
    5658#define APP_GETTERM  "/app/getterm"
     
    7476static errno_t remcons_open(con_srvs_t *, con_srv_t *);
    7577static errno_t remcons_close(con_srv_t *);
     78static errno_t remcons_read(con_srv_t *, void *, size_t, size_t *);
    7679static errno_t remcons_write(con_srv_t *, void *, size_t, size_t *);
    7780static void remcons_sync(con_srv_t *);
     
    8184static errno_t remcons_get_size(con_srv_t *, sysarg_t *, sysarg_t *);
    8285static errno_t remcons_get_color_cap(con_srv_t *, console_caps_t *);
     86static void remcons_set_style(con_srv_t *, console_style_t);
     87static void remcons_set_color(con_srv_t *, console_color_t,
     88    console_color_t, console_color_attr_t);
     89static void remcons_set_color(con_srv_t *, console_color_t,
     90    console_color_t, console_color_attr_t);
     91static void remcons_set_rgb_color(con_srv_t *, pixel_t, pixel_t);
     92static void remcons_cursor_visibility(con_srv_t *, bool);
    8393static errno_t remcons_get_event(con_srv_t *, cons_event_t *);
    8494
     
    8696        .open = remcons_open,
    8797        .close = remcons_close,
    88         .read = NULL,
     98        .read = remcons_read,
    8999        .write = remcons_write,
    90100        .sync = remcons_sync,
     
    94104        .get_size = remcons_get_size,
    95105        .get_color_cap = remcons_get_color_cap,
    96         .set_style = NULL,
    97         .set_color = NULL,
    98         .set_rgb_color = NULL,
    99         .set_cursor_visibility = NULL,
     106        .set_style = remcons_set_style,
     107        .set_color = remcons_set_color,
     108        .set_rgb_color = remcons_set_rgb_color,
     109        .set_cursor_visibility = remcons_cursor_visibility,
    100110        .get_event = remcons_get_event
    101111};
     
    115125static telnet_user_t *srv_to_user(con_srv_t *srv)
    116126{
    117         return srv->srvs->sarg;
     127        remcons_t *remcons = (remcons_t *)srv->srvs->sarg;
     128        return remcons->user;
     129}
     130
     131static remcons_t *srv_to_remcons(con_srv_t *srv)
     132{
     133        remcons_t *remcons = (remcons_t *)srv->srvs->sarg;
     134        return remcons;
    118135}
    119136
     
    141158}
    142159
     160static errno_t remcons_read(con_srv_t *srv, void *data, size_t size,
     161    size_t *nread)
     162{
     163        telnet_user_t *user = srv_to_user(srv);
     164        errno_t rc;
     165
     166        rc = telnet_user_recv(user, data, size, nread);
     167        if (rc != EOK)
     168                return rc;
     169
     170        return EOK;
     171}
     172
    143173static errno_t remcons_write(con_srv_t *srv, void *data, size_t size, size_t *nwritten)
    144174{
     
    161191static void remcons_clear(con_srv_t *srv)
    162192{
    163         (void) srv;
     193        remcons_t *remcons = srv_to_remcons(srv);
     194
     195        if (remcons->enable_ctl) {
     196                vt100_cls(remcons->vt);
     197                vt100_set_pos(remcons->vt, 0, 0);
     198                remcons->user->cursor_x = 0;
     199                remcons->user->cursor_y = 0;
     200        }
    164201}
    165202
    166203static void remcons_set_pos(con_srv_t *srv, sysarg_t col, sysarg_t row)
    167204{
    168         telnet_user_t *user = srv_to_user(srv);
    169 
    170         telnet_user_update_cursor_x(user, col);
     205        remcons_t *remcons = srv_to_remcons(srv);
     206        telnet_user_t *user = srv_to_user(srv);
     207
     208        if (remcons->enable_ctl) {
     209                vt100_set_pos(remcons->vt, col, row);
     210                remcons->user->cursor_x = col;
     211                remcons->user->cursor_y = row;
     212        } else {
     213                telnet_user_update_cursor_x(user, col);
     214        }
    171215}
    172216
     
    176220
    177221        *col = user->cursor_x;
    178         *row = 0;
     222        *row = user->cursor_y;
    179223
    180224        return EOK;
     
    183227static errno_t remcons_get_size(con_srv_t *srv, sysarg_t *cols, sysarg_t *rows)
    184228{
    185         (void) srv;
    186 
    187         *cols = 100;
    188         *rows = 1;
     229        remcons_t *remcons = srv_to_remcons(srv);
     230
     231        if (remcons->enable_ctl) {
     232                *cols = 80;
     233                *rows = 25;
     234        } else {
     235                *cols = 100;
     236                *rows = 1;
     237        }
    189238
    190239        return EOK;
     
    193242static errno_t remcons_get_color_cap(con_srv_t *srv, console_caps_t *ccaps)
    194243{
    195         (void) srv;
    196         *ccaps = CONSOLE_CAP_NONE;
    197 
    198         return EOK;
     244        remcons_t *remcons = srv_to_remcons(srv);
     245
     246        if (remcons->enable_ctl)
     247                *ccaps = CONSOLE_CAP_INDEXED | CONSOLE_CAP_RGB;
     248        else
     249                *ccaps = 0;
     250
     251        return EOK;
     252}
     253
     254static void remcons_set_style(con_srv_t *srv, console_style_t style)
     255{
     256        remcons_t *remcons = srv_to_remcons(srv);
     257        char_attrs_t attrs;
     258
     259        if (remcons->enable_ctl) {
     260                attrs.type = CHAR_ATTR_STYLE;
     261                attrs.val.style = style;
     262                vt100_set_attr(remcons->vt, attrs);
     263        }
     264}
     265
     266static void remcons_set_color(con_srv_t *srv, console_color_t bgcolor,
     267    console_color_t fgcolor, console_color_attr_t flags)
     268{
     269        remcons_t *remcons = srv_to_remcons(srv);
     270        char_attrs_t attrs;
     271
     272        if (remcons->enable_ctl) {
     273                attrs.type = CHAR_ATTR_INDEX;
     274                attrs.val.index.bgcolor = bgcolor;
     275                attrs.val.index.fgcolor = fgcolor;
     276                attrs.val.index.attr = flags;
     277                vt100_set_attr(remcons->vt, attrs);
     278        }
     279}
     280
     281static void remcons_set_rgb_color(con_srv_t *srv, pixel_t bgcolor,
     282    pixel_t fgcolor)
     283{
     284        remcons_t *remcons = srv_to_remcons(srv);
     285        char_attrs_t attrs;
     286
     287        if (remcons->enable_ctl) {
     288                attrs.type = CHAR_ATTR_RGB;
     289                attrs.val.rgb.bgcolor = bgcolor;
     290                attrs.val.rgb.fgcolor = fgcolor;
     291                vt100_set_attr(remcons->vt, attrs);
     292        }
     293}
     294
     295static void remcons_cursor_visibility(con_srv_t *srv, bool visible)
     296{
     297        remcons_t *remcons = srv_to_remcons(srv);
     298
     299        if (remcons->enable_ctl)
     300                vt100_cursor_visibility(remcons->vt, visible);
    199301}
    200302
     
    287389}
    288390
     391static void remcons_vt_putchar(void *arg, char32_t c)
     392{
     393        remcons_t *remcons = (remcons_t *)arg;
     394        char buf[STR_BOUNDS(1)];
     395        size_t off;
     396        errno_t rc;
     397
     398        (void)arg;
     399
     400        off = 0;
     401        rc = chr_encode(c, buf, &off, sizeof(buf));
     402        if (rc != EOK)
     403                return;
     404
     405        (void)telnet_user_send_data(remcons->user, buf, off);
     406}
     407
     408static void remcons_vt_cputs(void *arg, const char *str)
     409{
     410        remcons_t *remcons = (remcons_t *)arg;
     411
     412        (void)telnet_user_send_data(remcons->user, str, str_size(str));
     413}
     414
     415static void remcons_vt_flush(void *arg)
     416{
     417        remcons_t *remcons = (remcons_t *)arg;
     418        (void)remcons;
     419}
     420
    289421/** Handle network connection.
    290422 *
     
    294426static void remcons_new_conn(tcp_listener_t *lst, tcp_conn_t *conn)
    295427{
     428        char_attrs_t attrs;
     429        remcons_t *remcons = calloc(1, sizeof(remcons_t));
     430        assert(remcons != NULL); // XXX
    296431        telnet_user_t *user = telnet_user_create(conn);
    297432        assert(user);
    298433
     434        remcons->enable_ctl = true;
     435        remcons->user = user;
     436
     437        if (remcons->enable_ctl) {
     438                user->rows = 25;
     439        } else {
     440                user->rows = 1;
     441        }
     442
     443        remcons->vt = vt100_state_create((void *)remcons, 80, 25,
     444            remcons_vt_putchar, remcons_vt_cputs, remcons_vt_flush);
     445        assert(remcons->vt != NULL); // XXX
     446        remcons->vt->enable_rgb = true;
     447
     448        if (remcons->enable_ctl) {
     449                attrs.type = CHAR_ATTR_STYLE;
     450                attrs.val.style = STYLE_NORMAL;
     451                vt100_set_sgr(remcons->vt, attrs);
     452                vt100_cls(remcons->vt);
     453                vt100_set_pos(remcons->vt, 0, 0);
     454        }
     455
    299456        con_srvs_init(&user->srvs);
    300457        user->srvs.ops = &con_ops;
    301         user->srvs.sarg = user;
     458        user->srvs.sarg = remcons;
    302459        user->srvs.abort_timeout = 1000;
    303460
Note: See TracChangeset for help on using the changeset viewer.