mirror of
https://github.com/emacs-exwm/exwm.git
synced 2024-11-23 21:17:59 +01:00
Merge branch 'medranocalvo/fix-x-window-vanish' into externals/exwm
This commit is contained in:
commit
2b1ed2ce70
1 changed files with 72 additions and 53 deletions
|
@ -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."
|
||||||
|
|
Loading…
Reference in a new issue