summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--calmwm.c1
-rw-r--r--calmwm.h1
-rw-r--r--xevents.c21
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
  */