Replace magic numbers in keyboard code with defs

- All scancode definitions are moved to scancode.h
- Magic numbers are replaced where applicable with definitions
This commit is contained in:
matt335672 2024-06-19 20:47:58 +01:00
parent ef14039c62
commit 5779edd23f
7 changed files with 117 additions and 64 deletions

View File

@ -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()
*/

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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)
{

View File

@ -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 */

View File

@ -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;