From 3dbf1b1bed96d9ac3ee2718134ded619f46951bb Mon Sep 17 00:00:00 2001 From: Chris Feng Date: Sun, 29 Mar 2020 00:00:00 +0000 Subject: Add support for _NET_WM_STATE_HIDDEN * exwm-layout.el (exwm-layout--set-ewmh-state): New function for setting _NET_WM_STATE (according to local state). * exwm.el (exwm--init-icccm-ewmh): Declare the support for this atom. --- exwm-layout.el | 23 ++++++++++++++++------- exwm.el | 2 +- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/exwm-layout.el b/exwm-layout.el index cb7ad56ed040..170c2bece2c7 100644 --- a/exwm-layout.el +++ b/exwm-layout.el @@ -80,6 +80,14 @@ (buffer-local-value 'exwm-state (exwm--id->buffer id)) exwm-state))) +(defun exwm-layout--set-ewmh-state (xwin) + "Set _NET_WM_STATE." + (with-current-buffer (exwm--id->buffer xwin) + (xcb:+request exwm--connection + (make-instance 'xcb:ewmh:set-_NET_WM_STATE + :window exwm--id + :data exwm--ewmh-state)))) + (defun exwm-layout--fullscreen-p () (when (derived-mode-p 'exwm-mode) (memq xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state))) @@ -135,6 +143,9 @@ (exwm--set-geometry id x y width height) (xcb:+request exwm--connection (make-instance 'xcb:MapWindow :window id)) (exwm-layout--set-state id xcb:icccm:WM_STATE:NormalState) + (setq exwm--ewmh-state + (delq xcb:Atom:_NET_WM_STATE_HIDDEN exwm--ewmh-state)) + (exwm-layout--set-ewmh-state id) (exwm-layout--auto-iconify))) (xcb:flush exwm--connection)) @@ -168,6 +179,8 @@ :window id :value-mask xcb:CW:EventMask :event-mask (exwm--get-client-event-mask))) (exwm-layout--set-state id xcb:icccm:WM_STATE:IconicState) + (cl-pushnew xcb:Atom:_NET_WM_STATE_HIDDEN exwm--ewmh-state) + (exwm-layout--set-ewmh-state id) (exwm-layout--auto-iconify) (xcb:flush exwm--connection)))) @@ -191,13 +204,10 @@ xcb:ConfigWindow:StackMode) :border-width 0 :stack-mode xcb:StackMode:Above)) - (xcb:+request exwm--connection - (make-instance 'xcb:ewmh:set-_NET_WM_STATE - :window exwm--id - :data (vector xcb:Atom:_NET_WM_STATE_FULLSCREEN))) + (cl-pushnew xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state) + (exwm-layout--set-ewmh-state id) (xcb:flush exwm--connection) (set-window-dedicated-p (get-buffer-window) t) - (cl-pushnew xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state) (exwm-input--release-keyboard exwm--id))) ;;;###autoload @@ -223,8 +233,7 @@ (let ((window (get-buffer-window nil t))) (when window (exwm-layout--show exwm--id window)))) - (xcb:+request exwm--connection - (make-instance 'xcb:ewmh:set-_NET_WM_STATE :window exwm--id :data [])) + (exwm-layout--set-ewmh-state id) (xcb:flush exwm--connection) (set-window-dedicated-p (get-buffer-window) nil) (when (eq 'line-mode exwm--selected-input-mode) diff --git a/exwm.el b/exwm.el index 112f42db1f08..09192faec4cb 100644 --- a/exwm.el +++ b/exwm.el @@ -673,7 +673,7 @@ ;; xcb:Atom:_NET_WM_STATE_SHADED ;; xcb:Atom:_NET_WM_STATE_SKIP_TASKBAR ;; xcb:Atom:_NET_WM_STATE_SKIP_PAGER - ;; xcb:Atom:_NET_WM_STATE_HIDDEN + xcb:Atom:_NET_WM_STATE_HIDDEN xcb:Atom:_NET_WM_STATE_FULLSCREEN ;; xcb:Atom:_NET_WM_STATE_ABOVE ;; xcb:Atom:_NET_WM_STATE_BELOW -- cgit 1.4.1