27#include <X11/keysym.h>
37#define KEYMAP_MASK 0xffff
38#define KEYMAP_MAX_LINE_LENGTH 80
65 DEBUG_KBD((
"Bad keysym \"%s\" in keymap %s (ignoring)\n", keyname, mapname));
69 DEBUG_KBD((
"Adding translation, keysym=0x%x, scancode=0x%x, "
70 "modifiers=0x%x\n", (
unsigned int) keysym, scancode, modifiers));
91 chars =
strspn(rest,
" \t");
96 STRNCPY(keyname, rest, chars + 1);
102 DEBUG_KBD((
"Bad keysym \"%s\" in keymap %s (ignoring line)\n", keyname, mapname));
107 DEBUG_KBD((
"Adding sequence for keysym (0x%lx, %s) -> ", keysym, keyname));
115 chars =
strspn(rest,
" \t");
119 chars =
strcspn(rest,
" \t\0");
120 STRNCPY(keyname, rest, chars + 1);
126 DEBUG_KBD((
"Bad keysym \"%s\" in keymap %s (ignoring line)\n", keyname,
135 prev_next = &tr->
next;
138 DEBUG_KBD((
"0x%x, ", (
unsigned int) keysym));
264 unsigned int line_num = 0;
265 unsigned int line_length = 0;
274 error(
"Failed to open keymap %s\n", mapname);
291 if (
strspn(
line,
" \t\n\r\f\v") == line_length)
315 DEBUG_KBD((
"Enabling compose handling\n"));
338 This->keyboard_subtype =
340 DEBUG_KBD((
"keyboard_subtype 0x%x\n",
This->keyboard_subtype));
347 This->keyboard_functionkeys =
349 DEBUG_KBD((
"keyboard_functionkeys 0x%x\n",
This->keyboard_functionkeys));
364 error(
"Bad line %d in keymap %s\n", line_num, mapname);
374 scancode =
strtol(
p, &line_rest, 16);
380 if (
strstr(line_rest,
"altgr"))
385 if (
strstr(line_rest,
"shift"))
390 if (
strstr(line_rest,
"numlock"))
395 if (
strstr(line_rest,
"localstate"))
400 if (
strstr(line_rest,
"inhibit"))
407 if (
strstr(line_rest,
"addupper"))
411 for (
p = keyname; *
p;
p++)
427 unsigned int max_keycode;
561 if (
This->win_button_size
568 if (
This->numlock_sync && !pressed)
575 case XK_Overlay1_Enable:
625 DEBUG_KBD((
"Non-physical Shift + Ctrl pressed, releasing Shift\n"));
629 DEBUG_KBD((
"Found scancode translation, scancode=0x%x, modifiers=0x%x\n",
635 if (
This->xkeymap.keymap_loaded)
636 warning(
"No translation for (keysym 0x%lx, %s)\n", keysym,
640 if (((
int) keycode >=
This->xkeymap.min_keycode) && (keycode <= 0x60))
656 DEBUG_KBD((
"No good guess for keycode 0x%x found\n", keycode));
696 DEBUG_KBD((
"Handling sequence element, keysym=0x%x\n",
697 (
unsigned int)
ptr->seq_keysym));
701 error(
"Sequence nesting too deep\n");
741 ksname =
"(no name)";
773 This->xkeymap.saved_remote_modifier_state =
This->xkeymap.remote_modifier_state;
785 dummy.modifiers =
This->xkeymap.saved_remote_modifier_state;
796 if (!
This->numlock_sync)
807 DEBUG_KBD((
"Remote NumLock state is incorrect, activating NumLock.\n"));
813 DEBUG_KBD((
"Remote NumLock state is incorrect, deactivating NumLock.\n"));
814 new_remote_state = 0;
815 This->xkeymap.remote_modifier_state = 0;
895 return numlock_state;
934 if (
This->numlock_sync)
943 uint16 old_modifier_state;
945 old_modifier_state =
This->xkeymap.remote_modifier_state;
977 if (pressed && !
This->numlock_sync)
979 BOOL newNumLockState;
989 if (old_modifier_state !=
This->xkeymap.remote_modifier_state)
991 DEBUG_KBD((
"Before updating modifier_state:0x%x, pressed=0x%x\n",
992 old_modifier_state, pressed));
993 DEBUG_KBD((
"After updating modifier_state:0x%x\n",
This->xkeymap.remote_modifier_state));
1007 DEBUG_KBD((
"Sending extended scancode=0x%x, flags=0x%x\n",
1014 DEBUG_KBD((
"Sending scancode=0x%x, flags=0x%x\n", scancode,
flags));
int strcmp(const char *String1, const char *String2)
char * strstr(char *String1, char *String2)
UINT32 strtoul(const char *String, char **Terminator, UINT32 Base)
ACPI_SIZE strlen(const char *String)
char * strchr(const char *String, int ch)
#define MOUSE_FLAG_BUTTON5
#define MapRightShiftMask
#define MapLocalStateMask
#define MOUSE_FLAG_BUTTON1
#define MOUSE_FLAG_BUTTON2
#define MOUSE_FLAG_BUTTON4
#define MASK_REMOVE_BITS(var, mask)
#define MOUSE_FLAG_BUTTON3
#define MASK_CHANGE_BIT(var, mask, active)
#define MASK_HAS_BITS(var, mask)
#define MASK_ADD_BITS(var, mask)
void reset_modifier_keys(void)
RD_BOOL str_startswith(const char *s, const char *prefix)
char * xstrdup(const char *s)
unsigned int read_keyboard_state(void)
void ui_seamless_toggle(void)
void rdp_send_input(uint32 time, uint16 message_type, uint16 device_flags, uint16 param1, uint16 param2)
void xwin_toggle_fullscreen(void)
RD_BOOL get_key_state(unsigned int state, uint32 keysym)
#define STRNCPY(dst, src, n)
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
_Check_return_opt_ _CRTIMP char *__cdecl fgets(_Out_writes_z_(_MaxCount) char *_Buf, _In_ int _MaxCount, _Inout_ FILE *_File)
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
_Check_return_ long __cdecl strtol(_In_z_ const char *_Str, _Out_opt_ _Deref_post_z_ char **_EndPtr, _In_ int _Radix)
_Check_return_ char *__cdecl getenv(_In_z_ const char *_VarName)
static const WCHAR path1[]
static const WCHAR path2[]
static unsigned __int64 next
#define SCANCODE_CHAR_RALT
#define SCANCODE_CHAR_NUMLOCK
#define SCANCODE_EXTENDED
#define SCANCODE_CHAR_RCTRL
#define SCANCODE_CHAR_ESC
#define SCANCODE_CHAR_LALT
#define SCANCODE_CHAR_LWIN
#define SCANCODE_CHAR_LCTRL
#define SCANCODE_CHAR_LSHIFT
#define SCANCODE_CHAR_RSHIFT
#define SCANCODE_CHAR_RWIN
_Check_return_ _CRTIMP size_t __cdecl strspn(_In_z_ const char *_Str, _In_z_ const char *_Control)
_CRT_RESTORE_GCC_WARNINGS _CRT_DISABLE_GCC_WARNINGS _Check_return_ _CRTIMP _CONST_RETURN char *__cdecl strrchr(_In_z_ const char *_Str, _In_ int _Ch)
_Check_return_ _CRTIMP size_t __cdecl strcspn(_In_z_ const char *_Str, _In_z_ const char *_Control)
struct _key_translation * next
void XDisplayKeycodes(Display *display, int *min_keycode, int *max_keycode)
const char * XKeysymToString(KeySym keysym)
KeySym XStringToKeysym(const char *str)
static BOOL is_modifier(uint8 scancode)
void rdp_send_scancode(RDPCLIENT *This, uint32 time, uint16 flags, uint8 scancode)
FILE * xkeymap_open(const char *filename)
void restore_remote_modifiers(RDPCLIENT *This, uint32 ev_time, uint8 scancode)
static char * pathjoin(const char *a, const char *b)
static void update_modifier_state(RDPCLIENT *This, uint8 scancode, BOOL pressed)
#define KEYMAP_MAX_LINE_LENGTH
char * get_ksname(uint32 keysym)
void ensure_remote_modifiers(RDPCLIENT *This, uint32 ev_time, key_translation tr)
BOOL handle_special_keys(RDPCLIENT *This, uint32 keysym, unsigned int state, uint32 ev_time, BOOL pressed)
static void add_sequence(RDPCLIENT *This, char *rest, char *mapname)
void save_remote_modifiers(RDPCLIENT *This, uint8 scancode)
static BOOL xkeymap_read(RDPCLIENT *This, char *mapname)
static void send_winkey(RDPCLIENT *This, uint32 ev_time, BOOL pressed, BOOL leftkey)
static void reset_winkey(RDPCLIENT *This, uint32 ev_time)
uint16 xkeymap_translate_button(unsigned int button)
BOOL xkeymap_from_locale(RDPCLIENT *This, const char *locale)
static void free_key_translation(key_translation *ptr)
key_translation xkeymap_translate_key(RDPCLIENT *This, uint32 keysym, unsigned int keycode, unsigned int state)
void xkeymap_send_keys(RDPCLIENT *This, uint32 keysym, unsigned int keycode, unsigned int state, uint32 ev_time, BOOL pressed, uint8 nesting)
static void add_to_keymap(RDPCLIENT *This, char *keyname, uint8 scancode, uint16 modifiers, char *mapname)
uint16 ui_get_numlock_state(RDPCLIENT *This, unsigned int state)