about summary refs log tree commit diff
diff options
context:
space:
mode:
authorChris Feng <chris.w.feng@gmail.com>2016-09-22T11·10+0800
committerChris Feng <chris.w.feng@gmail.com>2016-09-22T11·10+0800
commitf96f565d548521a87e0f3a23bfab7f5b836e4640 (patch)
tree5b9bf6a9d37f226ff77a2468427d9fd52f461418
parent43af6bb6a295fc843bd8b1f890cca1c246293e90 (diff)
Add support for keyboard macro
* exwm-core.el (exwm--kmacro-map): New keymap used when executing
keyboard macros.
(exwm-mode): Use `exwm--kmacro-map' to override the default keymap.
* exwm-input.el (exwm-input--on-KeyPress-line-mode): Send extra key
events when defining keyboard macros.
-rw-r--r--exwm-core.el31
-rw-r--r--exwm-input.el6
2 files changed, 36 insertions, 1 deletions
diff --git a/exwm-core.el b/exwm-core.el
index e65ad5169093..8f5299f16b1f 100644
--- a/exwm-core.el
+++ b/exwm-core.el
@@ -26,6 +26,8 @@
 
 ;;; Code:
 
+(require 'kmacro)
+
 (require 'xcb)
 (require 'xcb-icccm)
 (require 'xcb-ewmh)
@@ -78,6 +80,12 @@
     (logior xcb:EventMask:StructureNotify xcb:EventMask:PropertyChange))
   "Event mask set on all managed windows.")
 
+(defvar exwm-input--during-key-sequence)
+(defvar exwm-input--global-prefix-keys)
+(defvar exwm-input-prefix-keys)
+(defvar exwm-input--simulation-prefix-keys)
+
+(declare-function exwm-input--fake-key "exwm-input.el" (event))
 (declare-function exwm-input--on-KeyPress-line-mode "exwm-input.el"
                   (key-press raw-data))
 
@@ -140,6 +148,26 @@
     map)
   "Keymap for `exwm-mode'.")
 
+(defvar exwm--kmacro-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [t]
+      (lambda ()
+        (interactive)
+        (cond
+         ((or exwm-input--during-key-sequence
+              ;; Do not test `exwm-input--during-command'.
+              (active-minibuffer-window)
+              (memq last-input-event exwm-input--global-prefix-keys)
+              (memq last-input-event exwm-input-prefix-keys)
+              (memq last-input-event exwm-input--simulation-prefix-keys))
+          (set-transient-map (make-composed-keymap (list exwm-mode-map
+                                                         global-map)))
+          (push last-input-event unread-command-events))
+         (t
+          (exwm-input--fake-key last-input-event)))))
+    map)
+  "Keymap used when executing keyboard macros.")
+
 ;; This menu mainly acts as an reminder for users.  Thus it should be as
 ;; detailed as possible, even some entries do not make much sense here.
 ;; Also, inactive entries should be disabled rather than hidden.
@@ -226,6 +254,9 @@
   ;; Kill buffer -> close window
   (add-hook 'kill-buffer-query-functions
             #'exwm-manage--kill-buffer-query-function nil t)
+  ;; Redirect events when executing keyboard macros.
+  (push `(executing-kbd-macro . ,exwm--kmacro-map)
+        minor-mode-overriding-map-alist)
   (setq buffer-read-only t
         left-margin-width nil
         right-margin-width nil
diff --git a/exwm-input.el b/exwm-input.el
index dd65b6e8f12f..8101cbd52882 100644
--- a/exwm-input.el
+++ b/exwm-input.el
@@ -454,7 +454,11 @@ This value should always be overwritten.")
                              :propagate 0
                              :destination (slot-value key-press 'event)
                              :event-mask xcb:EventMask:NoEvent
-                             :event raw-data))))
+                             :event raw-data)))
+        ;; Make Emacs aware of this event when defining keyboard macros.
+        (when (and defining-kbd-macro event)
+          (set-transient-map '(keymap (t . (lambda () (interactive)))))
+          (exwm-input--unread-event event)))
       (xcb:+request exwm--connection
           (make-instance 'xcb:AllowEvents
                          :mode mode