int freerdp_detect_keyboard(DWORD* keyboardLayoutId) { #ifdef WITH_X11 if (*keyboardLayoutId == 0) freerdp_detect_keyboard_layout_from_xkb(keyboardLayoutId); #endif if (*keyboardLayoutId == 0) freerdp_detect_keyboard_layout_from_system_locale(keyboardLayoutId); if (*keyboardLayoutId == 0) *keyboardLayoutId = ENGLISH_UNITED_STATES; return 0; }
uint32 freerdp_keyboard_init_x11(uint32 keyboardLayoutId) { uint32 vkcode; uint32 keycode; uint32 keycode_to_vkcode[256]; memset(keycode_to_vkcode, 0, sizeof(keycode_to_vkcode)); memset(X11_KEYCODE_TO_RDP_SCANCODE, 0, sizeof(X11_KEYCODE_TO_RDP_SCANCODE)); memset(RDP_SCANCODE_TO_X11_KEYCODE, 0, sizeof(RDP_SCANCODE_TO_X11_KEYCODE)); if (keyboardLayoutId == 0) { keyboardLayoutId = freerdp_detect_keyboard_layout_from_system_locale(); DEBUG_KBD("using keyboard layout: %X", keyboardLayoutId); } if (keyboardLayoutId == 0) { keyboardLayoutId = 0x0409; DEBUG_KBD("using default keyboard layout: %X", keyboardLayoutId); } #ifdef __APPLE__ /* Apple X11 breaks XKB detection */ freerdp_keyboard_load_map(keycode_to_vkcode, "macosx(macosx)"); #endif for (keycode = 0; keycode < 256; keycode++) { vkcode = keycode_to_vkcode[keycode]; if (!(vkcode > 0 && vkcode < 256)) continue; X11_KEYCODE_TO_RDP_SCANCODE[keycode].code = VIRTUAL_KEY_CODE_TO_RDP_SCANCODE_TABLE[vkcode].code; X11_KEYCODE_TO_RDP_SCANCODE[keycode].extended = VIRTUAL_KEY_CODE_TO_RDP_SCANCODE_TABLE[vkcode].extended; if (X11_KEYCODE_TO_RDP_SCANCODE[keycode].extended) RDP_SCANCODE_TO_X11_KEYCODE[VIRTUAL_KEY_CODE_TO_RDP_SCANCODE_TABLE[vkcode].code][1] = keycode; else RDP_SCANCODE_TO_X11_KEYCODE[VIRTUAL_KEY_CODE_TO_RDP_SCANCODE_TABLE[vkcode].code][0] = keycode; } return keyboardLayoutId; }
UINT32 freerdp_detect_keyboard(UINT32 keyboardLayoutID) { if (keyboardLayoutID != 0) DEBUG_KBD("keyboard layout configuration: %X", keyboardLayoutID); if (keyboardLayoutID == 0) { keyboardLayoutID = freerdp_detect_keyboard_layout_from_system_locale(); DEBUG_KBD("detect_keyboard_layout_from_locale: %X", keyboardLayoutID); } if (keyboardLayoutID == 0) { keyboardLayoutID = 0x0409; DEBUG_KBD("using default keyboard layout: %X", keyboardLayoutID); } return keyboardLayoutID; }
uint32 freerdp_keyboard_init_x11(uint32 keyboardLayoutId) { char* keymap; uint32 vkcode; uint32 keycode; uint32 scancode; boolean extended; char* xkb_layout; char* xkb_variant; uint32 keycode_to_vkcode[256]; memset(keycode_to_vkcode, 0, sizeof(keycode_to_vkcode)); memset(X11_KEYCODE_TO_RDP_SCANCODE, 0, sizeof(X11_KEYCODE_TO_RDP_SCANCODE)); memset(RDP_SCANCODE_TO_X11_KEYCODE, 0, sizeof(RDP_SCANCODE_TO_X11_KEYCODE)); if (keyboardLayoutId == 0) { keyboardLayoutId = freerdp_detect_keyboard_layout_from_system_locale(); DEBUG_KBD("using keyboard layout: %X", keyboardLayoutId); } if (keyboardLayoutId == 0) { keyboardLayoutId = 0x0409; DEBUG_KBD("using default keyboard layout: %X", keyboardLayoutId); } #ifdef __APPLE__ /* Apple X11 breaks XKB detection */ freerdp_keyboard_load_map(keycode_to_vkcode, "macosx(macosx)"); #else if (keyboardLayoutId == 0) keyboardLayoutId = freerdp_detect_keyboard_layout_from_xkb(&xkb_layout, &xkb_variant); keymap = freerdp_detect_keymap_from_xkb(); if (keymap != NULL) freerdp_keyboard_load_maps(keycode_to_vkcode, keymap); #endif for (keycode = 0; keycode < 256; keycode++) { vkcode = keycode_to_vkcode[keycode]; if (!(vkcode > 0 && vkcode < 256)) continue; scancode = VIRTUAL_KEY_CODE_TO_RDP_SCANCODE_TABLE[vkcode]; extended = VIRTUAL_KEY_CODE_TO_DEFAULT_RDP_SCANCODE_TABLE[vkcode].extended; X11_KEYCODE_TO_RDP_SCANCODE[keycode].code = scancode; X11_KEYCODE_TO_RDP_SCANCODE[keycode].extended = extended; if (extended) RDP_SCANCODE_TO_X11_KEYCODE[scancode][1] = keycode; else RDP_SCANCODE_TO_X11_KEYCODE[scancode][0] = keycode; } return keyboardLayoutId; }