Kbd fix: Shift was always reset after press

git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/trunk/rdesktop@469 423420c4-83ab-492f-b58f-81f9feb106b5
This commit is contained in:
Peter Åstrand 2003-09-15 08:03:30 +00:00
parent 96d03ad363
commit d9019bc77b
3 changed files with 39 additions and 25 deletions

View File

@ -116,8 +116,8 @@ BOOL handle_special_keys(uint32 keysym, unsigned int state, uint32 ev_time, BOOL
key_translation xkeymap_translate_key(uint32 keysym, unsigned int keycode, unsigned int state); key_translation xkeymap_translate_key(uint32 keysym, unsigned int keycode, unsigned int state);
uint16 xkeymap_translate_button(unsigned int button); uint16 xkeymap_translate_button(unsigned int button);
char *get_ksname(uint32 keysym); char *get_ksname(uint32 keysym);
void save_remote_modifiers(void); void save_remote_modifiers(uint8 scancode);
void restore_remote_modifiers(uint32 ev_time); void restore_remote_modifiers(uint32 ev_time, uint8 scancode);
void ensure_remote_modifiers(uint32 ev_time, key_translation tr); void ensure_remote_modifiers(uint32 ev_time, key_translation tr);
void reset_modifier_keys(unsigned int state); void reset_modifier_keys(unsigned int state);
void rdp_send_scancode(uint32 time, uint16 flags, uint8 scancode); void rdp_send_scancode(uint32 time, uint16 flags, uint8 scancode);

View File

@ -450,27 +450,10 @@ get_ksname(uint32 keysym)
return ksname; return ksname;
} }
void static BOOL
save_remote_modifiers() is_modifier(uint8 scancode)
{ {
saved_remote_modifier_state = remote_modifier_state; switch (scancode)
}
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)
{
/* If this key is a modifier, do nothing */
switch (tr.scancode)
{ {
case SCANCODE_CHAR_LSHIFT: case SCANCODE_CHAR_LSHIFT:
case SCANCODE_CHAR_RSHIFT: case SCANCODE_CHAR_RSHIFT:
@ -481,10 +464,41 @@ ensure_remote_modifiers(uint32 ev_time, key_translation tr)
case SCANCODE_CHAR_LWIN: case SCANCODE_CHAR_LWIN:
case SCANCODE_CHAR_RWIN: case SCANCODE_CHAR_RWIN:
case SCANCODE_CHAR_NUMLOCK: case SCANCODE_CHAR_NUMLOCK:
return; return True;
default: default:
break; break;
} }
return False;
}
void
save_remote_modifiers(uint8 scancode)
{
if (is_modifier(scancode))
return;
saved_remote_modifier_state = remote_modifier_state;
}
void
restore_remote_modifiers(uint32 ev_time, uint8 scancode)
{
key_translation dummy;
if (is_modifier(scancode))
return;
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)
{
/* If this key is a modifier, do nothing */
if (is_modifier(tr.scancode))
return;
/* NumLock */ /* NumLock */
if (MASK_HAS_BITS(tr.modifiers, MapNumLockMask) if (MASK_HAS_BITS(tr.modifiers, MapNumLockMask)

4
xwin.c
View File

@ -833,10 +833,10 @@ xwin_process_events(void)
if (tr.scancode == 0) if (tr.scancode == 0)
break; break;
save_remote_modifiers(); save_remote_modifiers(tr.scancode);
ensure_remote_modifiers(ev_time, tr); ensure_remote_modifiers(ev_time, tr);
rdp_send_scancode(ev_time, RDP_KEYPRESS, tr.scancode); rdp_send_scancode(ev_time, RDP_KEYPRESS, tr.scancode);
restore_remote_modifiers(ev_time); restore_remote_modifiers(ev_time, tr.scancode);
break; break;