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 xkeymap_send_keys(uint32 keysym, unsigned int keycode, unsigned int state, uint32 ev_time, RD_BOOL pressed, uint8 nesting) { key_translation tr, *ptr; // printf("send keys: %.8X keysym, keycode: %.8X, state: %.8X\n", keysym, keycode, state); tr = xkeymap_translate_key(keysym, keycode, state); if (tr.seq_keysym == 0) { /* Scancode translation */ if (tr.scancode == 0) return; save_remote_modifiers(tr.scancode); ensure_remote_modifiers(ev_time, tr); rdp_send_scancode(ev_time, pressed ? RDP_KEYPRESS : RDP_KEYRELEASE, tr.scancode); restore_remote_modifiers(ev_time, tr.scancode); return; } /* Sequence, only on key down */ if (pressed) { ptr = &tr; do { DEBUG_KBD(("Handling sequence element, keysym=0x%x\n", (unsigned int) ptr->seq_keysym)); if (nesting++ > 32) { error("Sequence nesting too deep\n"); return; } xkeymap_send_keys(ptr->seq_keysym, keycode, state, ev_time, True, nesting); xkeymap_send_keys(ptr->seq_keysym, keycode, state, ev_time, False, nesting); ptr = ptr->next; } while (ptr); } }