diff options
-rw-r--r-- | calmwm.c | 1 | ||||
-rw-r--r-- | calmwm.h | 1 | ||||
-rw-r--r-- | xevents.c | 21 |
3 files changed, 23 insertions, 0 deletions
diff --git a/calmwm.c b/calmwm.c index 2ef2c8b..c64035d 100644 --- a/calmwm.c +++ b/calmwm.c @@ -101,6 +101,7 @@ main(int argc, char **argv) XEV_QUICK(NULL, NULL, Expose, xev_handle_expose, NULL); XEV_QUICK(NULL, NULL, DestroyNotify, xev_handle_destroynotify, NULL); XEV_QUICK(NULL, NULL, ClientMessage, xev_handle_clientmessage, NULL); + XEV_QUICK(NULL, NULL, MappingNotify, xev_handle_mapping, NULL); xev_loop(); diff --git a/calmwm.h b/calmwm.h index 7433f56..c20e66d 100644 --- a/calmwm.h +++ b/calmwm.h @@ -369,6 +369,7 @@ void xev_handle_keyrelease(struct xevent *, XEvent *); void xev_handle_expose(struct xevent *, XEvent *); void xev_handle_clientmessage(struct xevent *, XEvent *); void xev_handle_shape(struct xevent *, XEvent *); +void xev_handle_mapping(struct xevent *, XEvent *); #define XEV_QUICK(a, b, c, d, e) do { \ xev_register(xev_new(a, b, c, d, e)); \ diff --git a/xevents.c b/xevents.c index 0da23d7..274af43 100644 --- a/xevents.c +++ b/xevents.c @@ -375,6 +375,27 @@ xev_handle_shape(struct xevent *xev, XEvent *ee) client_do_shape(cc); } +/* + * Called when the keymap has changed. + * Ungrab all keys, reload keymap and then regrab + */ +void +xev_handle_mapping(struct xevent *xev, XEvent *ee) +{ + XMappingEvent *e = &ee->xmapping; + struct keybinding *kb; + + TAILQ_FOREACH(kb, &Conf.keybindingq, entry) + conf_ungrab(&Conf, kb); + + XRefreshKeyboardMapping(e); + + TAILQ_FOREACH(kb, &Conf.keybindingq, entry) + conf_grab(&Conf, kb); + + xev_register(xev); +} + /* * X Event handling */ |