Fix workspace switch issues

* exwm-core.el (exwm--make-emacs-idle-for): Removed.
* exwm-workspace.el (exwm-workspace--switch-count): New variable.
  (exwm-workspace-switch): Increase exwm-workspace--switch-count when
  necessary; Remove the call to exwm--make-emacs-idle-for.
  (exwm-workspace--on-focus-in): Consume exwm-workspace--switch-count.

* exwm-workspace.el (exwm-workspace--on-focus-in): Close active minibuffer.
This commit is contained in:
Chris Feng 2015-10-25 14:51:06 +08:00
parent 463d0da411
commit e8bc51280d
2 changed files with 10 additions and 6 deletions

View file

@ -38,10 +38,6 @@
(when exwm-debug-on (when exwm-debug-on
`(message (concat "[EXWM] " ,format-string) ,@args))) `(message (concat "[EXWM] " ,format-string) ,@args)))
(defun exwm--make-emacs-idle-for (seconds)
"Put Emacs in idle state for SECONDS seconds."
(with-timeout (seconds) (read-event)))
(defvar exwm--connection nil "X connection.") (defvar exwm--connection nil "X connection.")
(defvar exwm--root nil "Root window.") (defvar exwm--root nil "Root window.")
(defvar exwm--id-buffer-alist nil "Alist of (<X window ID> . <Emacs buffer>).") (defvar exwm--id-buffer-alist nil "Alist of (<X window ID> . <Emacs buffer>).")

View file

@ -100,6 +100,10 @@
(defvar exwm-workspace-current-index 0 "Index of current active workspace.") (defvar exwm-workspace-current-index 0 "Index of current active workspace.")
(defvar exwm-workspace-show-all-buffers nil (defvar exwm-workspace-show-all-buffers nil
"Non-nil to show buffers on other workspaces.") "Non-nil to show buffers on other workspaces.")
(defvar exwm-workspace--switch-count 0
"`exwm-workspace-switch' execution counts.
Consumed by `exwm-workspace--on-focus-in.'")
;;;###autoload ;;;###autoload
(defun exwm-workspace-switch (index &optional force) (defun exwm-workspace-switch (index &optional force)
@ -125,6 +129,7 @@ The optional FORCE option is for internal use only."
(let ((frame (elt exwm-workspace--list index))) (let ((frame (elt exwm-workspace--list index)))
(setq exwm-workspace--current frame (setq exwm-workspace--current frame
exwm-workspace-current-index index) exwm-workspace-current-index index)
(unless force (cl-incf exwm-workspace--switch-count))
(select-frame-set-input-focus frame) (select-frame-set-input-focus frame)
;; Move mouse when necessary ;; Move mouse when necessary
(let ((position (mouse-pixel-position)) (let ((position (mouse-pixel-position))
@ -154,7 +159,6 @@ The optional FORCE option is for internal use only."
(set-frame-parameter frame 'exwm--urgency nil) (set-frame-parameter frame 'exwm--urgency nil)
;; Update switch workspace history ;; Update switch workspace history
(setq exwm-workspace--switch-history-outdated t) (setq exwm-workspace--switch-history-outdated t)
(exwm--make-emacs-idle-for 0.1) ;FIXME
;; Update _NET_CURRENT_DESKTOP ;; Update _NET_CURRENT_DESKTOP
(xcb:+request exwm--connection (xcb:+request exwm--connection
(make-instance 'xcb:ewmh:set-_NET_CURRENT_DESKTOP (make-instance 'xcb:ewmh:set-_NET_CURRENT_DESKTOP
@ -165,9 +169,13 @@ The optional FORCE option is for internal use only."
"Fix unexpected frame switch." "Fix unexpected frame switch."
(let ((index (cl-position (selected-frame) exwm-workspace--list))) (let ((index (cl-position (selected-frame) exwm-workspace--list)))
(exwm--log "Focus on workspace %s" index) (exwm--log "Focus on workspace %s" index)
;; Close the (possible) active minibuffer
(when (active-minibuffer-window) (abort-recursive-edit))
(when (and index (/= index exwm-workspace-current-index)) (when (and index (/= index exwm-workspace-current-index))
(exwm--log "Workspace was switched unexpectedly") (exwm--log "Workspace was switched unexpectedly")
(exwm-workspace-switch index)))) (if (< 0 exwm-workspace--switch-count)
(cl-decf exwm-workspace--switch-count)
(exwm-workspace-switch index)))))
;;;###autoload ;;;###autoload
(defun exwm-workspace-move-window (index &optional id) (defun exwm-workspace-move-window (index &optional id)