about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSteven Allen <steven@stebalien.com>2019-10-05T23·28+0900
committerSteven Allen <steven@stebalien.com>2019-10-05T23·28+0900
commitf14bd2a110af927293c23e8ff7aa1e2287120b0d (patch)
treea54feeeb561b898e4b83a4451b266c8ba1b1fac7
parent1e9be0de384d0750277b350c77e5e4a5d8a8ae10 (diff)
Set the current buffer before handling key events
There's no guarantee that the global current buffer matches the selected
window's buffer. For example, the following  will output "*Messages*" regardless
of the actual current buffer:

  (progn
    (run-at "1 sec" nil (lambda ()
                          (with-current-buffer (get-buffer "*Messages*")
                            (sit-for 5))))
    (run-at "2 sec" nil (lambda () (message (buffer-name)))))

* exwm-input.el (exwm-input--on-KeyPress): Set the current buffer to selected
window's current buffer.
-rw-r--r--exwm-input.el25
1 files changed, 13 insertions, 12 deletions
diff --git a/exwm-input.el b/exwm-input.el
index 2d3b48189826..8cd54c69b848 100644
--- a/exwm-input.el
+++ b/exwm-input.el
@@ -441,18 +441,19 @@ ARGS are additional arguments to CALLBACK."
 
 (defun exwm-input--on-KeyPress (data _synthetic)
   "Handle KeyPress event."
-  (let ((obj (make-instance 'xcb:KeyPress)))
-    (xcb:unmarshal obj data)
-    (exwm--log "major-mode=%s buffer=%s"
-               major-mode (buffer-name (current-buffer)))
-    (if (derived-mode-p 'exwm-mode)
-        (cl-case exwm--input-mode
-          (line-mode
-           (exwm-input--on-KeyPress-line-mode obj data))
-          (char-mode
-           (exwm-input--on-KeyPress-char-mode obj data)))
-      (exwm-input--on-KeyPress-char-mode obj)))
-  (run-hooks 'exwm-input--event-hook))
+  (with-current-buffer (window-buffer (selected-window))
+    (let ((obj (make-instance 'xcb:KeyPress)))
+      (xcb:unmarshal obj data)
+      (exwm--log "major-mode=%s buffer=%s"
+                 major-mode (buffer-name (current-buffer)))
+      (if (derived-mode-p 'exwm-mode)
+          (cl-case exwm--input-mode
+            (line-mode
+             (exwm-input--on-KeyPress-line-mode obj data))
+            (char-mode
+             (exwm-input--on-KeyPress-char-mode obj data)))
+        (exwm-input--on-KeyPress-char-mode obj)))
+    (run-hooks 'exwm-input--event-hook)))
 
 (defun exwm-input--on-CreateNotify (data _synthetic)
   "Handle CreateNotify events."