From 17ad375abae7f5b7ef9471aab62845796c66caa7 Mon Sep 17 00:00:00 2001 From: matt335672 <30179339+matt335672@users.noreply.github.com> Date: Mon, 18 Nov 2024 15:49:37 +0000 Subject: [PATCH] Allow a programmable backspace key for the login screen The login screen uses hardcoded scancode values to identify particular keys. This is changed for the backspace key for Colemak support, as the caps lock key has been re-purposed as a backspace key. We now identify a backspace request by looking at the keysym for the key. --- xrdp/lang.c | 40 ---------------------------------------- xrdp/xrdp.h | 8 -------- xrdp/xrdp_bitmap.c | 22 +++++++++++++++------- 3 files changed, 15 insertions(+), 55 deletions(-) diff --git a/xrdp/lang.c b/xrdp/lang.c index 95ca2f92..23db4a12 100644 --- a/xrdp/lang.c +++ b/xrdp/lang.c @@ -118,46 +118,6 @@ get_key_info_from_kbd_event(int keyboard_flags, int key_code, int *keys, return rv; } -/*****************************************************************************/ -int -get_keysym_from_kbd_event(int keyboard_flags, int key_code, int *keys, - int caps_lock, int num_lock, int scroll_lock, - struct xrdp_keymap *keymap) -{ - struct xrdp_key_info *ki; - - ki = get_key_info_from_kbd_event(keyboard_flags, key_code, keys, - caps_lock, num_lock, scroll_lock, - keymap); - - if (ki == 0) - { - return 0; - } - - return ki->sym; -} - -/*****************************************************************************/ -char32_t -get_char_from_kbd_event(int keyboard_flags, int key_code, int *keys, - int caps_lock, int num_lock, int scroll_lock, - struct xrdp_keymap *keymap) -{ - struct xrdp_key_info *ki; - - ki = get_key_info_from_kbd_event(keyboard_flags, key_code, keys, - caps_lock, num_lock, scroll_lock, - keymap); - - if (ki == 0) - { - return 0; - } - - return ki->chr; -} - /*****************************************************************************/ /** * Converts a table key to a scancode index value diff --git a/xrdp/xrdp.h b/xrdp/xrdp.h index c40557eb..072df9cc 100644 --- a/xrdp/xrdp.h +++ b/xrdp/xrdp.h @@ -442,14 +442,6 @@ get_key_info_from_kbd_event(int keyboard_flags, int key_code, int *keys, int caps_lock, int num_lock, int scroll_lock, struct xrdp_keymap *keymap); int -get_keysym_from_kbd_event(int keyboard_flags, int key_code, int *keys, - int caps_lock, int num_lock, int scroll_lock, - struct xrdp_keymap *keymap); -char32_t -get_char_from_kbd_event(int keyboard_flags, int key_code, int *keys, - int caps_lock, int num_lock, int scroll_lock, - struct xrdp_keymap *keymap); -int get_keymaps(int keylayout, struct xrdp_keymap *keymap); int diff --git a/xrdp/xrdp_bitmap.c b/xrdp/xrdp_bitmap.c index 34ef7cab..005d935d 100644 --- a/xrdp/xrdp_bitmap.c +++ b/xrdp/xrdp_bitmap.c @@ -29,7 +29,10 @@ #include "log.h" #include "string_calls.h" - +// For a very few key functions, using the keysym is preferable to the +// raw scancode. Here are defines to avoid pulling an X11 dependency +// into the xrdp:- +#define XK_BackSpace 0xff08 static const unsigned int g_crc_table[256] = @@ -1150,6 +1153,13 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg, { int scan_code = SCANCODE_FROM_KBD_EVENT(param1, param2); int num_lock = self->wm->num_lock; + /* We may need a keysym or a printable character for the key */ + struct xrdp_key_info *ki = get_key_info_from_kbd_event + (param2, param1, self->wm->keys, + self->wm->caps_lock, + self->wm->num_lock, self->wm->scroll_lock, + &(self->wm->keymap)); + /* left or up arrow */ if ((scan_code == SCANCODE_LEFT_ARROW_KEY) || (scan_code == SCANCODE_UP_ARROW_KEY) || @@ -1174,8 +1184,9 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg, xrdp_bitmap_invalidate(self, 0); } } - /* backspace */ - else if (scan_code == SCANCODE_BACKSPACE_KEY) + /* backspace. Test keysym rather than scan code, so keys + * other than SCANCODE_BACKSPACE_KEY can generate backspace */ + else if (ki != NULL && ki->sym == XK_BackSpace) { n = utf8_char_count(self->caption1); @@ -1229,10 +1240,7 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg, } else { - char32_t c = get_char_from_kbd_event - (param2, param1, self->wm->keys, self->wm->caps_lock, - self->wm->num_lock, self->wm->scroll_lock, - &(self->wm->keymap)); + char32_t c = (ki == NULL) ? 0 : ki->chr; // Add a printing character to the string. If successful, // bump the edit position and re-display the string if (c >= ' ' &&