diff --git a/dwm.c b/dwm.c index 1d78655..f42dcd5 100644 --- a/dwm.c +++ b/dwm.c @@ -36,6 +36,7 @@ #include #include #include +#include #ifdef XINERAMA #include #endif /* XINERAMA */ @@ -95,6 +96,7 @@ struct Client { Client *snext; Monitor *mon; Window win; + unsigned char kbdgrp; }; typedef struct { @@ -852,6 +854,7 @@ focus(Client *c) { selmon = c->mon; if(c->isurgent) clearurgent(c); + XkbLockGroup(dpy, XkbUseCoreKbd, c->kbdgrp); detachstack(c); attachstack(c); grabbuttons(c, True); @@ -1112,6 +1115,7 @@ manage(Window w, XWindowAttributes *wa) { Client *c, *t = NULL; Window trans = None; XWindowChanges wc; + XkbStateRec kbd_state; if(!(c = calloc(1, sizeof(Client)))) die("fatal: could not malloc() %u bytes\n", sizeof(Client)); @@ -1163,6 +1167,8 @@ manage(Window w, XWindowAttributes *wa) { unfocus(selmon->sel, False); c->mon->sel = c; arrange(c->mon); + XkbGetState(dpy, XkbUseCoreKbd, &kbd_state); + c->kbdgrp = kbd_state.group; XMapWindow(dpy, c->win); focus(NULL); } @@ -1773,12 +1779,16 @@ toggleview(const Arg *arg) { void unfocus(Client *c, Bool setfocus) { + XkbStateRec kbd_state; + if(!c) return; grabbuttons(c, False); XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]); if(setfocus) XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); + XkbGetState(dpy, XkbUseCoreKbd, &kbd_state); + c->kbdgrp = kbd_state.group; } void