28#include "keyboard_x11.h"
29#include "xkb_layout_ids.h"
31static BOOL parse_xkb_rule_names(
char* xkb_rule,
unsigned long num_bytes,
char** layout,
49 for (
size_t i = 0, index = 0; i < num_bytes; i++, index++)
51 char* ptr = xkb_rule + i;
52 i += strnlen(ptr, num_bytes - i);
63 char* delimiter = strchr(ptr,
',');
72 char* delimiter = strchr(ptr,
',');
87static DWORD kbd_layout_id_from_x_property(Display* display, Window root,
char* property_name)
94 unsigned long items = 0;
95 unsigned long unread_items = 0;
98 Atom
property = XInternAtom(display, property_name, False);
102 if (XGetWindowProperty(display, root, property, 0, 1024, False, XA_STRING, &type, &item_size,
103 &items, &unread_items, (
unsigned char**)&rule) != Success)
106 if (type != XA_STRING || item_size != 8 || unread_items != 0)
112 parse_xkb_rule_names(rule, items, &layout, &variant);
114 DEBUG_KBD(
"%s layout: %s, variant: %s", property_name, layout, variant);
115 layout_id = find_keyboard_layout_in_xorg_rules(layout, variant);
122int freerdp_detect_keyboard_layout_from_xkb(DWORD* keyboardLayoutId)
124 Display* display = XOpenDisplay(NULL);
129 Window root = DefaultRootWindow(display);
134 DWORD
id = kbd_layout_id_from_x_property(display, root,
"_XKB_RULES_NAMES_BACKUP");
137 id = kbd_layout_id_from_x_property(display, root,
"_XKB_RULES_NAMES");
140 *keyboardLayoutId = id;
142 XCloseDisplay(display);