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:
parent
1ab4d012e6
commit
7e7527302c
@ -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.
|
||||||
|
3
proto.h
3
proto.h
@ -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);
|
||||||
|
37
xkeymap.c
37
xkeymap.c
@ -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
17
xwin.c
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user