From 04441482d4ceab6eab0eaadc5188997a245bf061 Mon Sep 17 00:00:00 2001 From: oga Date: Tue, 22 Jul 2008 21:01:54 +0000 Subject: fix the froggy problem. Implement a handler for the MappingEvent, meaning that the keymap has changed. When this happens, ungrab all bindings, update the map, and regrab. Fixes the problem where some keybindings wouldn't work under non us or uk keymaps (especially the .fr map, it seems). Issue noticed by ajacoutot@, ratchov@, and a few people on misc. Based on an initial diff from ratchov@. ok okan. --- calmwm.c | 1 + calmwm.h | 1 + xevents.c | 21 +++++++++++++++++++++ 3 files changed, 23 insertions(+) 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 */ -- cgit 1.4.1