about summary refs log tree commit diff
diff options
context:
space:
mode:
authorChris Feng <chris.w.feng@gmail.com>2015-08-10T13·01+0800
committerChris Feng <chris.w.feng@gmail.com>2015-08-10T13·01+0800
commit24b964bb4af100b959a33215cc91b9c896c9359e (patch)
tree266cfd121aa95ad33e0ea698109989e30c1750d2
parent048994c7948528630b5c13f56dd22a9b2972e09c (diff)
Ignore repeated `MappingNotify` events
For some reason, `MappingNotify` events are generated quite frequently and
greatly impact the performance. This commit disables the complete refresh of
keyboard mapping.
-rw-r--r--exwm-input.el25
1 files changed, 18 insertions, 7 deletions
diff --git a/exwm-input.el b/exwm-input.el
index 24aa94abdaee..293fd670478f 100644
--- a/exwm-input.el
+++ b/exwm-input.el
@@ -139,13 +139,24 @@ It's updated in several occasions, and only used by `exwm-input--set-focus'.")
   (let ((obj (make-instance 'xcb:MappingNotify)))
     (xcb:unmarshal obj data)
     (with-slots (request first-keycode count) obj
-      (cond ((= request xcb:Mapping:Modifier)
-             ;; Modifier keys changed
-             (xcb:keysyms:update-modifier-mapping exwm--connection))
-            ((= request xcb:Mapping:Keyboard)
-             ;; Only updated changed keys
-             (xcb:keysyms:update-keyboard-mapping exwm--connection
-                                                  first-keycode count))))))
+      (cond
+       ((= request xcb:Mapping:Modifier)
+        ;; Modifier keys changed
+        (exwm--log "Update modifier mapping")
+        (xcb:keysyms:update-modifier-mapping exwm--connection)
+        )
+       ((= request xcb:Mapping:Keyboard)
+        ;; Only update changed keys
+        (with-slots (min-keycode max-keycode)
+            (xcb:get-setup exwm--connection)
+          ;; Since this operation is quite time-consuming, a complete refresh
+          ;; is forbidden as it's unlikely to bring any useful information
+          (unless (and (= min-keycode first-keycode)
+                       (= max-keycode (+ first-keycode count -1)))
+            (exwm--log "Update keyboard mapping: %d ~ %d"
+                       first-keycode (+ first-keycode count))
+            (xcb:keysyms:update-keyboard-mapping exwm--connection
+                                                 first-keycode count))))))))
 
 (defun exwm-input--on-ButtonPress (data synthetic)
   "Handle ButtonPress event."