Fix fullscreen mode after switching workspace and back

* exwm-layout.el (exwm-layout--show): Always set an X window in
fullscreen mode the size in fullscreen.
(exwm-layout-unset-fullscreen): Leave the fullscreen mode first.

* exwm-layout.el (exwm-layout--fullscreen-p): New function telling
whether the current buffer is in fullscreen mode.
(exwm-layout-set-fullscreen, exwm-layout-unset-fullscreen)
(exwm-layout-toggle-fullscreen):
* exwm-manage.el (exwm-manage--manage-window)
(exwm-manage--on-ConfigureRequest):
* exwm-workspace.el (exwm-workspace-switch, exwm-workspace-swap)
(exwm-workspace-move):
* exwm.el (exwm-reset, exwm--on-ClientMessage): Use it.
This commit is contained in:
Chris Feng 2018-03-04 12:23:37 +08:00
parent 277377c718
commit 46fe764634
4 changed files with 32 additions and 20 deletions

View file

@ -69,6 +69,10 @@
(buffer-local-value 'exwm-state (exwm--id->buffer id)) (buffer-local-value 'exwm-state (exwm--id->buffer id))
exwm-state))) exwm-state)))
(defun exwm-layout--fullscreen-p ()
(when (derived-mode-p 'exwm-mode)
(memq xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state)))
(defun exwm-layout--show (id &optional window) (defun exwm-layout--show (id &optional window)
"Show window ID exactly fit in the Emacs window WINDOW." "Show window ID exactly fit in the Emacs window WINDOW."
(exwm--log "Show #x%x in %s" id window) (exwm--log "Show #x%x in %s" id window)
@ -92,6 +96,16 @@
(exwm--set-geometry (frame-parameter exwm--floating-frame (exwm--set-geometry (frame-parameter exwm--floating-frame
'exwm-container) 'exwm-container)
frame-x frame-y frame-width frame-height)) frame-x frame-y frame-width frame-height))
(when (exwm-layout--fullscreen-p)
(with-slots ((x* x)
(y* y)
(width* width)
(height* height))
(exwm-workspace--get-geometry exwm--frame)
(setq x x*
y y*
width width*
height height*)))
(exwm--set-geometry id x y width height) (exwm--set-geometry id x y width height)
(xcb:+request exwm--connection (make-instance 'xcb:MapWindow :window id)) (xcb:+request exwm--connection (make-instance 'xcb:MapWindow :window id))
(exwm-layout--set-state id xcb:icccm:WM_STATE:NormalState))) (exwm-layout--set-state id xcb:icccm:WM_STATE:NormalState)))
@ -131,7 +145,7 @@
"Make window ID fullscreen." "Make window ID fullscreen."
(interactive) (interactive)
(unless (and (or id (derived-mode-p 'exwm-mode)) (unless (and (or id (derived-mode-p 'exwm-mode))
(not (memq xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state))) (not (exwm-layout--fullscreen-p)))
(cl-return-from 'exwm-layout-set-fullscreen)) (cl-return-from 'exwm-layout-set-fullscreen))
(with-current-buffer (if id (exwm--id->buffer id) (window-buffer)) (with-current-buffer (if id (exwm--id->buffer id) (window-buffer))
;; Expand the X window to fill the whole screen. ;; Expand the X window to fill the whole screen.
@ -158,9 +172,11 @@
"Restore window from fullscreen state." "Restore window from fullscreen state."
(interactive) (interactive)
(unless (and (or id (derived-mode-p 'exwm-mode)) (unless (and (or id (derived-mode-p 'exwm-mode))
(memq xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state)) (exwm-layout--fullscreen-p))
(cl-return-from 'exwm-layout-unset-fullscreen)) (cl-return-from 'exwm-layout-unset-fullscreen))
(with-current-buffer (if id (exwm--id->buffer id) (window-buffer)) (with-current-buffer (if id (exwm--id->buffer id) (window-buffer))
(setq exwm--ewmh-state
(delq xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state))
(if exwm--floating-frame (if exwm--floating-frame
(exwm-layout--show exwm--id (frame-root-window exwm--floating-frame)) (exwm-layout--show exwm--id (frame-root-window exwm--floating-frame))
(xcb:+request exwm--connection (xcb:+request exwm--connection
@ -176,8 +192,6 @@
(xcb:+request exwm--connection (xcb:+request exwm--connection
(make-instance 'xcb:ewmh:set-_NET_WM_STATE :window exwm--id :data [])) (make-instance 'xcb:ewmh:set-_NET_WM_STATE :window exwm--id :data []))
(xcb:flush exwm--connection) (xcb:flush exwm--connection)
(setq exwm--ewmh-state
(delq xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state))
(call-interactively #'exwm-input-grab-keyboard))) (call-interactively #'exwm-input-grab-keyboard)))
;;;###autoload ;;;###autoload
@ -188,7 +202,7 @@
(cl-return-from 'exwm-layout-toggle-fullscreen)) (cl-return-from 'exwm-layout-toggle-fullscreen))
(when id (when id
(with-current-buffer (exwm--id->buffer id) (with-current-buffer (exwm--id->buffer id)
(if (memq xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state) (if (exwm-layout--fullscreen-p)
(exwm-reset) (exwm-reset)
(exwm-layout-set-fullscreen id))))) (exwm-layout-set-fullscreen id)))))

View file

@ -109,6 +109,7 @@ You can still make the X windows floating afterwards."
(declare-function exwm-floating--unset-floating "exwm-floating.el" (id)) (declare-function exwm-floating--unset-floating "exwm-floating.el" (id))
(declare-function exwm-input-grab-keyboard "exwm-input.el") (declare-function exwm-input-grab-keyboard "exwm-input.el")
(declare-function exwm-input-set-local-simulation-keys "exwm-input.el") (declare-function exwm-input-set-local-simulation-keys "exwm-input.el")
(declare-function exwm-layout--fullscreen-p "exwm-layout.el" ())
(declare-function exwm-layout--iconic-state-p "exwm-layout.el" (&optional id)) (declare-function exwm-layout--iconic-state-p "exwm-layout.el" (&optional id))
(declare-function exwm-workspace--count "exwm-workspace.el" ()) (declare-function exwm-workspace--count "exwm-workspace.el" ())
(declare-function exwm-workspace--position "exwm-workspace.el" (frame)) (declare-function exwm-workspace--position "exwm-workspace.el" (frame))
@ -318,7 +319,7 @@ You can still make the X windows floating afterwards."
(exwm-manage--update-ewmh-state id) (exwm-manage--update-ewmh-state id)
(with-current-buffer (exwm--id->buffer id) (with-current-buffer (exwm--id->buffer id)
(when (or (plist-get exwm--configurations 'fullscreen) (when (or (plist-get exwm--configurations 'fullscreen)
(memq xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state)) (exwm-layout--fullscreen-p))
(setq exwm--ewmh-state (delq xcb:Atom:_NET_WM_STATE_FULLSCREEN (setq exwm--ewmh-state (delq xcb:Atom:_NET_WM_STATE_FULLSCREEN
exwm--ewmh-state)) exwm--ewmh-state))
(exwm-layout-set-fullscreen id)) (exwm-layout-set-fullscreen id))
@ -533,7 +534,7 @@ border-width: %d; sibling: #x%x; stack-mode: %d"
border-width sibling stack-mode) border-width sibling stack-mode)
(if (and (setq buffer (exwm--id->buffer window)) (if (and (setq buffer (exwm--id->buffer window))
(with-current-buffer buffer (with-current-buffer buffer
(or (memq xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state) (or (exwm-layout--fullscreen-p)
;; Make sure it's a floating X window wanting to resize ;; Make sure it's a floating X window wanting to resize
;; itself. ;; itself.
(or (not exwm--floating-frame) (or (not exwm--floating-frame)
@ -559,7 +560,7 @@ border-width: %d; sibling: #x%x; stack-mode: %d"
;; Send client message for managed windows ;; Send client message for managed windows
(with-current-buffer buffer (with-current-buffer buffer
(setq edges (setq edges
(if (memq xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state) (if (exwm-layout--fullscreen-p)
(with-slots (x y width height) (with-slots (x y width height)
(exwm-workspace--get-geometry exwm--frame) (exwm-workspace--get-geometry exwm--frame)
(list x y width height)) (list x y width height))

View file

@ -128,6 +128,7 @@ Please manually run the hook `exwm-workspace-list-change-hook' afterwards.")
(defvar exwm-manage--desktop) (defvar exwm-manage--desktop)
(declare-function exwm--exit "exwm.el") (declare-function exwm--exit "exwm.el")
(declare-function exwm-input--on-buffer-list-update "exwm-input.el" ()) (declare-function exwm-input--on-buffer-list-update "exwm-input.el" ())
(declare-function exwm-layout--fullscreen-p "exwm-layout.el" ())
(declare-function exwm-layout--hide "exwm-layout.el" (id)) (declare-function exwm-layout--hide "exwm-layout.el" (id))
(declare-function exwm-layout--other-buffer-predicate "exwm-layout.el" (declare-function exwm-layout--other-buffer-predicate "exwm-layout.el"
(buffer)) (buffer))
@ -504,7 +505,7 @@ for internal use only."
((null current-prefix-arg) ((null current-prefix-arg)
(unless (and (eq major-mode 'exwm-mode) (unless (and (eq major-mode 'exwm-mode)
;; The prompt is invisible in fullscreen mode. ;; The prompt is invisible in fullscreen mode.
(memq xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state)) (exwm-layout--fullscreen-p))
(let ((exwm-workspace--prompt-add-allowed t) (let ((exwm-workspace--prompt-add-allowed t)
(exwm-workspace--prompt-delete-allowed t)) (exwm-workspace--prompt-delete-allowed t))
(exwm-workspace--prompt-for-workspace "Switch to [+/-]: ")))) (exwm-workspace--prompt-for-workspace "Switch to [+/-]: "))))
@ -631,7 +632,7 @@ Passing a workspace frame as the first option is for internal use only."
(interactive (interactive
(unless (and (eq major-mode 'exwm-mode) (unless (and (eq major-mode 'exwm-mode)
;; The prompt is invisible in fullscreen mode. ;; The prompt is invisible in fullscreen mode.
(memq xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state)) (exwm-layout--fullscreen-p))
(let (w1 w2) (let (w1 w2)
(let ((exwm-workspace--prompt-add-allowed t) (let ((exwm-workspace--prompt-add-allowed t)
(exwm-workspace--prompt-delete-allowed t)) (exwm-workspace--prompt-delete-allowed t))
@ -671,7 +672,7 @@ before it."
((null current-prefix-arg) ((null current-prefix-arg)
(unless (and (eq major-mode 'exwm-mode) (unless (and (eq major-mode 'exwm-mode)
;; The prompt is invisible in fullscreen mode. ;; The prompt is invisible in fullscreen mode.
(memq xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state)) (exwm-layout--fullscreen-p))
(list exwm-workspace--current (list exwm-workspace--current
(exwm-workspace--position (exwm-workspace--position
(exwm-workspace--prompt-for-workspace "Move workspace to: "))))) (exwm-workspace--prompt-for-workspace "Move workspace to: ")))))

14
exwm.el
View file

@ -110,7 +110,7 @@
(interactive) (interactive)
(with-current-buffer (window-buffer) (with-current-buffer (window-buffer)
(when (eq major-mode 'exwm-mode) (when (eq major-mode 'exwm-mode)
(when (memq xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state) (when (exwm-layout--fullscreen-p)
(exwm-layout-unset-fullscreen)) (exwm-layout-unset-fullscreen))
;; Force refresh ;; Force refresh
(exwm-layout--refresh) (exwm-layout--refresh)
@ -484,8 +484,7 @@
exwm--connection exwm--connection
(make-instance 'xcb:ewmh:set-_NET_WM_STATE (make-instance 'xcb:ewmh:set-_NET_WM_STATE
:window id :window id
:data (vector :data (vector xcb:Atom:_NET_WM_STATE_FULLSCREEN)))
xcb:Atom:_NET_WM_STATE_FULLSCREEN)))
(xcb:flush exwm--connection)) (xcb:flush exwm--connection))
(when buffer ;ensure it's managed (when buffer ;ensure it's managed
(with-current-buffer buffer (with-current-buffer buffer
@ -493,17 +492,14 @@
(when (or (memq xcb:Atom:_NET_WM_STATE_FULLSCREEN props) (when (or (memq xcb:Atom:_NET_WM_STATE_FULLSCREEN props)
(memq xcb:Atom:_NET_WM_STATE_ABOVE props)) (memq xcb:Atom:_NET_WM_STATE_ABOVE props))
(cond ((= action xcb:ewmh:_NET_WM_STATE_ADD) (cond ((= action xcb:ewmh:_NET_WM_STATE_ADD)
(unless (memq xcb:Atom:_NET_WM_STATE_FULLSCREEN (unless (exwm-layout--fullscreen-p)
exwm--ewmh-state)
(exwm-layout-set-fullscreen id)) (exwm-layout-set-fullscreen id))
(push xcb:Atom:_NET_WM_STATE_FULLSCREEN props-new)) (push xcb:Atom:_NET_WM_STATE_FULLSCREEN props-new))
((= action xcb:ewmh:_NET_WM_STATE_REMOVE) ((= action xcb:ewmh:_NET_WM_STATE_REMOVE)
(when (memq xcb:Atom:_NET_WM_STATE_FULLSCREEN (when (exwm-layout--fullscreen-p)
exwm--ewmh-state)
(exwm-layout-unset-fullscreen id))) (exwm-layout-unset-fullscreen id)))
((= action xcb:ewmh:_NET_WM_STATE_TOGGLE) ((= action xcb:ewmh:_NET_WM_STATE_TOGGLE)
(if (memq xcb:Atom:_NET_WM_STATE_FULLSCREEN (if (exwm-layout--fullscreen-p)
exwm--ewmh-state)
(exwm-layout-unset-fullscreen id) (exwm-layout-unset-fullscreen id)
(exwm-layout-set-fullscreen id) (exwm-layout-set-fullscreen id)
(push xcb:Atom:_NET_WM_STATE_FULLSCREEN props-new))))) (push xcb:Atom:_NET_WM_STATE_FULLSCREEN props-new)))))