📄 xkeymap.c
字号:
return True; break; } return False;}key_translationxkeymap_translate_key(uint32 keysym, unsigned int keycode, unsigned int state){ key_translation tr = { 0, 0 }; tr = keymap[keysym & KEYMAP_MASK]; if (tr.modifiers & MapInhibitMask) { DEBUG_KBD(("Inhibiting key\n")); tr.scancode = 0; return tr; } if (tr.modifiers & MapLocalStateMask) { /* The modifiers to send for this key should be obtained from the local state. Currently, only shift is implemented. */ if (state & ShiftMask) { tr.modifiers = MapLeftShiftMask; } } if (((remote_modifier_state & MapLeftCtrlMask) || (remote_modifier_state & MapRightCtrlMask)) && get_key_state(state, XK_Caps_Lock)) { DEBUG_KBD(("CapsLock + Ctrl pressed, releasing LeftShift\n")); tr.modifiers ^= MapLeftShiftMask; } if (tr.scancode != 0) { DEBUG_KBD(("Found key translation, scancode=0x%x, modifiers=0x%x\n", tr.scancode, tr.modifiers)); return tr; } if (keymap_loaded) 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)) { tr.scancode = keycode - min_keycode; /* The modifiers to send for this key should be obtained from the local state. Currently, only shift is implemented. */ if (state & ShiftMask) { tr.modifiers = MapLeftShiftMask; } DEBUG_KBD(("Sending guessed scancode 0x%x\n", tr.scancode)); } else { DEBUG_KBD(("No good guess for keycode 0x%x found\n", keycode)); } return tr;}uint16xkeymap_translate_button(unsigned int button){ switch (button) { case Button1: /* left */ return MOUSE_FLAG_BUTTON1; case Button2: /* middle */ return MOUSE_FLAG_BUTTON3; case Button3: /* right */ return MOUSE_FLAG_BUTTON2; case Button4: /* wheel up */ return MOUSE_FLAG_BUTTON4; case Button5: /* wheel down */ return MOUSE_FLAG_BUTTON5; } return 0;}char *get_ksname(uint32 keysym){ char *ksname = NULL; if (keysym == NoSymbol) ksname = "NoSymbol"; else if (!(ksname = XKeysymToString(keysym))) ksname = "(no name)"; return ksname;}static BOOLis_modifier(uint8 scancode){ switch (scancode) { case SCANCODE_CHAR_LSHIFT: case SCANCODE_CHAR_RSHIFT: case SCANCODE_CHAR_LCTRL: case SCANCODE_CHAR_RCTRL: case SCANCODE_CHAR_LALT: case SCANCODE_CHAR_RALT: case SCANCODE_CHAR_LWIN: case SCANCODE_CHAR_RWIN: case SCANCODE_CHAR_NUMLOCK: return True; default: break; } return False;}voidsave_remote_modifiers(uint8 scancode){ if (is_modifier(scancode)) return; saved_remote_modifier_state = remote_modifier_state;}voidrestore_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);}voidensure_remote_modifiers(uint32 ev_time, key_translation tr){ /* If this key is a modifier, do nothing */ 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)) { /* The remote modifier state is not correct */ if (MASK_HAS_BITS(tr.modifiers, MapLeftShiftMask)) { /* Needs left shift. Send down. */ rdp_send_scancode(ev_time, RDP_KEYPRESS, SCANCODE_CHAR_LSHIFT); } else if (MASK_HAS_BITS(tr.modifiers, MapRightShiftMask)) { /* Needs right shift. Send down. */ rdp_send_scancode(ev_time, RDP_KEYPRESS, SCANCODE_CHAR_RSHIFT); } else { /* Should not use this modifier. Send up for shift currently pressed. */ if (MASK_HAS_BITS(remote_modifier_state, MapLeftShiftMask)) /* Left shift is down */ rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LSHIFT); else /* Right shift is down */ rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_RSHIFT); } } /* AltGr */ if (MASK_HAS_BITS(tr.modifiers, MapAltGrMask) != MASK_HAS_BITS(remote_modifier_state, MapAltGrMask)) { /* The remote modifier state is not correct */ if (MASK_HAS_BITS(tr.modifiers, MapAltGrMask)) { /* Needs this modifier. Send down. */ rdp_send_scancode(ev_time, RDP_KEYPRESS, SCANCODE_CHAR_RALT); } else { /* Should not use this modifier. Send up. */ rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_RALT); } }}unsigned intread_keyboard_state(){#ifdef RDP2VNC return 0;#else unsigned int state; Window wdummy; int dummy; XQueryPointer(g_display, g_wnd, &wdummy, &wdummy, &dummy, &dummy, &dummy, &dummy, &state); return state;#endif}uint16ui_get_numlock_state(unsigned int state){ uint16 numlock_state = 0; if (get_key_state(state, XK_Num_Lock)) numlock_state = KBD_FLAG_NUMLOCK; return numlock_state;}voidreset_modifier_keys(){ unsigned int state = read_keyboard_state(); /* reset keys */ uint32 ev_time; ev_time = time(NULL); if (MASK_HAS_BITS(remote_modifier_state, MapLeftShiftMask) && !get_key_state(state, XK_Shift_L)) rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LSHIFT); if (MASK_HAS_BITS(remote_modifier_state, MapRightShiftMask) && !get_key_state(state, XK_Shift_R)) rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_RSHIFT); if (MASK_HAS_BITS(remote_modifier_state, MapLeftCtrlMask) && !get_key_state(state, XK_Control_L)) rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LCTRL); if (MASK_HAS_BITS(remote_modifier_state, MapRightCtrlMask) && !get_key_state(state, XK_Control_R)) rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_RCTRL); if (MASK_HAS_BITS(remote_modifier_state, MapLeftAltMask) && !get_key_state(state, XK_Alt_L)) rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LALT); if (MASK_HAS_BITS(remote_modifier_state, MapRightAltMask) && !get_key_state(state, XK_Alt_R) && !get_key_state(state, XK_Mode_switch) && !get_key_state(state, XK_ISO_Level3_Shift)) rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_RALT); reset_winkey(ev_time); if (g_numlock_sync) rdp_send_input(ev_time, RDP_INPUT_SYNCHRONIZE, 0, ui_get_numlock_state(state), 0);}static voidupdate_modifier_state(uint8 scancode, BOOL pressed){#ifdef WITH_DEBUG_KBD uint16 old_modifier_state; old_modifier_state = remote_modifier_state;#endif switch (scancode) { case SCANCODE_CHAR_LSHIFT: MASK_CHANGE_BIT(remote_modifier_state, MapLeftShiftMask, pressed); break; case SCANCODE_CHAR_RSHIFT: MASK_CHANGE_BIT(remote_modifier_state, MapRightShiftMask, pressed); break; case SCANCODE_CHAR_LCTRL: MASK_CHANGE_BIT(remote_modifier_state, MapLeftCtrlMask, pressed); break; case SCANCODE_CHAR_RCTRL: MASK_CHANGE_BIT(remote_modifier_state, MapRightCtrlMask, pressed); break; case SCANCODE_CHAR_LALT: MASK_CHANGE_BIT(remote_modifier_state, MapLeftAltMask, pressed); break; case SCANCODE_CHAR_RALT: MASK_CHANGE_BIT(remote_modifier_state, MapRightAltMask, pressed); break; case SCANCODE_CHAR_LWIN: MASK_CHANGE_BIT(remote_modifier_state, MapLeftWinMask, pressed); break; 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 if (old_modifier_state != remote_modifier_state) { DEBUG_KBD(("Before updating modifier_state:0x%x, pressed=0x%x\n", old_modifier_state, pressed)); DEBUG_KBD(("After updating modifier_state:0x%x\n", remote_modifier_state)); }#endif}/* Send keyboard input */voidrdp_send_scancode(uint32 time, uint16 flags, uint8 scancode){ update_modifier_state(scancode, !(flags & RDP_KEYRELEASE)); if (scancode & SCANCODE_EXTENDED) { DEBUG_KBD(("Sending extended scancode=0x%x, flags=0x%x\n", scancode & ~SCANCODE_EXTENDED, flags)); rdp_send_input(time, RDP_INPUT_SCANCODE, flags | KBD_FLAG_EXT, scancode & ~SCANCODE_EXTENDED, 0); } else { DEBUG_KBD(("Sending scancode=0x%x, flags=0x%x\n", scancode, flags)); rdp_send_input(time, RDP_INPUT_SCANCODE, flags, scancode, 0); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -