diff --git a/common/scancode.h b/common/scancode.h index b13c40cd..939a4589 100644 --- a/common/scancode.h +++ b/common/scancode.h @@ -60,6 +60,53 @@ enum { + /** + * Scancodes for keys used in the code + */ + SCANCODE_LSHIFT_KEY = 0x2a, + SCANCODE_RSHIFT_KEY = 0x36, + SCANCODE_CAPS_KEY = 0x3a, + SCANCODE_NUMLOCK_KEY = 0x45, + SCANCODE_SCROLL_KEY = 0x46, // Scroll lock + SCANCODE_LALT_KEY = 0x38, + SCANCODE_RALT_KEY = 0x138, + + SCANCODE_ESC_KEY = 0x01, + SCANCODE_BACKSPACE_KEY = 0x0e, + SCANCODE_ENTER_KEY = 0x1c, + SCANCODE_TAB_KEY = 0x0f, + + SCANCODE_KP_ENTER_KEY = 0x11c, + SCANCODE_KP_DEL_KEY = 0x53, + SCANCODE_KP_1_KEY = 0x4f, + SCANCODE_KP_2_KEY = 0x50, + SCANCODE_KP_4_KEY = 0x4b, + SCANCODE_KP_6_KEY = 0x4d, + SCANCODE_KP_7_KEY = 0x47, + SCANCODE_KP_8_KEY = 0x48, + + SCANCODE_LEFT_ARROW_KEY = 0x14b, + SCANCODE_RIGHT_ARROW_KEY = 0x14d, + SCANCODE_UP_ARROW_KEY = 0x148, + SCANCODE_DOWN_ARROW_KEY = 0x150, + + SCANCODE_HOME_KEY = 0x147, + SCANCODE_DEL_KEY = 0x153, + SCANCODE_END_KEY = 0x14f, + /** + * Scancode indexes for some of the above + */ + SCANCODE_INDEX_LSHIFT_KEY = SCANCODE_LSHIFT_KEY, + SCANCODE_INDEX_RSHIFT_KEY = SCANCODE_RSHIFT_KEY, + SCANCODE_INDEX_RALT_KEY = (SCANCODE_RALT_KEY & 0x7f) | 0x80, + + /** + * Keys affected by numlock + * (this is not the whole keypad) + */ + SCANCODE_MIN_NUMLOCK = SCANCODE_KP_7_KEY, + SCANCODE_MAX_NUMLOCK = SCANCODE_KP_DEL_KEY, + /** * Maximum value returned by scancode_to_index() */ diff --git a/common/xrdp_constants.h b/common/xrdp_constants.h index e1720178..200990e0 100644 --- a/common/xrdp_constants.h +++ b/common/xrdp_constants.h @@ -285,12 +285,6 @@ #define FASTPATH_MAX_PACKET_SIZE 0x3fff -#define XR_RDP_SCAN_LSHIFT 42 -#define XR_RDP_SCAN_ALT 56 -// scancodes affected by numlock -#define XR_RDP_SCAN_MIN_NUMLOCK 71 // KP7 -#define XR_RDP_SCAN_MAX_NUMLOCK 83 // KPDL - // Since we're not guaranteed to have pixman, copy these directives. #define XRDP_PIXMAN_TYPE_ARGB 2 #define XRDP_PIXMAN_TYPE_ABGR 3 diff --git a/genkeymap/genkeymap.c b/genkeymap/genkeymap.c index e4a06290..b4322983 100644 --- a/genkeymap/genkeymap.c +++ b/genkeymap/genkeymap.c @@ -64,7 +64,7 @@ // Scancodes affected by numlock #define IS_KEYPAD_SCANCODE(s) \ - ((s) >= XR_RDP_SCAN_MIN_NUMLOCK && (s) <= XR_RDP_SCAN_MAX_NUMLOCK) + ((s) >= SCANCODE_MIN_NUMLOCK && (s) <= SCANCODE_MAX_NUMLOCK) #define MAX_COMMENTS 10 diff --git a/xrdp/lang.c b/xrdp/lang.c index ef2fab1e..4ef23e56 100644 --- a/xrdp/lang.c +++ b/xrdp/lang.c @@ -45,13 +45,11 @@ get_key_info_from_kbd_event(int keyboard_flags, int key_code, int *keys, { struct xrdp_key_info *rv; int shift; - int altgr_scancode; int altgr; int index; - shift = keys[42] || keys[54]; - altgr_scancode = SCANCODE_FROM_KBD_EVENT(56, KBDFLAGS_EXTENDED); - altgr = keys[scancode_to_index(altgr_scancode)]; /* right alt */ + shift = keys[SCANCODE_INDEX_LSHIFT_KEY] || keys[SCANCODE_INDEX_RSHIFT_KEY]; + altgr = keys[SCANCODE_INDEX_RALT_KEY]; /* right alt */ rv = 0; index = scancode_to_index(SCANCODE_FROM_KBD_EVENT(key_code, keyboard_flags)); @@ -60,10 +58,10 @@ get_key_info_from_kbd_event(int keyboard_flags, int key_code, int *keys, // scancode_to_index() guarantees to map numlock scancodes // to the same index values. if (num_lock && - index >= XR_RDP_SCAN_MIN_NUMLOCK && - index <= XR_RDP_SCAN_MAX_NUMLOCK) + index >= SCANCODE_MIN_NUMLOCK && + index <= SCANCODE_MAX_NUMLOCK) { - rv = &(keymap->keys_numlock[index - XR_RDP_SCAN_MIN_NUMLOCK]); + rv = &(keymap->keys_numlock[index - SCANCODE_MIN_NUMLOCK]); } else if (shift && caps_lock && altgr) { @@ -391,19 +389,19 @@ km_load_file(const char *filename, struct xrdp_keymap *keymap) keymap->keys_shiftcapslockaltgr); /* The numlock map is much smaller and offset by - * XR_RDP_SCAN_MAX_NUMLOCK. Read the section into a temporary + * SCANCODE_MIX_NUMLOCK. Read the section into a temporary * area and copy it over */ struct xrdp_key_info keys_numlock[SCANCODE_MAX_INDEX + 1]; int i; - for (i = XR_RDP_SCAN_MIN_NUMLOCK; i <= XR_RDP_SCAN_MAX_NUMLOCK; ++i) + for (i = SCANCODE_MIN_NUMLOCK; i <= SCANCODE_MAX_NUMLOCK; ++i) { keys_numlock[i].sym = 0; keys_numlock[i].chr = 0; } km_read_section(tfile, "numlock", keys_numlock); - for (i = XR_RDP_SCAN_MIN_NUMLOCK; i <= XR_RDP_SCAN_MAX_NUMLOCK; ++i) + for (i = SCANCODE_MIN_NUMLOCK; i <= SCANCODE_MAX_NUMLOCK; ++i) { - keymap->keys_numlock[i - XR_RDP_SCAN_MIN_NUMLOCK] = keys_numlock[i]; + keymap->keys_numlock[i - SCANCODE_MIN_NUMLOCK] = keys_numlock[i]; } toml_free(tfile); diff --git a/xrdp/xrdp_bitmap.c b/xrdp/xrdp_bitmap.c index cf397f4d..34ef7cab 100644 --- a/xrdp/xrdp_bitmap.c +++ b/xrdp/xrdp_bitmap.c @@ -1024,9 +1024,6 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg, { int n; int i; - int shift; - int ext; - int scan_code; struct xrdp_bitmap *b; struct xrdp_bitmap *focus_out_control; @@ -1044,12 +1041,13 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg, { if (msg == WM_KEYDOWN) { - scan_code = param1 % 128; + int scan_code = SCANCODE_FROM_KBD_EVENT(param1, param2); + int shift = self->wm->keys[SCANCODE_INDEX_LSHIFT_KEY] || + self->wm->keys[SCANCODE_INDEX_RSHIFT_KEY]; - if (scan_code == 15) /* tab */ + if (scan_code == SCANCODE_TAB_KEY) /* tab */ { /* move to next tab stop */ - shift = self->wm->keys[42] || self->wm->keys[54]; i = -1; if (self->child_list != 0) @@ -1114,7 +1112,8 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg, } } } - else if (scan_code == 28) /* enter */ + else if (scan_code == SCANCODE_ENTER_KEY || + scan_code == SCANCODE_KP_ENTER_KEY) { if (self->default_button != 0) { @@ -1126,7 +1125,7 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg, } } } - else if (scan_code == 1) /* esc */ + else if (scan_code == SCANCODE_ESC_KEY) { if (self->esc_button != 0) { @@ -1149,12 +1148,13 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg, { if (msg == WM_KEYDOWN) { - scan_code = param1 % 128; - ext = param2 & 0x0100; - + int scan_code = SCANCODE_FROM_KBD_EVENT(param1, param2); + int num_lock = self->wm->num_lock; /* left or up arrow */ - if ((scan_code == 75 || scan_code == 72) && - (ext || self->wm->num_lock == 0)) + if ((scan_code == SCANCODE_LEFT_ARROW_KEY) || + (scan_code == SCANCODE_UP_ARROW_KEY) || + (!num_lock && (scan_code == SCANCODE_KP_4_KEY)) || + (!num_lock && (scan_code == SCANCODE_KP_8_KEY))) { if (self->edit_pos > 0) { @@ -1163,8 +1163,10 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg, } } /* right or down arrow */ - else if ((scan_code == 77 || scan_code == 80) && - (ext || self->wm->num_lock == 0)) + else if ((scan_code == SCANCODE_RIGHT_ARROW_KEY) || + (scan_code == SCANCODE_DOWN_ARROW_KEY) || + (!num_lock && (scan_code == SCANCODE_KP_6_KEY)) || + (!num_lock && (scan_code == SCANCODE_KP_2_KEY))) { if (self->edit_pos < (int)utf8_char_count(self->caption1)) { @@ -1173,7 +1175,7 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg, } } /* backspace */ - else if (scan_code == 14) + else if (scan_code == SCANCODE_BACKSPACE_KEY) { n = utf8_char_count(self->caption1); @@ -1188,8 +1190,9 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg, } } /* delete */ - else if (scan_code == 83 && - (ext || self->wm->num_lock == 0)) + else if ((scan_code == SCANCODE_DEL_KEY) || + (!num_lock && (scan_code == SCANCODE_KP_DEL_KEY))) + { n = utf8_char_count(self->caption1); @@ -1203,8 +1206,8 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg, } } /* end */ - else if (scan_code == 79 && - (ext || self->wm->num_lock == 0)) + else if ((scan_code == SCANCODE_END_KEY) || + (!num_lock && (scan_code == SCANCODE_KP_1_KEY))) { n = utf8_char_count(self->caption1); @@ -1215,8 +1218,8 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg, } } /* home */ - else if ((scan_code == 71) && - (ext || (self->wm->num_lock == 0))) + else if ((scan_code == SCANCODE_HOME_KEY) || + (!num_lock && (scan_code == SCANCODE_KP_7_KEY))) { if (self->edit_pos > 0) { @@ -1227,7 +1230,7 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg, else { char32_t c = get_char_from_kbd_event - (param2, scan_code, self->wm->keys, self->wm->caps_lock, + (param2, param1, self->wm->keys, self->wm->caps_lock, self->wm->num_lock, self->wm->scroll_lock, &(self->wm->keymap)); // Add a printing character to the string. If successful, @@ -1245,12 +1248,14 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg, { if (msg == WM_KEYDOWN) { - scan_code = param1 % 128; - ext = param2 & 0x0100; + int scan_code = SCANCODE_FROM_KBD_EVENT(param1, param2); + int num_lock = self->wm->num_lock; /* left or up arrow */ - if (((scan_code == 75) || (scan_code == 72)) && - (ext || (self->wm->num_lock == 0))) + if ((scan_code == SCANCODE_LEFT_ARROW_KEY) || + (scan_code == SCANCODE_UP_ARROW_KEY) || + (!num_lock && (scan_code == SCANCODE_KP_4_KEY)) || + (!num_lock && (scan_code == SCANCODE_KP_8_KEY))) { if (self->item_index > 0) { @@ -1264,8 +1269,10 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg, } } /* right or down arrow */ - else if ((scan_code == 77 || scan_code == 80) && - (ext || self->wm->num_lock == 0)) + else if ((scan_code == SCANCODE_RIGHT_ARROW_KEY) || + (scan_code == SCANCODE_DOWN_ARROW_KEY) || + (!num_lock && (scan_code == SCANCODE_KP_6_KEY)) || + (!num_lock && (scan_code == SCANCODE_KP_2_KEY))) { if ((self->item_index + 1) < self->string_list->count) { diff --git a/xrdp/xrdp_types.h b/xrdp/xrdp_types.h index a13b09bd..f49d78e6 100644 --- a/xrdp/xrdp_types.h +++ b/xrdp/xrdp_types.h @@ -465,8 +465,8 @@ struct xrdp_keymap struct xrdp_key_info keys_shiftcapslock[SCANCODE_MAX_INDEX + 1]; struct xrdp_key_info keys_shiftcapslockaltgr[SCANCODE_MAX_INDEX + 1]; // NumLock is restricted to a much smaller set of keys - struct xrdp_key_info keys_numlock[XR_RDP_SCAN_MAX_NUMLOCK - - XR_RDP_SCAN_MIN_NUMLOCK + 1]; + struct xrdp_key_info keys_numlock[SCANCODE_MAX_NUMLOCK - + SCANCODE_MIN_NUMLOCK + 1]; }; /* the window manager */ diff --git a/xrdp/xrdp_wm.c b/xrdp/xrdp_wm.c index 4dd327cf..ae6efedc 100644 --- a/xrdp/xrdp_wm.c +++ b/xrdp/xrdp_wm.c @@ -1606,15 +1606,15 @@ xrdp_wm_key(struct xrdp_wm *self, int keyboard_flags, int key_code) self->keys[sindex] = 1; msg = WM_KEYDOWN; - switch (key_code) + switch (scancode) { - case 58: + case SCANCODE_CAPS_KEY: self->caps_lock = !self->caps_lock; break; /* caps lock */ - case 69: + case SCANCODE_NUMLOCK_KEY: self->num_lock = !self->num_lock; break; /* num lock */ - case 70: + case SCANCODE_SCROLL_KEY: self->scroll_lock = !self->scroll_lock; break; /* scroll lock */ } @@ -1733,7 +1733,7 @@ get_unicode_character(struct xrdp_wm *self, int device_flags, char16_t c16) * Takes a scancode index and fakes a keyboard event to represent it * @param self module pointer * @param device_flags default flags to pass in for the keyboard event. - * @param scancode index + * @param index scancode index * * Some of the device_flags are overridden by the scancode derived from the * scancode index @@ -1742,7 +1742,7 @@ static void fake_kbd_event_from_scancode_index(struct xrdp_wm *self, int device_flags, int index) { - int scancode = scancode_from_index(index); + unsigned short scancode = scancode_from_index(index); int key_code = SCANCODE_TO_KBD_EVENT_KEY_CODE(scancode); device_flags &= ~(KBDFLAGS_EXTENDED | KBDFLAGS_EXTENDED1); @@ -1781,11 +1781,13 @@ xrdp_wm_key_unicode(struct xrdp_wm *self, int device_flags, char32_t c16) if (device_flags & KBDFLAGS_RELEASE) { fake_kbd_event_from_scancode_index(self, device_flags, index); - xrdp_wm_key(self, device_flags, XR_RDP_SCAN_LSHIFT); + fake_kbd_event_from_scancode_index(self, device_flags, + SCANCODE_INDEX_LSHIFT_KEY); } else { - xrdp_wm_key(self, device_flags, XR_RDP_SCAN_LSHIFT); + fake_kbd_event_from_scancode_index(self, device_flags, + SCANCODE_INDEX_LSHIFT_KEY); fake_kbd_event_from_scancode_index(self, device_flags, index); } return 0; @@ -1799,11 +1801,13 @@ xrdp_wm_key_unicode(struct xrdp_wm *self, int device_flags, char32_t c16) if (device_flags & KBDFLAGS_RELEASE) { fake_kbd_event_from_scancode_index(self, device_flags, index); - xrdp_wm_key(self, device_flags, XR_RDP_SCAN_ALT); + fake_kbd_event_from_scancode_index(self, device_flags, + SCANCODE_INDEX_RALT_KEY); } else { - xrdp_wm_key(self, device_flags, XR_RDP_SCAN_ALT); + fake_kbd_event_from_scancode_index(self, device_flags, + SCANCODE_INDEX_RALT_KEY); fake_kbd_event_from_scancode_index(self, device_flags, index); } return 0; @@ -1817,14 +1821,17 @@ xrdp_wm_key_unicode(struct xrdp_wm *self, int device_flags, char32_t c16) if (device_flags & KBDFLAGS_RELEASE) { fake_kbd_event_from_scancode_index(self, device_flags, index); - xrdp_wm_key(self, device_flags | KBDFLAGS_EXTENDED, XR_RDP_SCAN_ALT); - xrdp_wm_key(self, device_flags, XR_RDP_SCAN_LSHIFT); + fake_kbd_event_from_scancode_index(self, device_flags, + SCANCODE_INDEX_RALT_KEY); + fake_kbd_event_from_scancode_index(self, device_flags, + SCANCODE_INDEX_LSHIFT_KEY); } else { - xrdp_wm_key(self, device_flags, XR_RDP_SCAN_LSHIFT); - xrdp_wm_key(self, device_flags | KBDFLAGS_EXTENDED, - XR_RDP_SCAN_ALT); + fake_kbd_event_from_scancode_index(self, device_flags, + SCANCODE_INDEX_LSHIFT_KEY); + fake_kbd_event_from_scancode_index(self, device_flags, + SCANCODE_INDEX_RALT_KEY); fake_kbd_event_from_scancode_index(self, device_flags, index); } return 0;