mirror of
https://github.com/ch11ng/exwm.git
synced 2024-11-30 14:38:00 +01:00
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:
parent
b458d5ac30
commit
4255f078a6
4 changed files with 47 additions and 38 deletions
|
@ -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))
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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."
|
||||||
|
|
4
exwm.el
4
exwm.el
|
@ -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?
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue