From d4ff4244cfa5b063836c8f471a594213aeee9cbc Mon Sep 17 00:00:00 2001 From: "K. Lange" Date: Tue, 13 Jul 2021 08:32:09 +0900 Subject: [PATCH] kbd: stop sending empty events to clients --- apps/compositor.c | 9 +- apps/terminal-vga.c | 5 +- base/usr/include/toaru/kbd.h | 51 +----- lib/kbd.c | 317 ++++++++++------------------------- 4 files changed, 95 insertions(+), 287 deletions(-) diff --git a/apps/compositor.c b/apps/compositor.c index 87c8c25d..99dccde4 100644 --- a/apps/compositor.c +++ b/apps/compositor.c @@ -2268,10 +2268,11 @@ int main(int argc, char * argv[]) { unsigned char buf[1]; int r = read(kfd, buf, 1); if (r > 0) { - kbd_scancode(&state, buf[0], &event); - yutani_msg_buildx_key_event_alloc(m); - yutani_msg_buildx_key_event(m,0, &event, &state); - handle_key_event(yg, (struct yutani_msg_key_event *)m->data); + if (kbd_scancode(&state, buf[0], &event)) { + yutani_msg_buildx_key_event_alloc(m); + yutani_msg_buildx_key_event(m,0, &event, &state); + handle_key_event(yg, (struct yutani_msg_key_event *)m->data); + } } continue; } else if (index == 1) { diff --git a/apps/terminal-vga.c b/apps/terminal-vga.c index fbe74170..c7f46c12 100644 --- a/apps/terminal-vga.c +++ b/apps/terminal-vga.c @@ -1338,8 +1338,9 @@ int main(int argc, char ** argv) { if (res[1]) { int r = read(kfd, buf, 1); for (int i = 0; i < r; ++i) { - int ret = kbd_scancode(&kbd_state, buf[i], &event); - key_event(ret, &event); + if (kbd_scancode(&kbd_state, buf[i], &event)) { + key_event(event.action == KEY_ACTION_DOWN && event.key, &event); + } } } if (res[2]) { diff --git a/base/usr/include/toaru/kbd.h b/base/usr/include/toaru/kbd.h index 0929785e..41e8a550 100644 --- a/base/usr/include/toaru/kbd.h +++ b/base/usr/include/toaru/kbd.h @@ -4,13 +4,6 @@ _Begin_C_Header -#define KBD_NORMAL 0 -#define KBD_ESC_A 1 -#define KBD_ESC_B 2 -#define KBD_FUNC 3 -#define KBD_ESC_O 4 -#define KBD_ESC_EXT 5 - #define KEY_NONE 0 #define KEY_BACKSPACE 8 #define KEY_CTRL_A 1 @@ -45,17 +38,6 @@ _Begin_C_Header #define KEY_ARROW_DOWN 258 #define KEY_ARROW_RIGHT 259 #define KEY_ARROW_LEFT 260 -#define KEY_BAD_STATE -1 - -#define KEY_CTRL_ARROW_UP 261 -#define KEY_CTRL_ARROW_DOWN 262 -#define KEY_CTRL_ARROW_RIGHT 263 -#define KEY_CTRL_ARROW_LEFT 264 - -#define KEY_SHIFT_ARROW_UP 265 -#define KEY_SHIFT_ARROW_DOWN 266 -#define KEY_SHIFT_ARROW_RIGHT 267 -#define KEY_SHIFT_ARROW_LEFT 268 #define KEY_LEFT_CTRL 1001 #define KEY_LEFT_SHIFT 1002 @@ -89,6 +71,8 @@ _Begin_C_Header #define KEY_INSERT 2018 #define KEY_PAUSE 2019 #define KEY_SCROLL_LOCK 2020 +#define KEY_PRINT_SCREEN 2021 +#define KEY_APP 2022 #define KEY_NUM_0 2500 #define KEY_NUM_1 2501 @@ -107,36 +91,6 @@ _Begin_C_Header #define KEY_NUM_PLUS 2514 #define KEY_NUM_ENTER 2515 -#define KEY_SCANCODE_F1 0x3b -#define KEY_SCANCODE_F2 0x3c -#define KEY_SCANCODE_F3 0x3d -#define KEY_SCANCODE_F4 0x3e -#define KEY_SCANCODE_F5 0x3f -#define KEY_SCANCODE_F6 0x40 -#define KEY_SCANCODE_F7 0x41 -#define KEY_SCANCODE_F8 0x42 -#define KEY_SCANCODE_F9 0x43 -#define KEY_SCANCODE_F10 0x44 -#define KEY_SCANCODE_F11 0x57 -#define KEY_SCANCODE_F12 0x58 - -#define KEY_SCANCODE_NUM_1 0x4f -#define KEY_SCANCODE_NUM_2 0x50 -#define KEY_SCANCODE_NUM_3 0x51 -#define KEY_SCANCODE_NUM_4 0x4B -#define KEY_SCANCODE_NUM_5 0x4C -#define KEY_SCANCODE_NUM_6 0x4D -#define KEY_SCANCODE_NUM_7 0x47 -#define KEY_SCANCODE_NUM_8 0x48 -#define KEY_SCANCODE_NUM_9 0x49 -#define KEY_SCANCODE_NUM_0 0x52 -#define KEY_SCANCODE_NUM_DOT 0x53 -#define KEY_SCANCODE_NUM_MIN 0x4a -#define KEY_SCANCODE_NUM_ADD 0x4e - -#define KEY_SCANCODE_NUM_LK 0x45 -#define KEY_SCANCODE_SCROLL 0x46 - #define KEY_MOD_LEFT_CTRL 0x01 #define KEY_MOD_LEFT_SHIFT 0x02 #define KEY_MOD_LEFT_ALT 0x04 @@ -184,7 +138,6 @@ typedef struct { int kbd_esc_buf; } key_event_state_t; -extern kbd_key_t kbd_key(key_event_state_t * state, unsigned char c); extern int kbd_scancode(key_event_state_t * state, unsigned char c, key_event_t * event); _End_C_Header diff --git a/lib/kbd.c b/lib/kbd.c index 63f7b15a..4811196b 100644 --- a/lib/kbd.c +++ b/lib/kbd.c @@ -123,172 +123,36 @@ char kbd_us_l2[128] = { 0, /* everything else */ }; +#define KEY_SCANCODE_F1 0x3b +#define KEY_SCANCODE_F2 0x3c +#define KEY_SCANCODE_F3 0x3d +#define KEY_SCANCODE_F4 0x3e +#define KEY_SCANCODE_F5 0x3f +#define KEY_SCANCODE_F6 0x40 +#define KEY_SCANCODE_F7 0x41 +#define KEY_SCANCODE_F8 0x42 +#define KEY_SCANCODE_F9 0x43 +#define KEY_SCANCODE_F10 0x44 +#define KEY_SCANCODE_F11 0x57 +#define KEY_SCANCODE_F12 0x58 -/* - * Converts from incoming terminal keys to kbd_keys - */ -kbd_key_t kbd_key(key_event_state_t * state, unsigned char c) { - switch (state->kbd_state) { - case KBD_NORMAL: - switch (c) { - case 0x1b: - state->kbd_state = KBD_ESC_A; - return KEY_NONE; - default: - return c; - } - case KBD_ESC_A: - switch (c) { - case 0x5b: - state->kbd_state = KBD_ESC_B; - return KEY_NONE; - case 'O': - state->kbd_state = KBD_ESC_O; - return KEY_NONE; - default: - state->kbd_state = KBD_NORMAL; - return c; - } - case KBD_ESC_O: - switch (c) { - case 0x41: - state->kbd_state = KBD_NORMAL; - return KEY_ARROW_UP; - case 0x42: - state->kbd_state = KBD_NORMAL; - return KEY_ARROW_DOWN; - case 0x43: - state->kbd_state = KBD_NORMAL; - return KEY_ARROW_RIGHT; - case 0x44: - state->kbd_state = KBD_NORMAL; - return KEY_ARROW_LEFT; - case 'H': - state->kbd_state = KBD_NORMAL; - return KEY_HOME; - case 'F': - state->kbd_state = KBD_NORMAL; - return KEY_END; - default: - state->kbd_state = KBD_NORMAL; - return c; - } - case KBD_ESC_B: - switch (c) { - case 0x41: - state->kbd_state = KBD_NORMAL; - return KEY_ARROW_UP; - case 0x42: - state->kbd_state = KBD_NORMAL; - return KEY_ARROW_DOWN; - case 0x43: - state->kbd_state = KBD_NORMAL; - return KEY_ARROW_RIGHT; - case 0x44: - state->kbd_state = KBD_NORMAL; - return KEY_ARROW_LEFT; - case 'H': - state->kbd_state = KBD_NORMAL; - return KEY_HOME; - case 'F': - state->kbd_state = KBD_NORMAL; - return KEY_END; - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - state->kbd_esc_buf = c; - state->kbd_state = KBD_ESC_EXT; - return KEY_NONE; - default: - state->kbd_state = KBD_NORMAL; - return c; - } - case KBD_ESC_EXT: - switch (c) { - case '~': - switch (state->kbd_esc_buf) { - case '2': - state->kbd_state = KBD_NORMAL; - return KEY_INSERT; - case '3': - state->kbd_state = KBD_NORMAL; - return KEY_DEL; - case '5': - state->kbd_state = KBD_NORMAL; - return KEY_PAGE_UP; - case '6': - state->kbd_state = KBD_NORMAL; - return KEY_PAGE_DOWN; - default: - return c; - } - case 'A': - switch (state->kbd_esc_buf) { - case '2': - state->kbd_state = KBD_NORMAL; - return KEY_SHIFT_ARROW_UP; - case '5': - state->kbd_state = KBD_NORMAL; - return KEY_CTRL_ARROW_UP; - /* Other modifier states? */ - default: - return c; - } - case 'B': - switch (state->kbd_esc_buf) { - case '2': - state->kbd_state = KBD_NORMAL; - return KEY_SHIFT_ARROW_DOWN; - case '5': - state->kbd_state = KBD_NORMAL; - return KEY_CTRL_ARROW_DOWN; - /* Other modifier states? */ - default: - return c; - } - case 'C': - switch (state->kbd_esc_buf) { - case '2': - state->kbd_state = KBD_NORMAL; - return KEY_SHIFT_ARROW_RIGHT; - case '5': - state->kbd_state = KBD_NORMAL; - return KEY_CTRL_ARROW_RIGHT; - /* Other modifier states? */ - default: - return c; - } - case 'D': - switch (state->kbd_esc_buf) { - case '2': - state->kbd_state = KBD_NORMAL; - return KEY_SHIFT_ARROW_LEFT; - case '5': - state->kbd_state = KBD_NORMAL; - return KEY_CTRL_ARROW_LEFT; - /* Other modifier states? */ - default: - return c; - } - case ';': - /* We don't produce multiple-argument escapes ourself, but - * we should handle them anyway because other terminals - * definitely do make them... */ - state->kbd_state = KBD_ESC_B; - return KEY_NONE; - default: - return c; - } +#define KEY_SCANCODE_NUM_1 0x4f +#define KEY_SCANCODE_NUM_2 0x50 +#define KEY_SCANCODE_NUM_3 0x51 +#define KEY_SCANCODE_NUM_4 0x4B +#define KEY_SCANCODE_NUM_5 0x4C +#define KEY_SCANCODE_NUM_6 0x4D +#define KEY_SCANCODE_NUM_7 0x47 +#define KEY_SCANCODE_NUM_8 0x48 +#define KEY_SCANCODE_NUM_9 0x49 +#define KEY_SCANCODE_NUM_0 0x52 +#define KEY_SCANCODE_NUM_DOT 0x53 +#define KEY_SCANCODE_NUM_MIN 0x4a +#define KEY_SCANCODE_NUM_ADD 0x4e - default: - return KEY_BAD_STATE; - } +#define KEY_SCANCODE_NUM_LK 0x45 +#define KEY_SCANCODE_SCROLL 0x46 - return KEY_BAD_STATE; -} int kbd_scancode(key_event_state_t * state, unsigned char c, key_event_t * event) { /* Convert scancodes to a series of keys */ @@ -315,16 +179,11 @@ int kbd_scancode(key_event_state_t * state, unsigned char c, key_event_t * event if (!state->kbd_s_state) { if (c == 0xE0) { state->kbd_s_state = 1; - /* Literally nothing */ return 0; } - if (c & KEY_UP_MASK) { - c ^= KEY_UP_MASK; - event->action = KEY_ACTION_UP; - } else { - event->action = KEY_ACTION_DOWN; - } + event->action = (c & KEY_UP_MASK) ? KEY_ACTION_UP : KEY_ACTION_DOWN; + c &= 0x7F; int down = (event->action == KEY_ACTION_DOWN); switch (key_method[c]) { @@ -346,89 +205,89 @@ int kbd_scancode(key_event_state_t * state, unsigned char c, key_event_t * event event->key = state->k_shift ? kbd_us_l2[c] : kbd_us[c]; } } - break; + return 1; case spec: switch (c) { case 0x01: event->key = '\033'; event->keycode = KEY_ESCAPE; - break; + return 1; case 0x1D: state->k_ctrl = down; state->kl_ctrl = down; event->keycode = KEY_LEFT_CTRL; SET_UNSET(event->modifiers, KEY_MOD_LEFT_CTRL, down); - break; + return 1; case 0x2A: state->k_shift = down; state->kl_shift = down; event->keycode = KEY_LEFT_SHIFT; SET_UNSET(event->modifiers, KEY_MOD_LEFT_SHIFT, down); - break; + return 1; case 0x36: state->k_shift = down; state->kr_shift = down; event->keycode = KEY_RIGHT_SHIFT; SET_UNSET(event->modifiers, KEY_MOD_RIGHT_SHIFT, down); - break; + return 1; case 0x38: state->k_alt = down; state->kl_alt = down; event->keycode = KEY_LEFT_ALT; SET_UNSET(event->modifiers, KEY_MOD_LEFT_ALT, down); - break; + return 1; case KEY_SCANCODE_NUM_0: event->keycode = KEY_NUM_0; event->key = '0'; - break; + return 1; case KEY_SCANCODE_NUM_1: event->keycode = KEY_NUM_1; event->key = '1'; - break; + return 1; case KEY_SCANCODE_NUM_2: event->keycode = KEY_NUM_2; event->key = '2'; - break; + return 1; case KEY_SCANCODE_NUM_3: event->keycode = KEY_NUM_3; event->key = '3'; - break; + return 1; case KEY_SCANCODE_NUM_4: event->keycode = KEY_NUM_4; event->key = '4'; - break; + return 1; case KEY_SCANCODE_NUM_5: event->keycode = KEY_NUM_5; event->key = '5'; - break; + return 1; case KEY_SCANCODE_NUM_6: event->keycode = KEY_NUM_6; event->key = '6'; - break; + return 1; case KEY_SCANCODE_NUM_7: event->keycode = KEY_NUM_7; event->key = '7'; - break; + return 1; case KEY_SCANCODE_NUM_8: event->keycode = KEY_NUM_8; event->key = '8'; - break; + return 1; case KEY_SCANCODE_NUM_9: event->keycode = KEY_NUM_9; event->key = '9'; - break; + return 1; case KEY_SCANCODE_NUM_DOT: event->keycode = KEY_NUM_DOT; event->key = '.'; - break; + return 1; case KEY_SCANCODE_NUM_MIN: event->keycode = KEY_NUM_MINUS; event->key = '-'; - break; + return 1; case KEY_SCANCODE_NUM_ADD: event->keycode = KEY_NUM_PLUS; event->key = '+'; - break; + return 1; default: break; } @@ -437,59 +296,50 @@ int kbd_scancode(key_event_state_t * state, unsigned char c, key_event_t * event switch (c) { case KEY_SCANCODE_F1: event->keycode = KEY_F1; - break; + return 1; case KEY_SCANCODE_F2: event->keycode = KEY_F2; - break; + return 1; case KEY_SCANCODE_F3: event->keycode = KEY_F3; - break; + return 1; case KEY_SCANCODE_F4: event->keycode = KEY_F4; - break; + return 1; case KEY_SCANCODE_F5: event->keycode = KEY_F5; - break; + return 1; case KEY_SCANCODE_F6: event->keycode = KEY_F6; - break; + return 1; case KEY_SCANCODE_F7: event->keycode = KEY_F7; - break; + return 1; case KEY_SCANCODE_F8: event->keycode = KEY_F8; - break; + return 1; case KEY_SCANCODE_F9: event->keycode = KEY_F9; - break; + return 1; case KEY_SCANCODE_F10: event->keycode = KEY_F10; - break; + return 1; case KEY_SCANCODE_F11: event->keycode = KEY_F11; - break; + return 1; case KEY_SCANCODE_F12: event->keycode = KEY_F12; - break; + return 1; } break; default: break; } - - if (event->key) { - return down; - } - return 0; } else if (state->kbd_s_state == 1) { - - if (c & KEY_UP_MASK) { - c ^= KEY_UP_MASK; - event->action = KEY_ACTION_UP; - } else { - event->action = KEY_ACTION_DOWN; - } + state->kbd_s_state = 0; + event->action = (c & KEY_UP_MASK) ? KEY_ACTION_UP : KEY_ACTION_DOWN; + c &= 0x7F; int down = (event->action == KEY_ACTION_DOWN); switch (c) { @@ -498,69 +348,72 @@ int kbd_scancode(key_event_state_t * state, unsigned char c, key_event_t * event state->kl_super = down; event->keycode = KEY_LEFT_SUPER; SET_UNSET(event->modifiers, KEY_MOD_LEFT_SUPER, down); - break; + return 1; case 0x5C: state->k_super = down; state->kr_super = down; event->keycode = KEY_RIGHT_SUPER; SET_UNSET(event->modifiers, KEY_MOD_RIGHT_SUPER, down); - break; + return 1; case 0x1D: state->kr_ctrl = down; state->k_ctrl = down; event->keycode = KEY_RIGHT_CTRL; SET_UNSET(event->modifiers, KEY_MOD_RIGHT_CTRL, down); - break; + return 1; case 0x38: state->kr_alt = down; state->k_alt = down; event->keycode = KEY_RIGHT_ALT; SET_UNSET(event->modifiers, KEY_MOD_RIGHT_ALT, down); - break; + return 1; case 0x48: event->keycode = KEY_ARROW_UP; - break; + return 1; case 0x4D: event->keycode = KEY_ARROW_RIGHT; - break; + return 1; case 0x47: event->keycode = KEY_HOME; - break; + return 1; case 0x49: event->keycode = KEY_PAGE_UP; - break; + return 1; case 0x4B: event->keycode = KEY_ARROW_LEFT; - break; + return 1; case 0x4F: event->keycode = KEY_END; - break; + return 1; case 0x50: event->keycode = KEY_ARROW_DOWN; - break; + return 1; case 0x51: event->keycode = KEY_PAGE_DOWN; - break; + return 1; case 0x52: event->keycode = KEY_INSERT; - break; + return 1; case 0x53: event->keycode = KEY_DEL; - break; + return 1; case 0x35: event->keycode = KEY_NUM_DIV; event->key = '/'; - break; + return 1; case 0x1C: event->keycode = KEY_NUM_ENTER; event->key = '\n'; - break; + return 1; + case 0x2a: + event->keycode = KEY_PRINT_SCREEN; + return 1; + case 0x5D: + event->keycode = KEY_APP; + return 1; default: break; } - - state->kbd_s_state = 0; - return 0; } return 0; }