My slstatus configuration
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 

98 righe
1.9 KiB

  1. /* See LICENSE file for copyright and license details. */
  2. #include <ctype.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <X11/XKBlib.h>
  6. #include <X11/Xlib.h>
  7. #include "../util.h"
  8. #define LAYOUT_MAX 256
  9. /* Given a token (sym) from the xkb_symbols string
  10. * check whether it is a valid layout/variant. The
  11. * EXCLUDES array contains invalid layouts/variants
  12. * that are part of the xkb rules config.
  13. */
  14. static int
  15. IsLayoutOrVariant(char *sym)
  16. {
  17. static const char* EXCLUDES[] = { "evdev", "inet", "pc", "base" };
  18. size_t i;
  19. for (i = 0; i < sizeof(EXCLUDES)/sizeof(EXCLUDES[0]); ++i)
  20. if (strstr(sym, EXCLUDES[i])) {
  21. return 0;
  22. }
  23. return 1;
  24. }
  25. static void
  26. GetKeyLayout(char *syms, char layout[], int groupNum)
  27. {
  28. char *token, *copy, *delims;
  29. int group;
  30. delims = "+:";
  31. group = 0;
  32. copy = strdup(syms);
  33. token = strtok(copy, delims);
  34. while (token != NULL && group <= groupNum) {
  35. /* Ignore :2,:3,:4 which represent additional layout
  36. * groups
  37. */
  38. if (IsLayoutOrVariant(token)
  39. && !(strlen(token) == 1 && isdigit(token[0]))) {
  40. strncpy (layout, token, LAYOUT_MAX);
  41. group++;
  42. }
  43. token = strtok(NULL,delims);
  44. }
  45. free(copy);
  46. }
  47. const char *
  48. keymap(void)
  49. {
  50. static char layout[LAYOUT_MAX];
  51. Display *dpy;
  52. char *symbols = NULL;
  53. XkbDescRec* desc = NULL;
  54. memset(layout, '\0', LAYOUT_MAX);
  55. if (!(dpy = XOpenDisplay(NULL))) {
  56. warn("XOpenDisplay: Failed to open display");
  57. return NULL;
  58. }
  59. ;
  60. if (!(desc = XkbAllocKeyboard())) {
  61. warn("XkbAllocKeyboard: failed to allocate keyboard");
  62. XCloseDisplay(dpy);
  63. return NULL;
  64. }
  65. XkbGetNames(dpy, XkbSymbolsNameMask, desc);
  66. if (desc->names) {
  67. XkbStateRec state;
  68. XkbGetState(dpy, XkbUseCoreKbd, &state);
  69. symbols = XGetAtomName(dpy, desc->names->symbols);
  70. GetKeyLayout(symbols, layout, state.group);
  71. XFree(symbols);
  72. } else {
  73. warn("XkbGetNames: failed to retrieve symbols for keys");
  74. return NULL;
  75. }
  76. XkbFreeKeyboard(desc, XkbSymbolsNameMask, 1);
  77. XCloseDisplay(dpy);
  78. return layout;
  79. }