txkblayout.c - spoon - [fork] customized build of spoon, the dwm status utility
 (HTM) git clone git://src.adamsgaard.dk/spoon
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
       txkblayout.c (975B)
       ---
            1 #include <err.h>
            2 #include <stdio.h>
            3 #include <stdlib.h>
            4 #include <string.h>
            5 
            6 #include <X11/Xlib.h>
            7 #include <X11/XKBlib.h>
            8 #include <X11/extensions/XKBrules.h>
            9 
           10 #include "util.h"
           11 
           12 int
           13 xkblayoutread(void *arg, char *buf, size_t len)
           14 {
           15         Display *dpy;
           16         XkbStateRec state;
           17         XkbRF_VarDefsRec vd;
           18         char *tmp = NULL, *str, *tok;
           19         int i, ret = 0;
           20 
           21         dpy = XOpenDisplay(NULL);
           22         if (dpy == NULL) {
           23                 warnx("cannot open display");
           24                 return -1;
           25         }
           26         XkbGetState(dpy, XkbUseCoreKbd, &state);
           27         if (XkbRF_GetNamesProp(dpy, &tmp, &vd) == 0){
           28                 warnx("cannot extract keyboard properties");
           29                 ret = -1;
           30                 goto out0;
           31         }
           32         str = strdup(vd.layout);
           33         if (str == NULL) {
           34                 ret = -1;
           35                 goto out1;
           36         }
           37         tok = strtok(str, ",");
           38         for (i = 0; i < state.group; i++) {
           39                 tok = strtok(NULL, ",");
           40                 if (tok == NULL) {
           41                         warnx("cannot extract layout");
           42                         ret = -1;
           43                         goto out2;
           44                 }
           45         }
           46         strlcpy(buf, tok, len);
           47 out2:
           48         free(str);
           49 out1:
           50         free(tmp);
           51         XFree(vd.options);
           52 out0:
           53         XCloseDisplay(dpy);
           54         return ret;
           55 }