Changeset 6907f26 in mainline for uspace/srv/hid/remcons/remcons.c
- Timestamp:
- 2024-10-03T15:42:59Z (9 months ago)
- 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)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/remcons/remcons.c
rd31c3ea r6907f26 34 34 */ 35 35 36 #include <adt/prodcons.h> 36 37 #include <as.h> 37 38 #include <async.h> … … 124 125 static void remcons_vt_cputs(void *, const char *); 125 126 static void remcons_vt_flush(void *); 127 static void remcons_vt_key(void *, keymod_t, keycode_t, char); 126 128 127 129 static vt100_cb_t remcons_vt_cb = { 128 130 .putuchar = remcons_vt_putchar, 129 131 .control_puts = remcons_vt_cputs, 130 .flush = remcons_vt_flush 132 .flush = remcons_vt_flush, 133 .key = remcons_vt_key 131 134 }; 132 135 … … 340 343 } 341 344 345 /** Creates new keyboard event from given char. 346 * 347 * @param type Event type (press / release). 348 * @param c Pressed character. 349 */ 350 static 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 342 365 static errno_t remcons_get_event(con_srv_t *srv, cons_event_t *event) 343 366 { 367 remcons_t *remcons = srv_to_remcons(srv); 344 368 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); 354 384 355 385 event->type = CEV_KEY; 356 event->ev.key = kevent; 386 event->ev.key = *tmp; 387 388 free(tmp); 357 389 358 390 return EOK; … … 551 583 } 552 584 585 static 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 553 597 /** Handle network connection. 554 598 * … … 567 611 remcons->enable_rgb = !no_ctl && !no_rgb; 568 612 remcons->user = user; 613 prodcons_initialize(&remcons->in_events); 569 614 570 615 if (remcons->enable_ctl) {
Note:
See TracChangeset
for help on using the changeset viewer.