From bd0f3e2568c1495e54308a2e3457d811213ce638 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C3=85strand?= Date: Sun, 31 Aug 2003 19:45:56 +0000 Subject: [PATCH] Support for (real) Windows keys, if running RDP5. git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/trunk/rdesktop@451 423420c4-83ab-492f-b58f-81f9feb106b5 --- xkeymap.c | 53 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/xkeymap.c b/xkeymap.c index 2aba48c..d3d3abc 100644 --- a/xkeymap.c +++ b/xkeymap.c @@ -40,6 +40,7 @@ extern char keymapname[16]; extern int keylayout; extern int g_win_button_size; extern BOOL g_enable_compose; +extern BOOL g_use_rdp5; static BOOL keymap_loaded; static key_translation keymap[KEYMAP_SIZE]; @@ -239,6 +240,44 @@ xkeymap_init(void) XDisplayKeycodes(g_display, &min_keycode, (int *) &max_keycode); } +static void +send_winkey(uint32 ev_time, BOOL pressed, BOOL leftkey) +{ + uint8 winkey; + + if (leftkey) + winkey = SCANCODE_CHAR_LWIN; + else + winkey = SCANCODE_CHAR_RWIN; + + if (pressed) + { + if (g_use_rdp5) + { + rdp_send_scancode(ev_time, RDP_KEYPRESS, winkey); + } + else + { + /* RDP4 doesn't support winkey. Fake with Ctrl-Esc */ + rdp_send_scancode(ev_time, RDP_KEYPRESS, SCANCODE_CHAR_LCTRL); + rdp_send_scancode(ev_time, RDP_KEYPRESS, SCANCODE_CHAR_ESC); + } + } + else + { + /* key released */ + if (g_use_rdp5) + { + rdp_send_scancode(ev_time, RDP_KEYRELEASE, winkey); + } + else + { + rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_ESC); + rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LCTRL); + } + } +} + /* Handles, for example, multi-scancode keypresses (which is not possible via keymap-files) */ BOOL @@ -299,19 +338,13 @@ handle_special_keys(uint32 keysym, unsigned int state, uint32 ev_time, BOOL pres case XK_Meta_L: /* Windows keys */ case XK_Super_L: case XK_Hyper_L: + send_winkey(ev_time, pressed, True); + return True; + case XK_Meta_R: case XK_Super_R: case XK_Hyper_R: - if (pressed) - { - rdp_send_scancode(ev_time, RDP_KEYPRESS, SCANCODE_CHAR_LCTRL); - rdp_send_scancode(ev_time, RDP_KEYPRESS, SCANCODE_CHAR_ESC); - } - else - { - rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_ESC); - rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LCTRL); - } + send_winkey(ev_time, pressed, False); return True; case XK_space: