28#include "keyboard_x11.h"
29#include "xkb_layout_ids.h"
32static BOOL parse_xkb_rule_names(
char* xkb_rule,
unsigned long num_bytes,
char** layout,
50 for (
size_t i = 0, index = 0; i < num_bytes; i++, index++)
52 char* ptr = xkb_rule + i;
53 i += strnlen(ptr, num_bytes - i);
64 char* delimiter = strchr(ptr,
',');
73 char* delimiter = strchr(ptr,
',');
88static DWORD kbd_layout_id_from_x_property(wLog* log, Display* display, Window root,
96 unsigned long items = 0;
97 unsigned long unread_items = 0;
100 Atom
property = XInternAtom(display, property_name, False);
101 if (property == None)
104 if (LogDynAndXGetWindowProperty(log, display, root, property, 0, 1024, False, XA_STRING, &type,
105 &item_size, &items, &unread_items,
106 (
unsigned char**)&rule) != Success)
109 if (type != XA_STRING || item_size != 8 || unread_items != 0)
115 parse_xkb_rule_names(rule, items, &layout, &variant);
117 DEBUG_X11(
"%s layout: %s, variant: %s", property_name, layout, variant);
118 layout_id = xf_find_keyboard_layout_in_xorg_rules(layout, variant);
125int xf_detect_keyboard_layout_from_xkb(wLog* log, DWORD* keyboardLayoutId)
127 Display* display = XOpenDisplay(NULL);
132 Window root = DefaultRootWindow(display);
137 DWORD
id = kbd_layout_id_from_x_property(log, display, root,
"_XKB_RULES_NAMES_BACKUP");
140 id = kbd_layout_id_from_x_property(log, display, root,
"_XKB_RULES_NAMES");
143 *keyboardLayoutId = id;
145 LogDynAndXCloseDisplay(log, display);