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);