static void input_send_fastpath_keyboard_pause_event(rdpInput* input) { /* In ancient days, pause-down without control sent E1 1D 45 E1 9D C5, * and pause-up sent nothing. However, reverse engineering mstsc shows * it sending the following sequence: */ wStream* s; rdpRdp* rdp = input->context->rdp; const BYTE keyDownEvent = FASTPATH_INPUT_EVENT_SCANCODE << 5; const BYTE keyUpEvent = (FASTPATH_INPUT_EVENT_SCANCODE << 5) | FASTPATH_INPUT_KBDFLAGS_RELEASE; s = fastpath_input_pdu_init_header(rdp->fastpath); /* Control down (0x1D) */ Stream_Write_UINT8(s, keyDownEvent | FASTPATH_INPUT_KBDFLAGS_PREFIX_E1); Stream_Write_UINT8(s, RDP_SCANCODE_CODE(RDP_SCANCODE_LCONTROL)); /* Numlock down (0x45) */ Stream_Write_UINT8(s, keyDownEvent); Stream_Write_UINT8(s, RDP_SCANCODE_CODE(RDP_SCANCODE_NUMLOCK)); /* Control up (0x1D) */ Stream_Write_UINT8(s, keyUpEvent | FASTPATH_INPUT_KBDFLAGS_PREFIX_E1); Stream_Write_UINT8(s, RDP_SCANCODE_CODE(RDP_SCANCODE_LCONTROL)); /* Numlock down (0x45) */ Stream_Write_UINT8(s, keyUpEvent); Stream_Write_UINT8(s, RDP_SCANCODE_CODE(RDP_SCANCODE_NUMLOCK)); fastpath_send_multiple_input_pdu(rdp->fastpath, s, 4); }
BOOL input_send_keyboard_pause_event(rdpInput* input) { /* In ancient days, pause-down without control sent E1 1D 45 E1 9D C5, * and pause-up sent nothing. However, reverse engineering mstsc shows * it sending the following sequence: */ /* Control down (0x1D) */ if (!input_send_keyboard_event(input, 0, RDP_SCANCODE_CODE(RDP_SCANCODE_LCONTROL))) return FALSE; /* Numlock down (0x45) */ if (!input_send_keyboard_event(input, 0, RDP_SCANCODE_CODE(RDP_SCANCODE_NUMLOCK))) return FALSE; /* Control up (0x1D) */ if (!input_send_keyboard_event(input, KBD_FLAGS_RELEASE, RDP_SCANCODE_CODE(RDP_SCANCODE_LCONTROL))) return FALSE; /* Numlock up (0x45) */ return input_send_keyboard_event(input, KBD_FLAGS_RELEASE, RDP_SCANCODE_CODE(RDP_SCANCODE_NUMLOCK)); }
void freerdp_input_send_keyboard_event_ex(rdpInput* input, BOOL down, UINT32 rdp_scancode) { freerdp_input_send_keyboard_event(input, (RDP_SCANCODE_EXTENDED(rdp_scancode) ? KBD_FLAGS_EXTENDED : 0) | ((down) ? KBD_FLAGS_DOWN : KBD_FLAGS_RELEASE), RDP_SCANCODE_CODE(rdp_scancode)); }
RDP_SCANCODE freerdp_keyboard_get_rdp_scancode_from_x11_keycode(UINT32 keycode) { DEBUG_KBD("x11 keycode: %02X -> rdp code: %02X%s", keycode, RDP_SCANCODE_CODE(X11_KEYCODE_TO_RDP_SCANCODE[keycode]), RDP_SCANCODE_EXTENDED(X11_KEYCODE_TO_RDP_SCANCODE[keycode]) ? " extended" : ""); return X11_KEYCODE_TO_RDP_SCANCODE[keycode]; }
DWORD freerdp_keyboard_get_rdp_scancode_from_x11_keycode(DWORD keycode) { DEBUG_KBD("x11 keycode: %02"PRIX32" -> rdp code: %02"PRIX8"%s", keycode, RDP_SCANCODE_CODE(X11_KEYCODE_TO_VIRTUAL_SCANCODE[keycode]), RDP_SCANCODE_EXTENDED(X11_KEYCODE_TO_VIRTUAL_SCANCODE[keycode]) ? " extended" : ""); return X11_KEYCODE_TO_VIRTUAL_SCANCODE[keycode]; }
UINT32 freerdp_keyboard_init(UINT32 keyboardLayoutId) { UINT32 keycode; #ifdef WITH_X11 #ifdef WITH_XKBFILE keyboardLayoutId = freerdp_keyboard_init_xkbfile(keyboardLayoutId, X11_KEYCODE_TO_RDP_SCANCODE); #else keyboardLayoutId = freerdp_keyboard_init_x11(keyboardLayoutId, X11_KEYCODE_TO_RDP_SCANCODE); #endif #endif keyboardLayoutId = freerdp_detect_keyboard(keyboardLayoutId); memset(RDP_SCANCODE_TO_X11_KEYCODE, 0, sizeof(RDP_SCANCODE_TO_X11_KEYCODE)); for (keycode=0; keycode < ARRAY_SIZE(RDP_SCANCODE_TO_X11_KEYCODE); keycode++) RDP_SCANCODE_TO_X11_KEYCODE [RDP_SCANCODE_CODE(X11_KEYCODE_TO_RDP_SCANCODE[keycode])] [RDP_SCANCODE_EXTENDED(X11_KEYCODE_TO_RDP_SCANCODE[keycode]) ? 1 : 0] = keycode; return keyboardLayoutId; }
DWORD freerdp_keyboard_init(DWORD keyboardLayoutId) { DWORD keycode; #if defined(__APPLE__) || defined(WITH_X11) int status = -1; #endif #ifdef __APPLE__ if (status < 0) status = freerdp_keyboard_init_apple(&keyboardLayoutId, X11_KEYCODE_TO_VIRTUAL_SCANCODE); #endif #ifdef WITH_X11 #ifdef WITH_XKBFILE if (status < 0) status = freerdp_keyboard_init_xkbfile(&keyboardLayoutId, X11_KEYCODE_TO_VIRTUAL_SCANCODE); #endif if (status < 0) status = freerdp_keyboard_init_x11_evdev(&keyboardLayoutId, X11_KEYCODE_TO_VIRTUAL_SCANCODE); #endif freerdp_detect_keyboard(&keyboardLayoutId); ZeroMemory(VIRTUAL_SCANCODE_TO_X11_KEYCODE, sizeof(VIRTUAL_SCANCODE_TO_X11_KEYCODE)); for (keycode = 0; keycode < ARRAYSIZE(VIRTUAL_SCANCODE_TO_X11_KEYCODE); keycode++) { VIRTUAL_SCANCODE_TO_X11_KEYCODE [RDP_SCANCODE_CODE(X11_KEYCODE_TO_VIRTUAL_SCANCODE[keycode])] [RDP_SCANCODE_EXTENDED(X11_KEYCODE_TO_VIRTUAL_SCANCODE[keycode]) ? 1 : 0] = keycode; } return keyboardLayoutId; }