From 3fb90b9eaac752760fc32404cbd1574b8ef61669 Mon Sep 17 00:00:00 2001 From: Chris Feng Date: Thu, 6 Aug 2015 12:32:14 +0800 Subject: [PATCH] Fix fullscreen issues * Correct ConfigureNotify events sent to fullscreen windows. * Exit fullscreen mode before switching workspace. * Temporarily treat `xcb:Atom:_NET_WM_STATE_ABOVE` as `xcb:Atom:_NET_WM_STATE_FULLSCREEN` since a) "plugin-container" (Flash Player) seems only set this, and b) it's not normally used by applications. This makes fullscreen videos working in e.g. iceweasel. --- exwm-manage.el | 14 +++++++++----- exwm-workspace.el | 5 +++++ exwm.el | 3 ++- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/exwm-manage.el b/exwm-manage.el index afab18e..0d2c74f 100644 --- a/exwm-manage.el +++ b/exwm-manage.el @@ -133,7 +133,7 @@ corresponding buffer.") (exwm-input-grab-keyboard id) (exwm-workspace--update-switch-history) (setq exwm-input--focus-lock nil) ;unlocked in advance - (with-current-buffer (exwm--id->buffer id) + (exwm--with-current-id id (run-hooks 'exwm-manage-finish-hook)))) (setq exwm-input--focus-lock nil)) @@ -266,10 +266,14 @@ corresponding buffer.") (with-slots (window x y width height border-width) obj (if (setq buffer (exwm--id->buffer window)) ;; Send client message for managed windows - (progn - (setq edges (or (with-current-buffer buffer exwm--floating-edges) - (window-inside-absolute-pixel-edges - (get-buffer-window buffer)))) + (with-current-buffer buffer + (setq edges + (if exwm--fullscreen + (list 0 0 + (x-display-pixel-width) (x-display-pixel-height)) + (or exwm--floating-edges + (window-inside-absolute-pixel-edges + (get-buffer-window))))) (xcb:+request exwm--connection (make-instance 'xcb:SendEvent :propagate 0 :destination window diff --git a/exwm-workspace.el b/exwm-workspace.el index 3add212..ed06f64 100644 --- a/exwm-workspace.el +++ b/exwm-workspace.el @@ -111,6 +111,11 @@ The optional FORCE option is for internal use only." (unless (and (<= 0 index) (< index exwm-workspace-number)) (user-error "[EXWM] Workspace index out of range: %d" index)) (when (or force (/= exwm-workspace-current-index index)) + ;; Exit fullscreen mode + (with-current-buffer (window-buffer) + (when (and (eq major-mode 'exwm-mode) exwm--fullscreen) + (exwm-layout-unset-fullscreen) + (exwm-input-grab-keyboard))) (let ((frame (elt exwm-workspace--list index))) (setq exwm-workspace--current frame exwm-workspace-current-index index) diff --git a/exwm.el b/exwm.el index 3f38b66..c8f10af 100644 --- a/exwm.el +++ b/exwm.el @@ -462,7 +462,8 @@ (exwm-floating--set-floating id) (push xcb:Atom:_NET_WM_STATE_MODAL props-new))))) ;; _NET_WM_STATE_FULLSCREEN - (when (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)) (cond ((= action xcb:ewmh:_NET_WM_STATE_ADD) (unless exwm--fullscreen (exwm-layout-set-fullscreen id)) (push xcb:Atom:_NET_WM_STATE_FULLSCREEN props-new))