From d0c2ca75f8ac78d87aba3e80902fb0f113b10279 Mon Sep 17 00:00:00 2001 From: Chris Feng Date: Thu, 6 Oct 2016 19:26:53 +0800 Subject: [PATCH] Fix a possible deadlock * exwm-input.el (exwm-input--update-focus): Unlock before switching workspace. Also make sure the correct Emacs window is chosen for the target workspace. --- exwm-input.el | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/exwm-input.el b/exwm-input.el index 4a8fdbb01..a2f478068 100644 --- a/exwm-input.el +++ b/exwm-input.el @@ -212,7 +212,10 @@ This value should always be overwritten.") (with-current-buffer (window-buffer window) (if (eq major-mode 'exwm-mode) (if (not (eq exwm--frame exwm-workspace--current)) - (exwm-workspace-switch exwm--frame) + (progn + (set-frame-parameter exwm--frame 'exwm-selected-window window) + (run-with-idle-timer 0 nil #'exwm-workspace-switch + exwm--frame)) (exwm--log "Set focus on #x%x" exwm--id) (exwm-input--set-focus exwm--id) (when exwm--floating-frame @@ -233,7 +236,11 @@ This value should always be overwritten.") (not (eq (selected-frame) exwm-workspace--current))) ;; The focus is on another workspace (e.g. it got clicked) ;; so switch to it. - (exwm-workspace-switch (selected-frame)) + (progn + (set-frame-parameter (selected-frame) 'exwm-selected-window + window) + (run-with-idle-timer 0 nil #'exwm-workspace-switch + (selected-frame))) ;; The focus is still on the current workspace. (if (not (and (exwm-workspace--minibuffer-own-frame-p) (minibufferp)))