Support for Windows keys (via Ctrl-Esc)

git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/trunk/rdesktop@117 423420c4-83ab-492f-b58f-81f9feb106b5
This commit is contained in:
Peter Åstrand 2002-09-11 11:45:20 +00:00
parent 1ab4d012e6
commit 7e7527302c
4 changed files with 57 additions and 19 deletions

View File

@ -8,14 +8,17 @@ Alt_L 0x38
Control_R 0x9d Control_R 0x9d
Control_L 0x1d Control_L 0x1d
# Translate Meta, Super and Hyper to Windows key # Translate Meta, Super and Hyper to Windows key. It seems the RDP
# For some reason, these are broken, it seems. # protocol does not support these keys directly. Therefore, rdesktop
Meta_L 0xdb # currently translates the keysyms listed below into Ctrl-Esc. This is
Super_L 0xdb # hard-coded, since multiple scancodes cannot be specified in keymap
Hyper_L 0xdb # files.
Meta_R 0xdc #Meta_L 0xdb
Super_R 0xdc #Super_L 0xdb
Hyper_R 0xdc #Hyper_L 0xdb
#Meta_R 0xdc
#Super_R 0xdc
#Hyper_R 0xdc
# Translate Menu to the Windows Application key. # Translate Menu to the Windows Application key.
# This one does not work either. # This one does not work either.

View File

@ -72,13 +72,14 @@ void tcp_disconnect(void);
/* xkeymap.c */ /* xkeymap.c */
void xkeymap_init1(void); void xkeymap_init1(void);
void xkeymap_init2(void); void xkeymap_init2(void);
BOOL handle_special_keys(KeySym keysym, uint32 ev_time, BOOL pressed);
key_translation xkeymap_translate_key(KeySym keysym, unsigned int keycode, unsigned int state); key_translation xkeymap_translate_key(KeySym keysym, unsigned int keycode, unsigned int state);
uint16 xkeymap_translate_button(unsigned int button); uint16 xkeymap_translate_button(unsigned int button);
char *get_ksname(KeySym keysym); char *get_ksname(KeySym keysym);
BOOL inhibit_key(KeySym keysym);
void ensure_remote_modifiers(uint32 ev_time, key_translation tr); void ensure_remote_modifiers(uint32 ev_time, key_translation tr);
void rdp_send_scancode(uint32 time, uint16 flags, uint16 scancode); void rdp_send_scancode(uint32 time, uint16 flags, uint16 scancode);
/* xwin.c */ /* xwin.c */
BOOL get_key_state(int keysym);
BOOL ui_init(void); BOOL ui_init(void);
void ui_create_window_obj(int xpos, int ypos, int width, int height, int valuemask); void ui_create_window_obj(int xpos, int ypos, int width, int height, int valuemask);
BOOL ui_create_window(void); BOOL ui_create_window(void);

View File

@ -228,6 +228,43 @@ xkeymap_init2(void)
XDisplayKeycodes(display, &min_keycode, (int *) &max_keycode); XDisplayKeycodes(display, &min_keycode, (int *) &max_keycode);
} }
/* Handles, for example, multi-scancode keypresses (which is not
possible via keymap-files) */
BOOL
handle_special_keys(KeySym keysym, uint32 ev_time, BOOL pressed)
{
switch (keysym)
{
case XK_Break: /* toggle full screen */
if (pressed && (get_key_state(XK_Alt_L) || get_key_state(XK_Alt_R)))
{
toggle_fullscreen();
return True;
}
break;
case XK_Meta_L: /* Windows keys */
case XK_Super_L:
case XK_Hyper_L:
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);
}
return True;
break;
}
return False;
}
key_translation key_translation
xkeymap_translate_key(KeySym keysym, unsigned int keycode, unsigned int state) xkeymap_translate_key(KeySym keysym, unsigned int keycode, unsigned int state)

17
xwin.c
View File

@ -247,7 +247,7 @@ close_inputmethod(void)
} }
} }
static BOOL BOOL
get_key_state(int keysym) get_key_state(int keysym)
{ {
int keysymMask = 0, modifierpos, key; int keysymMask = 0, modifierpos, key;
@ -574,18 +574,12 @@ xwin_process_events()
str, sizeof(str), &keysym, NULL); str, sizeof(str), &keysym, NULL);
} }
if (keysym == XK_Break) /* toggle full screen */
{
if (get_key_state(XK_Alt_L) || get_key_state(XK_Alt_R))
{
toggle_fullscreen();
break;
}
}
ksname = get_ksname(keysym); ksname = get_ksname(keysym);
DEBUG_KBD(("\nKeyPress for (keysym 0x%lx, %s)\n", keysym, ksname)); DEBUG_KBD(("\nKeyPress for (keysym 0x%lx, %s)\n", keysym, ksname));
if (handle_special_keys(keysym, ev_time, True))
break;
tr = xkeymap_translate_key(keysym, tr = xkeymap_translate_key(keysym,
xevent.xkey.keycode, xevent.xkey.state); xevent.xkey.keycode, xevent.xkey.state);
@ -604,6 +598,9 @@ xwin_process_events()
DEBUG_KBD(("\nKeyRelease for (keysym 0x%lx, %s)\n", keysym, DEBUG_KBD(("\nKeyRelease for (keysym 0x%lx, %s)\n", keysym,
ksname)); ksname));
if (handle_special_keys(keysym, ev_time, False))
break;
tr = xkeymap_translate_key(keysym, tr = xkeymap_translate_key(keysym,
xevent.xkey.keycode, xevent.xkey.state); xevent.xkey.keycode, xevent.xkey.state);