On-demand update exwm-workspace--switch-history

* exwm-workspace.el (exwm-workspace--switch-history-outdated)
  (exwm-workspace--update-switch-history, exwm-workspace-switch)
  (exwm-workspace-move-window):
* exwm.el (exwm--update-hints, exwm--on-ClientMessage):
* exwm-floating.el (exwm-floating--set-floating):
* exwm-manage.el (exwm-manage--manage-window, exwm-manage--unmanage-window):
  Update exwm-workspace--switch-history only when it's used.
This commit is contained in:
Chris Feng 2015-09-17 19:48:50 +08:00
parent b458d5ac30
commit 4255f078a6
4 changed files with 47 additions and 38 deletions

View file

@ -94,7 +94,7 @@
(let ((idx (cl-position original-frame exwm-workspace--list))) (let ((idx (cl-position original-frame exwm-workspace--list)))
(when (/= idx exwm-workspace-current-index) (when (/= idx exwm-workspace-current-index)
(set-frame-parameter original-frame 'exwm--urgency t) (set-frame-parameter original-frame 'exwm--urgency t)
(exwm-workspace--update-switch-history))) (setq exwm-workspace--switch-history-outdated t)))
;; Fix illegal parameters ;; Fix illegal parameters
;; FIXME: check normal hints restrictions ;; FIXME: check normal hints restrictions
(let* ((display-width (frame-pixel-width original-frame)) (let* ((display-width (frame-pixel-width original-frame))

View file

@ -145,7 +145,7 @@ corresponding buffer.")
(exwm-floating--set-floating id) (exwm-floating--set-floating id)
(exwm-floating--unset-floating id)) (exwm-floating--unset-floating id))
(exwm-input-grab-keyboard id) (exwm-input-grab-keyboard id)
(exwm-workspace--update-switch-history) (setq exwm-workspace--switch-history-outdated t)
(with-current-buffer (exwm--id->buffer id) (with-current-buffer (exwm--id->buffer id)
(run-hooks 'exwm-manage-finish-hook))))) (run-hooks 'exwm-manage-finish-hook)))))
@ -161,7 +161,7 @@ corresponding buffer.")
(xcb:flush exwm--connection) (xcb:flush exwm--connection)
(when (buffer-live-p buffer) (when (buffer-live-p buffer)
(with-current-buffer buffer (with-current-buffer buffer
(exwm-workspace--update-switch-history) (setq exwm-workspace--switch-history-outdated t)
;; ;;
(when withdraw-only (when withdraw-only
;; Reparent back to root ;; Reparent back to root

View file

@ -63,33 +63,39 @@
(defvar exwm-workspace--switch-history nil (defvar exwm-workspace--switch-history nil
"History for `read-from-minibuffer' to interactively switch workspace.") "History for `read-from-minibuffer' to interactively switch workspace.")
;;;###autoload
(defvar exwm-workspace--switch-history-outdated nil
"Non-nil to indicate `exwm-workspace--switch-history' is outdated.")
;;;###autoload ;;;###autoload
(defun exwm-workspace--update-switch-history () (defun exwm-workspace--update-switch-history ()
"Update the history for switching workspace to reflect the latest status." "Update the history for switching workspace to reflect the latest status."
(let ((sequence (number-sequence 0 (1- exwm-workspace-number))) (when exwm-workspace--switch-history-outdated
(not-empty (make-vector exwm-workspace-number nil))) (setq exwm-workspace--switch-history-outdated nil)
(dolist (i exwm--id-buffer-alist) (let ((sequence (number-sequence 0 (1- exwm-workspace-number)))
(with-current-buffer (cdr i) (not-empty (make-vector exwm-workspace-number nil)))
(when exwm--frame (dolist (i exwm--id-buffer-alist)
(setf (aref not-empty (cl-position exwm--frame exwm-workspace--list)) (with-current-buffer (cdr i)
t)))) (when exwm--frame
(setq exwm-workspace--switch-history (setf (aref not-empty
(mapcar (cl-position exwm--frame exwm-workspace--list))
(lambda (i) t))))
(mapconcat (setq exwm-workspace--switch-history
(lambda (j) (mapcar
(format (if (= i j) "[%s]" " %s ") (lambda (i)
(propertize (mapconcat
(int-to-string j) (lambda (j)
'face (format (if (= i j) "[%s]" " %s ")
(cond ((frame-parameter (elt exwm-workspace--list j) (propertize
'exwm--urgency) (int-to-string j)
'(:foreground "orange")) 'face
((aref not-empty j) '(:foreground "green")) (cond ((frame-parameter (elt exwm-workspace--list j)
(t nil))))) 'exwm--urgency)
sequence "")) '(:foreground "orange"))
sequence)))) ((aref not-empty j) '(:foreground "green"))
(t nil)))))
sequence ""))
sequence)))))
(defvar exwm-workspace--current nil "Current active workspace.") (defvar exwm-workspace--current nil "Current active workspace.")
(defvar exwm-workspace-current-index 0 "Index of current active workspace.") (defvar exwm-workspace-current-index 0 "Index of current active workspace.")
@ -103,6 +109,7 @@ The optional FORCE option is for internal use only."
(interactive (interactive
(list (list
(unless (and (eq major-mode 'exwm-mode) exwm--fullscreen) ;it's invisible (unless (and (eq major-mode 'exwm-mode) exwm--fullscreen) ;it's invisible
(exwm-workspace--update-switch-history)
(let* ((history-add-new-input nil) ;prevent modifying history (let* ((history-add-new-input nil) ;prevent modifying history
(idx (read-from-minibuffer (idx (read-from-minibuffer
"Workspace: " (elt exwm-workspace--switch-history "Workspace: " (elt exwm-workspace--switch-history
@ -144,7 +151,7 @@ The optional FORCE option is for internal use only."
;; Update demands attention flag ;; Update demands attention flag
(set-frame-parameter frame 'exwm--urgency nil) (set-frame-parameter frame 'exwm--urgency nil)
;; Update switch workspace history ;; Update switch workspace history
(exwm-workspace--update-switch-history) (setq exwm-workspace--switch-history-outdated t)
(exwm--make-emacs-idle-for 0.1) ;FIXME (exwm--make-emacs-idle-for 0.1) ;FIXME
;; Update _NET_CURRENT_DESKTOP ;; Update _NET_CURRENT_DESKTOP
(xcb:+request exwm--connection (xcb:+request exwm--connection
@ -165,14 +172,16 @@ The optional FORCE option is for internal use only."
"Move window ID to workspace INDEX." "Move window ID to workspace INDEX."
(interactive (interactive
(list (list
(let* ((history-add-new-input nil) ;prevent modifying history (progn
(idx (read-from-minibuffer (exwm-workspace--update-switch-history)
"Workspace: " (elt exwm-workspace--switch-history (let* ((history-add-new-input nil) ;prevent modifying history
exwm-workspace-current-index) (idx (read-from-minibuffer
exwm-workspace--switch-map nil "Workspace: " (elt exwm-workspace--switch-history
`(exwm-workspace--switch-history exwm-workspace-current-index)
. ,(1+ exwm-workspace-current-index))))) exwm-workspace--switch-map nil
(cl-position idx exwm-workspace--switch-history :test #'equal)))) `(exwm-workspace--switch-history
. ,(1+ exwm-workspace-current-index)))))
(cl-position idx exwm-workspace--switch-history :test #'equal)))))
(unless id (setq id (exwm--buffer->id (window-buffer)))) (unless id (setq id (exwm--buffer->id (window-buffer))))
(unless (and (<= 0 index) (< index exwm-workspace-number)) (unless (and (<= 0 index) (< index exwm-workspace-number))
(user-error "[EXWM] Workspace index out of range: %d" index)) (user-error "[EXWM] Workspace index out of range: %d" index))
@ -213,7 +222,7 @@ The optional FORCE option is for internal use only."
(xcb:flush exwm--connection) (xcb:flush exwm--connection)
(set-window-buffer (frame-selected-window frame) (set-window-buffer (frame-selected-window frame)
(exwm--id->buffer id))))) (exwm--id->buffer id)))))
(exwm-workspace--update-switch-history))) (setq exwm-workspace--switch-history-outdated t)))
(defun exwm-workspace-switch-to-buffer () (defun exwm-workspace-switch-to-buffer ()
"Make the current Emacs window display another buffer." "Make the current Emacs window display another buffer."

View file

@ -230,7 +230,7 @@
(not (eq exwm--frame exwm-workspace--current))) (not (eq exwm--frame exwm-workspace--current)))
(unless (frame-parameter exwm--frame 'exwm--urgency) (unless (frame-parameter exwm--frame 'exwm--urgency)
(set-frame-parameter exwm--frame 'exwm--urgency t) (set-frame-parameter exwm--frame 'exwm--urgency t)
(exwm-workspace--update-switch-history)))))))) (setq exwm-workspace--switch-history-outdated t))))))))
;;;###autoload ;;;###autoload
(defun exwm--update-protocols (id &optional force) (defun exwm--update-protocols (id &optional force)
@ -389,7 +389,7 @@
(let ((idx (cl-position exwm--frame exwm-workspace--list))) (let ((idx (cl-position exwm--frame exwm-workspace--list)))
(unless (= idx exwm-workspace-current-index) (unless (= idx exwm-workspace-current-index)
(set-frame-parameter exwm--frame 'exwm--urgency t) (set-frame-parameter exwm--frame 'exwm--urgency t)
(exwm-workspace--update-switch-history)))) (setq exwm-workspace--switch-history-outdated t))))
;; xcb:ewmh:_NET_WM_STATE_REMOVE? ;; xcb:ewmh:_NET_WM_STATE_REMOVE?
;; xcb:ewmh:_NET_WM_STATE_TOGGLE? ;; xcb:ewmh:_NET_WM_STATE_TOGGLE?
) )