Changeset 6907f26 in mainline for uspace/srv/hid/remcons/remcons.c


Ignore:
Timestamp:
2024-10-03T15:42:59Z (8 days ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
d05c237
Parents:
d31c3ea
git-author:
Jiri Svoboda <jiri@…> (2024-10-02 17:42:46)
git-committer:
Jiri Svoboda <jiri@…> (2024-10-03 15:42:59)
Message:

Parse VT100 keyboard escape sequences in libvt

File:
1 edited

Legend:

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

    rd31c3ea r6907f26  
    3434 */
    3535
     36#include <adt/prodcons.h>
    3637#include <as.h>
    3738#include <async.h>
     
    124125static void remcons_vt_cputs(void *, const char *);
    125126static void remcons_vt_flush(void *);
     127static void remcons_vt_key(void *, keymod_t, keycode_t, char);
    126128
    127129static vt100_cb_t remcons_vt_cb = {
    128130        .putuchar = remcons_vt_putchar,
    129131        .control_puts = remcons_vt_cputs,
    130         .flush = remcons_vt_flush
     132        .flush = remcons_vt_flush,
     133        .key = remcons_vt_key
    131134};
    132135
     
    340343}
    341344
     345/** Creates new keyboard event from given char.
     346 *
     347 * @param type Event type (press / release).
     348 * @param c Pressed character.
     349 */
     350static kbd_event_t *new_kbd_event(kbd_event_type_t type, keymod_t mods,
     351    keycode_t key, char c)
     352{
     353        kbd_event_t *event = malloc(sizeof(kbd_event_t));
     354        assert(event);
     355
     356        link_initialize(&event->link);
     357        event->type = type;
     358        event->mods = mods;
     359        event->key = key;
     360        event->c = c;
     361
     362        return event;
     363}
     364
    342365static errno_t remcons_get_event(con_srv_t *srv, cons_event_t *event)
    343366{
     367        remcons_t *remcons = srv_to_remcons(srv);
    344368        telnet_user_t *user = srv_to_user(srv);
    345         kbd_event_t kevent;
    346         errno_t rc;
    347 
    348         rc = telnet_user_get_next_keyboard_event(user, &kevent);
    349         if (rc != EOK) {
    350                 /* XXX What? */
    351                 memset(event, 0, sizeof(*event));
    352                 return EOK;
    353         }
     369        size_t nread;
     370
     371        while (list_empty(&remcons->in_events.list)) {
     372                char next_byte = 0;
     373
     374                errno_t rc = telnet_user_recv(user, &next_byte, 1,
     375                    &nread);
     376                if (rc != EOK)
     377                        return rc;
     378
     379                vt100_rcvd_char(remcons->vt, next_byte);
     380        }
     381
     382        link_t *link = prodcons_consume(&remcons->in_events);
     383        kbd_event_t *tmp = list_get_instance(link, kbd_event_t, link);
    354384
    355385        event->type = CEV_KEY;
    356         event->ev.key = kevent;
     386        event->ev.key = *tmp;
     387
     388        free(tmp);
    357389
    358390        return EOK;
     
    551583}
    552584
     585static void remcons_vt_key(void *arg, keymod_t mods, keycode_t key, char c)
     586{
     587        remcons_t *remcons = (remcons_t *)arg;
     588
     589        kbd_event_t *down = new_kbd_event(KEY_PRESS, mods, key, c);
     590        kbd_event_t *up = new_kbd_event(KEY_RELEASE, mods, key, c);
     591        assert(down);
     592        assert(up);
     593        prodcons_produce(&remcons->in_events, &down->link);
     594        prodcons_produce(&remcons->in_events, &up->link);
     595}
     596
    553597/** Handle network connection.
    554598 *
     
    567611        remcons->enable_rgb = !no_ctl && !no_rgb;
    568612        remcons->user = user;
     613        prodcons_initialize(&remcons->in_events);
    569614
    570615        if (remcons->enable_ctl) {
Note: See TracChangeset for help on using the changeset viewer.