Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- uint32
- detectKeyboardLayoutFromXKB()
- {
- FILE* xprop;
- char* pch;
- char* beg;
- char* end;
- char* type;
- char* layout;
- char* variant;
- char buffer[1024];
- xprop = popen("xprop -root _XKB_RULES_NAMES_BACKUP", "r");
- /* Sample output for "Canadian Multilingual Standard"
- *
- * _XKB_RULES_NAMES_BACKUP(STRING) = "xorg", "pc105", "ca", "multi", ""
- * Where "xorg" is the set of rules
- * "pc105" the keyboard type
- * "ca" the keyboard layout
- * "multi" the keyboard layout variant
- */
- while(fgets(buffer, sizeof(buffer), xprop) != NULL)
- {
- if((pch = strstr(buffer, "_XKB_RULES_NAMES_BACKUP(STRING) = ")) != NULL)
- {
- /* "rules" */
- pch = strchr(&buffer[34], ','); // We assume it is xorg
- pch += 1;
- /* "type" */
- beg = strchr(pch, '"');
- beg += 1;
- end = strchr(beg, '"');
- *end = '\0';
- type = beg;
- /* "layout" */
- beg = strchr(end + 1, '"');
- beg += 1;
- end = strchr(beg, '"');
- *end = '\0';
- layout = beg;
- /* "variant" */
- beg = strchr(end + 1, '"');
- beg += 1;
- end = strchr(beg, '"');
- *end = '\0';
- variant = beg;
- }
- }
- printf("XKB type: %s layout: %s variant: %s\n", type, layout, variant);
- return 0;
- }
Add Comment
Please, Sign In to add comment