--- sourceforge.net/trunk/rdesktop/xkeymap.c 2003/05/19 21:36:33 376 +++ sourceforge.net/trunk/rdesktop/xkeymap.c 2003/08/27 22:51:33 450 @@ -35,16 +35,17 @@ #define KEYMAP_MASK 0xffff #define KEYMAP_MAX_LINE_LENGTH 80 -extern Display *display; +extern Display *g_display; extern char keymapname[16]; extern int keylayout; -extern int win_button_size; -extern BOOL enable_compose; +extern int g_win_button_size; +extern BOOL g_enable_compose; static BOOL keymap_loaded; static key_translation keymap[KEYMAP_SIZE]; static int min_keycode; static uint16 remote_modifier_state = 0; +static uint16 saved_remote_modifier_state = 0; static void update_modifier_state(uint8 scancode, BOOL pressed); @@ -140,7 +141,7 @@ if (strncmp(line, "enable_compose", 15) == 0) { DEBUG_KBD(("Enabling compose handling\n")); - enable_compose = True; + g_enable_compose = True; continue; } @@ -235,7 +236,7 @@ keymap_loaded = True; } - XDisplayKeycodes(display, &min_keycode, (int *) &max_keycode); + XDisplayKeycodes(g_display, &min_keycode, (int *) &max_keycode); } /* Handles, for example, multi-scancode keypresses (which is not @@ -315,7 +316,7 @@ case XK_space: /* Prevent access to the Windows system menu in single app mode */ - if (win_button_size + if (g_win_button_size && (get_key_state(state, XK_Alt_L) || get_key_state(state, XK_Alt_R))) return True; @@ -359,7 +360,7 @@ warning("No translation for (keysym 0x%lx, %s)\n", keysym, get_ksname(keysym)); /* not in keymap, try to interpret the raw scancode */ - if (((int)keycode >= min_keycode) && (keycode <= 0x60)) + if (((int) keycode >= min_keycode) && (keycode <= 0x60)) { tr.scancode = keycode - min_keycode; @@ -414,6 +415,21 @@ return ksname; } +void +save_remote_modifiers() +{ + saved_remote_modifier_state = remote_modifier_state; +} + +void +restore_remote_modifiers(uint32 ev_time) +{ + key_translation dummy; + + dummy.scancode = 0; + dummy.modifiers = saved_remote_modifier_state; + ensure_remote_modifiers(ev_time, dummy); +} void ensure_remote_modifiers(uint32 ev_time, key_translation tr)