Add `exwm-workspace--position' helper

* exwm-workspace.el (exwm-workspace--position): New function.
	* exwm-layout.el (exwm-layout--refresh):
	* exwm-input.el (exwm-input--on-ButtonPress):
	* exwm-workspace.el (exwm-workspace--update-switch-history):
	* exwm.el (exwm--on-ClientMessage, exwm-workspace--init): Use it.
This commit is contained in:
Adrián Medraño Calvo 2016-07-17 12:00:00 +00:00
parent cd1372eaec
commit ed6a18a697
4 changed files with 16 additions and 7 deletions

View file

@ -179,6 +179,7 @@ It's updated in several occasions, and only used by `exwm-input--set-focus'.")
(declare-function exwm-floating--start-moveresize "exwm-floating.el"
(id &optional type))
(declare-function exwm-workspace--position "exwm-workspace.el" (frame))
(defvar exwm-workspace--list)
@ -208,14 +209,14 @@ It's updated in several occasions, and only used by `exwm-input--set-focus'.")
(if (memq frame exwm-workspace--list)
;; The X window is on another workspace
(exwm-workspace-switch
(cl-position frame exwm-workspace--list))
(exwm-workspace--position frame))
(with-current-buffer (window-buffer window)
(when (and (eq major-mode 'exwm-mode)
(not (eq exwm--frame
exwm-workspace--current)))
;; The floating X window is on another workspace
(exwm-workspace-switch
(cl-position exwm--frame exwm-workspace--list))))))
(exwm-workspace--position exwm--frame))))))
;; It has been reported that the `window' may have be deleted
(if (window-live-p window)
(select-window window)

View file

@ -161,6 +161,7 @@
(declare-function exwm-workspace--current-width "exwm-workspace.el")
(declare-function exwm-workspace--get-geometry "exwm-workspace.el" (frame))
(declare-function exwm-workspace--minibuffer-own-frame-p "exwm-workspace.el")
(declare-function exwm-workspace--position "exwm-workspace.el" (frame))
(declare-function exwm-workspace--set-fullscreen "exwm-workspace.el" (frame))
(declare-function exwm-workspace-move-window "exwm-workspace.el"
(index &optional id))
@ -346,7 +347,7 @@ selected by `other-buffer'."
(if (eq frame exwm--frame)
(exwm-layout--show exwm--id window)
(exwm-workspace-move-window
(cl-position frame exwm-workspace--list) exwm--id))
(exwm-workspace--position frame) exwm--id))
;; Make sure this buffer is not displayed elsewhere. Note down
;; windows displaying an EXWM-buffer now displayed elsewhere; we
;; need to display with some other buffer there.

View file

@ -29,6 +29,13 @@
(defvar exwm-workspace-number 4 "Number of workspaces (1 ~ 10).")
(defvar exwm-workspace--list nil "List of all workspaces (Emacs frames).")
(defsubst exwm-workspace--position (frame)
"Retrieve index of given FRAME in workspace list.
NIL if FRAME is not a workspace"
(cl-position frame exwm-workspace--list))
(defvar exwm-workspace--switch-map
(let ((map (make-sparse-keymap)))
(define-key map [t] (lambda () (interactive)))
@ -72,7 +79,7 @@
(with-current-buffer (cdr i)
(when exwm--frame
(setf (aref not-empty
(cl-position exwm--frame exwm-workspace--list))
(exwm-workspace--position exwm--frame))
t))))
(setq exwm-workspace--switch-history
(mapcar
@ -948,13 +955,13 @@ applied to all subsequently created X frames."
:window workspace
:data
(format "EXWM workspace %d"
(cl-position i exwm-workspace--list))))
(exwm-workspace--position i))))
(xcb:+request exwm--connection
(make-instance 'xcb:ewmh:set-_NET_WM_NAME
:window container
:data
(format "EXWM workspace %d frame container"
(cl-position i exwm-workspace--list)))))
(exwm-workspace--position i)))))
(xcb:+request exwm--connection
(make-instance 'xcb:ReparentWindow
:window outer-id :parent container :x 0 :y 0))

View file

@ -438,7 +438,7 @@
;; FIXME: check (may require other properties set)
(when (memq xcb:Atom:_NET_WM_STATE_DEMANDS_ATTENTION props)
(when (= action xcb:ewmh:_NET_WM_STATE_ADD)
(let ((idx (cl-position exwm--frame exwm-workspace--list)))
(let ((idx (exwm-workspace--position exwm--frame)))
(unless (= idx exwm-workspace-current-index)
(set-frame-parameter exwm--frame 'exwm--urgency t)
(setq exwm-workspace--switch-history-outdated t))))