about summary refs log tree commit diff
path: root/exwm-workspace.el
diff options
context:
space:
mode:
authorAdrián Medraño Calvo <adrian@medranocalvo.com>2020-04-15T00·00+0000
committerAdrián Medraño Calvo <adrian@medranocalvo.com>2020-04-15T00·00+0000
commitcddb3429d2219ed5e15761e4b7b61be1a14970bd (patch)
tree7eb45b348e8b5094a2caf70b2d543418cf677323 /exwm-workspace.el
parent95d6aa96cfaac1a3b474ca16bac70945ad909b01 (diff)
Abort recursive edit before switching workspaces
	* exwm-workspace.el (exwm-workspace-switch): Abort recursive edit
	before switching to other workspace.  This avoids the usual
	`set-window-configuration' calls (e.g., by `eval-expression') to
	switch *us back to the previous workspace.
Diffstat (limited to 'exwm-workspace.el')
-rw-r--r--exwm-workspace.el16
1 files changed, 10 insertions, 6 deletions
diff --git a/exwm-workspace.el b/exwm-workspace.el
index 4da97d9282a8..1f832a66fd96 100644
--- a/exwm-workspace.el
+++ b/exwm-workspace.el
@@ -587,6 +587,16 @@ for internal use only."
     (when (or force (not (eq frame exwm-workspace--current)))
       (unless (window-live-p window)
         (setq window (frame-selected-window frame)))
+      ;; Close the (possible) active minibuffer.  Aborting the recursive edit
+      ;; level will abort the execution of this very command.  Schedule it to
+      ;; run immediately afterward.  This must all be done before the new
+      ;; workspace is selected in the new workspace, in order to avoid the focus
+      ;; to go back to the previous frame due to resetting the window
+      ;; configuration (e.g. `eval-expression').
+      (when (active-minibuffer-window)
+        (exwm--defer 0 (lambda ()
+                         (exwm-workspace-switch frame-or-index force)))
+        (abort-recursive-edit))
       ;; Raise this frame.
       (xcb:+request exwm--connection
           (make-instance 'xcb:ConfigureWindow
@@ -635,12 +645,6 @@ for internal use only."
       (select-window window)
       (x-focus-frame (window-frame window)) ;The real input focus.
       (set-frame-parameter frame 'exwm-selected-window nil)
-      ;; Close the (possible) active minibuffer
-      (when (active-minibuffer-window)
-        (exwm--defer 0 (lambda ()
-                         ;; Might be aborted by then.
-                         (when (active-minibuffer-window)
-                           (abort-recursive-edit)))))
       (if (exwm-workspace--minibuffer-own-frame-p)
           ;; Resize the minibuffer frame.
           (exwm-workspace--resize-minibuffer-frame)