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
This commit is contained in:
Peter Åstrand 2003-08-31 19:45:56 +00:00
parent c7d3d5aad5
commit bd0f3e2568

View File

@ -40,6 +40,7 @@ extern char keymapname[16];
extern int keylayout; extern int keylayout;
extern int g_win_button_size; extern int g_win_button_size;
extern BOOL g_enable_compose; extern BOOL g_enable_compose;
extern BOOL g_use_rdp5;
static BOOL keymap_loaded; static BOOL keymap_loaded;
static key_translation keymap[KEYMAP_SIZE]; static key_translation keymap[KEYMAP_SIZE];
@ -239,6 +240,44 @@ xkeymap_init(void)
XDisplayKeycodes(g_display, &min_keycode, (int *) &max_keycode); 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 /* Handles, for example, multi-scancode keypresses (which is not
possible via keymap-files) */ possible via keymap-files) */
BOOL 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_Meta_L: /* Windows keys */
case XK_Super_L: case XK_Super_L:
case XK_Hyper_L: case XK_Hyper_L:
send_winkey(ev_time, pressed, True);
return True;
case XK_Meta_R: case XK_Meta_R:
case XK_Super_R: case XK_Super_R:
case XK_Hyper_R: case XK_Hyper_R:
if (pressed) send_winkey(ev_time, pressed, False);
{
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);
}
return True; return True;
case XK_space: case XK_space: