aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--calmwm.c3
-rw-r--r--calmwm.h3
-rw-r--r--xevents.c23
3 files changed, 26 insertions, 3 deletions
diff --git a/calmwm.c b/calmwm.c
index 77f9f52..6508f1d 100644
--- a/calmwm.c
+++ b/calmwm.c
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $Id: calmwm.c,v 1.26 2008/07/22 20:51:54 oga Exp $
+ * $Id: calmwm.c,v 1.27 2008/07/22 21:01:54 oga Exp $
*/
#include "headers.h"
@@ -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 d7835ec..4737a19 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $Id: calmwm.h,v 1.64 2008/07/22 20:51:54 oga Exp $
+ * $Id: calmwm.h,v 1.65 2008/07/22 21:01:54 oga Exp $
*/
#ifndef _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 3efb3ba..c28f550 100644
--- a/xevents.c
+++ b/xevents.c
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $Id: xevents.c,v 1.25 2008/07/11 14:21:28 okan Exp $
+ * $Id: xevents.c,v 1.26 2008/07/22 21:01:54 oga Exp $
*/
/*
@@ -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
*/