--- sourceforge.net/trunk/rdesktop/xkeymap.c 2003/11/11 14:01:31 548 +++ sourceforge.net/trunk/rdesktop/xkeymap.c 2003/12/08 15:28:24 553 @@ -44,6 +44,7 @@ extern int g_win_button_size; extern BOOL g_enable_compose; extern BOOL g_use_rdp5; +extern BOOL g_numlock_sync; static BOOL keymap_loaded; static key_translation keymap[KEYMAP_SIZE]; @@ -186,6 +187,11 @@ MASK_ADD_BITS(modifiers, MapLeftShiftMask); } + if (strstr(line_rest, "numlock")) + { + MASK_ADD_BITS(modifiers, MapNumLockMask); + } + if (strstr(line_rest, "localstate")) { MASK_ADD_BITS(modifiers, MapLocalStateMask); @@ -317,6 +323,7 @@ } /* No release sequence */ return True; + break; case XK_Pause: /* According to MS Keyboard Scan Code @@ -343,24 +350,34 @@ 0x1d, 0); } return True; + break; case XK_Meta_L: /* Windows keys */ case XK_Super_L: case XK_Hyper_L: send_winkey(ev_time, pressed, True); return True; + break; case XK_Meta_R: case XK_Super_R: case XK_Hyper_R: send_winkey(ev_time, pressed, False); return True; + break; case XK_space: /* Prevent access to the Windows system menu in single app mode */ if (g_win_button_size && (get_key_state(state, XK_Alt_L) || get_key_state(state, XK_Alt_R))) return True; + break; + case XK_Num_Lock: + /* FIXME: We might want to do RDP_INPUT_SYNCHRONIZE here, if g_numlock_sync */ + if (!g_numlock_sync) + /* Inhibit */ + return True; + break; } return False; @@ -507,6 +524,33 @@ if (is_modifier(tr.scancode)) return; + if (!g_numlock_sync) + { + /* NumLock */ + if (MASK_HAS_BITS(tr.modifiers, MapNumLockMask) + != MASK_HAS_BITS(remote_modifier_state, MapNumLockMask)) + { + /* The remote modifier state is not correct */ + uint16 new_remote_state; + + if (MASK_HAS_BITS(tr.modifiers, MapNumLockMask)) + { + DEBUG_KBD(("Remote NumLock state is incorrect, activating NumLock.\n")); + new_remote_state = KBD_FLAG_NUMLOCK; + remote_modifier_state = MapNumLockMask; + } + else + { + DEBUG_KBD(("Remote NumLock state is incorrect, deactivating NumLock.\n")); + new_remote_state = 0; + remote_modifier_state = 0; + } + + rdp_send_input(0, RDP_INPUT_SYNCHRONIZE, 0, new_remote_state, 0); + } + } + + /* Shift. Left shift and right shift are treated as equal; either is fine. */ if (MASK_HAS_BITS(tr.modifiers, MapShiftMask) != MASK_HAS_BITS(remote_modifier_state, MapShiftMask)) @@ -613,7 +657,8 @@ reset_winkey(ev_time); - rdp_send_input(ev_time, RDP_INPUT_SYNCHRONIZE, 0, ui_get_numlock_state(state), 0); + if (g_numlock_sync) + rdp_send_input(ev_time, RDP_INPUT_SYNCHRONIZE, 0, ui_get_numlock_state(state), 0); } @@ -652,6 +697,18 @@ case SCANCODE_CHAR_RWIN: MASK_CHANGE_BIT(remote_modifier_state, MapRightWinMask, pressed); break; + case SCANCODE_CHAR_NUMLOCK: + /* KeyReleases for NumLocks are sent immediately. Toggle the + modifier state only on Keypress */ + if (pressed && !g_numlock_sync) + { + BOOL newNumLockState; + newNumLockState = + (MASK_HAS_BITS + (remote_modifier_state, MapNumLockMask) == False); + MASK_CHANGE_BIT(remote_modifier_state, + MapNumLockMask, newNumLockState); + } } #ifdef WITH_DEBUG_KBD