2 |
rdesktop: A Remote Desktop Protocol client. |
rdesktop: A Remote Desktop Protocol client. |
3 |
User interface services - X keyboard mapping |
User interface services - X keyboard mapping |
4 |
|
|
5 |
Copyright (C) Matthew Chapman 1999-2002 |
Copyright (C) Matthew Chapman 1999-2005 |
6 |
Copyright (C) Peter Astrand <peter@cendio.se> 2003 |
Copyright (C) Peter Astrand <peter@cendio.se> 2003 |
7 |
|
|
8 |
This program is free software; you can redistribute it and/or modify |
This program is free software; you can redistribute it and/or modify |
40 |
extern Display *g_display; |
extern Display *g_display; |
41 |
extern Window g_wnd; |
extern Window g_wnd; |
42 |
extern char keymapname[16]; |
extern char keymapname[16]; |
43 |
extern int keylayout; |
extern int g_keylayout; |
44 |
extern int g_win_button_size; |
extern int g_win_button_size; |
45 |
extern BOOL g_enable_compose; |
extern BOOL g_enable_compose; |
46 |
extern BOOL g_use_rdp5; |
extern BOOL g_use_rdp5; |
137 |
/* map */ |
/* map */ |
138 |
if (strncmp(line, "map ", 4) == 0) |
if (strncmp(line, "map ", 4) == 0) |
139 |
{ |
{ |
140 |
keylayout = strtol(line + 4, NULL, 16); |
g_keylayout = strtol(line + 4, NULL, 16); |
141 |
DEBUG_KBD(("Keylayout 0x%x\n", keylayout)); |
DEBUG_KBD(("Keylayout 0x%x\n", g_keylayout)); |
142 |
continue; |
continue; |
143 |
} |
} |
144 |
|
|
372 |
&& (get_key_state(state, XK_Alt_L) || get_key_state(state, XK_Alt_R))) |
&& (get_key_state(state, XK_Alt_L) || get_key_state(state, XK_Alt_R))) |
373 |
return True; |
return True; |
374 |
break; |
break; |
375 |
|
|
376 |
case XK_Num_Lock: |
case XK_Num_Lock: |
377 |
/* FIXME: We might want to do RDP_INPUT_SYNCHRONIZE here, if g_numlock_sync */ |
/* Synchronize on key release */ |
378 |
if (!g_numlock_sync) |
if (g_numlock_sync && !pressed) |
379 |
/* Inhibit */ |
rdp_send_input(0, RDP_INPUT_SYNCHRONIZE, 0, |
380 |
return True; |
ui_get_numlock_state(read_keyboard_state()), 0); |
381 |
|
|
382 |
|
/* Inhibit */ |
383 |
|
return True; |
384 |
break; |
break; |
385 |
|
|
386 |
} |
} |
412 |
} |
} |
413 |
} |
} |
414 |
|
|
415 |
|
if ((tr.modifiers & MapLeftShiftMask) && ((remote_modifier_state & MapLeftCtrlMask) |
416 |
|
|| (remote_modifier_state & MapRightCtrlMask)) |
417 |
|
&& get_key_state(state, XK_Caps_Lock)) |
418 |
|
{ |
419 |
|
DEBUG_KBD(("CapsLock + Ctrl pressed, releasing LeftShift\n")); |
420 |
|
tr.modifiers ^= MapLeftShiftMask; |
421 |
|
} |
422 |
|
|
423 |
if (tr.scancode != 0) |
if (tr.scancode != 0) |
424 |
{ |
{ |
425 |
DEBUG_KBD(("Found key translation, scancode=0x%x, modifiers=0x%x\n", |
DEBUG_KBD(("Found key translation, scancode=0x%x, modifiers=0x%x\n", |
614 |
unsigned int |
unsigned int |
615 |
read_keyboard_state() |
read_keyboard_state() |
616 |
{ |
{ |
617 |
|
#ifdef RDP2VNC |
618 |
|
return 0; |
619 |
|
#else |
620 |
unsigned int state; |
unsigned int state; |
621 |
Window wdummy; |
Window wdummy; |
622 |
int dummy; |
int dummy; |
623 |
|
|
624 |
XQueryPointer(g_display, g_wnd, &wdummy, &wdummy, &dummy, &dummy, &dummy, &dummy, &state); |
XQueryPointer(g_display, g_wnd, &wdummy, &wdummy, &dummy, &dummy, &dummy, &dummy, &state); |
625 |
return state; |
return state; |
626 |
|
#endif |
627 |
} |
} |
628 |
|
|
629 |
|
|
668 |
rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LALT); |
rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LALT); |
669 |
|
|
670 |
if (MASK_HAS_BITS(remote_modifier_state, MapRightAltMask) && |
if (MASK_HAS_BITS(remote_modifier_state, MapRightAltMask) && |
671 |
!get_key_state(state, XK_Alt_R) && !get_key_state(state, XK_Mode_switch)) |
!get_key_state(state, XK_Alt_R) && !get_key_state(state, XK_Mode_switch) |
672 |
|
&& !get_key_state(state, XK_ISO_Level3_Shift)) |
673 |
rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_RALT); |
rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_RALT); |
674 |
|
|
675 |
reset_winkey(ev_time); |
reset_winkey(ev_time); |