Guest User

Untitled

a guest
Jun 23rd, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.26 KB | None | 0 0
  1. uint32
  2. detectKeyboardLayoutFromXKB()
  3. {
  4. FILE* xprop;
  5.  
  6. char* pch;
  7. char* beg;
  8. char* end;
  9.  
  10. char* type;
  11. char* layout;
  12. char* variant;
  13.  
  14. char buffer[1024];
  15.  
  16. xprop = popen("xprop -root _XKB_RULES_NAMES_BACKUP", "r");
  17.  
  18. /* Sample output for "Canadian Multilingual Standard"
  19. *
  20. * _XKB_RULES_NAMES_BACKUP(STRING) = "xorg", "pc105", "ca", "multi", ""
  21. * Where "xorg" is the set of rules
  22. * "pc105" the keyboard type
  23. * "ca" the keyboard layout
  24. * "multi" the keyboard layout variant
  25. */
  26.  
  27. while(fgets(buffer, sizeof(buffer), xprop) != NULL)
  28. {
  29. if((pch = strstr(buffer, "_XKB_RULES_NAMES_BACKUP(STRING) = ")) != NULL)
  30. {
  31. /* "rules" */
  32. pch = strchr(&buffer[34], ','); // We assume it is xorg
  33. pch += 1;
  34.  
  35. /* "type" */
  36. beg = strchr(pch, '"');
  37. beg += 1;
  38.  
  39. end = strchr(beg, '"');
  40. *end = '\0';
  41.  
  42. type = beg;
  43.  
  44. /* "layout" */
  45. beg = strchr(end + 1, '"');
  46. beg += 1;
  47.  
  48. end = strchr(beg, '"');
  49. *end = '\0';
  50.  
  51. layout = beg;
  52.  
  53. /* "variant" */
  54. beg = strchr(end + 1, '"');
  55. beg += 1;
  56.  
  57. end = strchr(beg, '"');
  58. *end = '\0';
  59.  
  60. variant = beg;
  61. }
  62. }
  63.  
  64. printf("XKB type: %s layout: %s variant: %s\n", type, layout, variant);
  65.  
  66. return 0;
  67. }
Add Comment
Please, Sign In to add comment