xkb.c (1135B)
1 static XkbInfo xkbGlobal; 2 static XkbInfo *xkbSaved = NULL; 3 4 static XkbInfo * 5 createxkb(Window w) 6 { 7 XkbInfo *xkb; 8 9 xkb = malloc(sizeof *xkb); 10 if (xkb == NULL) 11 die("fatal: could not malloc() %u bytes\n", sizeof *xkb); 12 xkb->group = xkbGlobal.group; 13 xkb->w = w; 14 xkb->next = xkbSaved; 15 if (xkbSaved != NULL) 16 xkbSaved->prev = xkb; 17 xkb->prev = NULL; 18 xkbSaved = xkb; 19 20 return xkb; 21 } 22 23 XkbInfo * 24 findxkb(Window w) 25 { 26 XkbInfo *xkb; 27 for (xkb = xkbSaved; xkb != NULL; xkb = xkb->next) 28 if (xkb->w == w) 29 return xkb; 30 return NULL; 31 } 32 33 void 34 xkbeventnotify(XEvent *e) 35 { 36 XkbEvent *ev; 37 38 ev = (XkbEvent *) e; 39 switch (ev->any.xkb_type) { 40 case XkbStateNotify: 41 xkbGlobal.group = ev->state.locked_group; 42 if (selmon != NULL && selmon->sel != NULL) 43 selmon->sel->xkb->group = xkbGlobal.group; 44 drawbars(); 45 break; 46 } 47 } 48 49 /* xkb bar module */ 50 int 51 width_xkb(Bar *bar, BarArg *a) 52 { 53 return TEXTW(xkb_layouts[xkbGlobal.group]); 54 } 55 56 int 57 draw_xkb(Bar *bar, BarArg *a) 58 { 59 drw_text(drw, a->x, a->y, a->w, a->h, lrpad / 2, xkb_layouts[xkbGlobal.group], 0, False); 60 return 1; 61 } 62 63 int 64 click_xkb(Bar *bar, Arg *arg, BarArg *a) 65 { 66 return ClkXKB; 67 } 68