Merge branch 'medranocalvo/fix-x-window-vanish' into externals/exwm

This commit is contained in:
Chris Feng 2018-08-19 00:00:00 +00:00
commit 2b1ed2ce70

View file

@ -267,12 +267,15 @@ selected by `other-buffer'."
(unless frame (unless frame
(setq frame (selected-frame))) (setq frame (selected-frame)))
(exwm--log "frame=%s" frame) (exwm--log "frame=%s" frame)
(let (covered-buffers ;EXWM-buffers covered by a new X window.
vacated-windows ;Windows previously displaying EXWM-buffers.
windows)
(if (not (exwm-workspace--workspace-p frame)) (if (not (exwm-workspace--workspace-p frame))
(if (frame-parameter frame 'exwm-outer-id) (if (frame-parameter frame 'exwm-outer-id)
;; Refresh a floating frame (exwm-layout--refresh-floating frame)
(exwm-layout--refresh-other frame))
(exwm-layout--refresh-workspace frame)))
(defun exwm-layout--refresh-floating (frame)
"Refresh floating frame FRAME."
(exwm--log "Refresh floating %s" frame)
(let ((window (frame-first-window frame))) (let ((window (frame-first-window frame)))
(with-current-buffer (window-buffer window) (with-current-buffer (window-buffer window)
(when (and (derived-mode-p 'exwm-mode) (when (and (derived-mode-p 'exwm-mode)
@ -281,61 +284,77 @@ selected by `other-buffer'."
(exwm--log "Refresh floating window #x%x" exwm--id) (exwm--log "Refresh floating window #x%x" exwm--id)
(if (exwm-workspace--active-p exwm--frame) (if (exwm-workspace--active-p exwm--frame)
(exwm-layout--show exwm--id window) (exwm-layout--show exwm--id window)
(exwm-layout--hide exwm--id))))) (exwm-layout--hide exwm--id))))))
(defun exwm-layout--refresh-other (frame)
"Refresh client or nox frame FRAME."
;; Other frames (e.g. terminal/graphical frame of emacsclient) ;; Other frames (e.g. terminal/graphical frame of emacsclient)
;; We shall bury all `exwm-mode' buffers in this case ;; We shall bury all `exwm-mode' buffers in this case
(setq windows (window-list frame 0)) ;exclude minibuffer (exwm--log "Refresh other %s" frame)
(let ((exwm-layout--other-buffer-exclude-exwm-mode-buffers t)) (let ((windows (window-list frame 'nomini)) ;exclude minibuffer
(exwm-layout--other-buffer-exclude-exwm-mode-buffers t))
(dolist (window windows) (dolist (window windows)
(with-current-buffer (window-buffer window) (with-current-buffer (window-buffer window)
(when (derived-mode-p 'exwm-mode) (when (derived-mode-p 'exwm-mode)
(switch-to-prev-buffer window)))))) (switch-to-prev-buffer window))))))
;; Refresh the whole workspace
;; Workspaces other than the active one can also be refreshed (RandR) (defun exwm-layout--refresh-workspace (frame)
"Refresh workspace frame FRAME."
(exwm--log "Refresh workspace %s" frame) (exwm--log "Refresh workspace %s" frame)
;; Workspaces other than the active one can also be refreshed (RandR)
(let (covered-buffers ;EXWM-buffers covered by a new X window.
vacated-windows) ;Windows previously displaying EXWM-buffers.
(dolist (pair exwm--id-buffer-alist) (dolist (pair exwm--id-buffer-alist)
(with-current-buffer (cdr pair) (with-current-buffer (cdr pair)
(when (and (not exwm--floating-frame) ;exclude floating X windows (when (and (not exwm--floating-frame) ;exclude floating X windows
(or exwm-layout-show-all-buffers (or exwm-layout-show-all-buffers
;; Exclude X windows on other workspaces ;; Exclude X windows on other workspaces
(eq frame exwm--frame))) (eq frame exwm--frame)))
(setq windows (get-buffer-window-list (current-buffer) 0)) (let (;; List of windows in current frame displaying the `exwm-mode'
;; buffers.
(windows (get-buffer-window-list (current-buffer) 'nomini
frame)))
(if (not windows) (if (not windows)
(when (eq frame exwm--frame) (when (eq frame exwm--frame)
;; Hide it if it was being shown in this workspace.
(exwm-layout--hide exwm--id)) (exwm-layout--hide exwm--id))
(let ((window (car windows))) (let ((window (car windows)))
(if (eq frame exwm--frame) (if (eq frame exwm--frame)
(when (exwm-workspace--active-p frame) (when (exwm-workspace--active-p frame)
;; Show it if `frame' is active.
(exwm-layout--show exwm--id window)) (exwm-layout--show exwm--id window))
;; It was last shown in other workspace; move it here.
(exwm-workspace-move-window frame exwm--id)) (exwm-workspace-move-window frame exwm--id))
;; Make sure this buffer is not displayed elsewhere. Note down ;; Vacate any other windows (in any workspace) showing this
;; windows displaying an EXWM-buffer now displayed elsewhere; we ;; `exwm-mode' buffer.
;; need to display with some other buffer there.
(setq vacated-windows (setq vacated-windows
(append vacated-windows (cdr (get-buffer-window-list (append vacated-windows (remove
(current-buffer) 0 t)))) window
;; Note down when an EXWM-buffer is being covered by this (get-buffer-window-list
;; buffer; we don't want it to reappear in some vacated window. (current-buffer) 'nomini t))))
;; Note any `exwm-mode' buffer is being covered by another
;; `exwm-mode' buffer. We want to avoid that `exwm-mode'
;; buffer to be reappear in any of the vacated windows.
(let ((prev-buffer (car-safe (let ((prev-buffer (car-safe
(car-safe (window-prev-buffers window))))) (car-safe (window-prev-buffers window)))))
(and (and
prev-buffer prev-buffer
(with-current-buffer prev-buffer (with-current-buffer prev-buffer
(derived-mode-p 'exwm-mode)) (derived-mode-p 'exwm-mode))
(push prev-buffer covered-buffers)))))))) (push prev-buffer covered-buffers)))))))))
;; Set some sensible buffer to vacated windows. ;; Set some sensible buffer to vacated windows.
(let ((exwm-layout--other-buffer-exclude-buffers covered-buffers)) (let ((exwm-layout--other-buffer-exclude-buffers covered-buffers))
(dolist (window vacated-windows) (dolist (window vacated-windows)
(switch-to-prev-buffer window))) (switch-to-prev-buffer window)))
;; Make sure windows floating / on other workspaces are excluded ;; Make sure windows floating / on other workspaces are excluded
(let ((exwm-layout--other-buffer-exclude-exwm-mode-buffers t)) (let ((exwm-layout--other-buffer-exclude-exwm-mode-buffers t))
(dolist (window (window-list frame 0)) (dolist (window (window-list frame 'nomini))
(with-current-buffer (window-buffer window) (with-current-buffer (window-buffer window)
(when (and (derived-mode-p 'exwm-mode) (when (and (derived-mode-p 'exwm-mode)
(or exwm--floating-frame (not (eq frame exwm--frame)))) (or exwm--floating-frame (not (eq frame exwm--frame))))
(switch-to-prev-buffer window))))) (switch-to-prev-buffer window)))))
(exwm-layout--set-client-list-stacking) (exwm-layout--set-client-list-stacking)
(xcb:flush exwm--connection)))) (xcb:flush exwm--connection)))
(defun exwm-layout--on-minibuffer-setup () (defun exwm-layout--on-minibuffer-setup ()
"Refresh layout when minibuffer grows." "Refresh layout when minibuffer grows."