-
- switch (kbd_state.state)
- {
- case KBD_STATE_KWAIT:
- if (scancode == 0xf0) { // release code
- kbd_state.state = KBD_STATE_KRELEASED;
- } else if (scancode == 0xe0) {
- kbd_state.state = KBD_STATE_KSPECIAL;
- kbd_state.translation_table = scancode_set2_ex;
- } else {
- key = kbd_state.translation_table[scancode];
- kbd_buffer_key_event(key, scancode, KBD_KEY_FPRESSED);
- }
- break;
- case KBD_STATE_KSPECIAL:
- if (scancode == 0xf0) { //release code
- kbd_state.state = KBD_STATE_KRELEASED;
- } else {
+
+ switch (kbd_state.state) {
+ case KBD_STATE_KWAIT:
+ if (scancode == 0xf0) { // release code
+ kbd_state.state = KBD_STATE_KRELEASED;
+ } else if (scancode == 0xe0) {
+ kbd_state.state = KBD_STATE_KSPECIAL;
+ kbd_state.translation_table = scancode_set2_ex;
+ } else {
+ key = kbd_state.translation_table[scancode];
+ kbd_buffer_key_event(key, scancode, KBD_KEY_FPRESSED);
+ }
+ break;
+ case KBD_STATE_KSPECIAL:
+ if (scancode == 0x12) {
+ kbd_state.state = KBD_STATE_E012;
+ } else if (scancode == 0xf0) { // release code
+ kbd_state.state = KBD_STATE_KRELEASED_E0;
+ } else {
+ key = kbd_state.translation_table[scancode];
+ kbd_buffer_key_event(key, scancode, KBD_KEY_FPRESSED);
+
+ kbd_state.state = KBD_STATE_KWAIT;
+ kbd_state.translation_table = scancode_set2;
+ }
+ break;
+ // handle the '0xE0, 0x12, 0xE0, xx' sequence
+ case KBD_STATE_E012:
+ if (scancode == 0xe0) {
+ kbd_state.state = KBD_STATE_KSPECIAL;
+ kbd_state.translation_table = scancode_set2_ex;
+ }
+ break;
+ case KBD_STATE_KRELEASED_E0:
+ if (scancode == 0x12) {
+ goto escape_release;
+ }
+ // fall through
+ case KBD_STATE_KRELEASED: