Changes in uspace/srv/hid/console/console.c [a58bc8b:2f90b46] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/console/console.c
ra58bc8b r2f90b46 76 76 } console_state_t; 77 77 78 #define UTF8_CHAR_BUFFER_SIZE (STR_BOUNDS(1) + 1)79 80 78 typedef struct { 81 79 atomic_t refcnt; /**< Connection reference count */ 82 80 prodcons_t input_pc; /**< Incoming keyboard events */ 83 char char_remains[UTF8_CHAR_BUFFER_SIZE]; /**< Not yet sent bytes of last char event. */84 size_t char_remains_len; /**< Number of not yet sent bytes. */85 81 86 82 fibril_mutex_t mtx; /**< Lock protecting mutable fields */ … … 617 613 618 614 size_t pos = 0; 619 620 /*621 * Read input from keyboard and copy it to the buffer.622 * We need to handle situation when wchar is split by 2 following623 * reads.624 */625 615 while (pos < size) { 626 /* Copy to the buffer remaining characters. */ 627 while ((pos < size) && (cons->char_remains_len > 0)) { 628 buf[pos] = cons->char_remains[0]; 616 link_t *link = prodcons_consume(&cons->input_pc); 617 kbd_event_t *event = list_get_instance(link, kbd_event_t, link); 618 619 if (event->type == KEY_PRESS) { 620 buf[pos] = event->c; 629 621 pos++; 630 /* Unshift the array. */ 631 for (size_t i = 1; i < cons->char_remains_len; i++) { 632 cons->char_remains[i - 1] = cons->char_remains[i]; 633 } 634 cons->char_remains_len--; 635 } 636 /* Still not enough? Then get another key from the queue. */ 637 if (pos < size) { 638 link_t *link = prodcons_consume(&cons->input_pc); 639 kbd_event_t *event = list_get_instance(link, kbd_event_t, link); 640 641 /* Accept key presses of printable chars only. */ 642 if ((event->type == KEY_PRESS) && (event->c != 0)) { 643 wchar_t tmp[2] = { event->c, 0 }; 644 wstr_to_str(cons->char_remains, UTF8_CHAR_BUFFER_SIZE, tmp); 645 cons->char_remains_len = str_size(cons->char_remains); 646 } 647 648 free(event); 649 } 622 } 623 624 free(event); 650 625 } 651 626 … … 852 827 async_set_client_connection(client_connection); 853 828 int rc = loc_server_register(NAME); 854 if (rc < 0) {829 if (rc != EOK) { 855 830 printf("%s: Unable to register server (%s)\n", NAME, 856 831 str_error(rc)); … … 955 930 fibril_mutex_initialize(&consoles[i].mtx); 956 931 prodcons_initialize(&consoles[i].input_pc); 957 consoles[i].char_remains_len = 0;958 932 959 933 if (graphics_state == GRAPHICS_FULL) {
Note:
See TracChangeset
for help on using the changeset viewer.