diff options
author | Chris Feng <chris.w.feng@gmail.com> | 2016-07-13T10·51+0800 |
---|---|---|
committer | Chris Feng <chris.w.feng@gmail.com> | 2016-07-13T11·36+0800 |
commit | 6c8255bf3978a4df3d76ffd6f7d6bbdbba8bba19 (patch) | |
tree | d48859b6a960edfb29ab9e6f623b1401ad337500 /exwm-floating.el | |
parent | eee5c6fa4dd776c1604e5ec7db34bc5401d8dea6 (diff) |
Add/improve some ICCCM/EWMH features
* exwm-floating.el (exwm-floating--set-allowed-actions) (exwm-floating--set-floating, exwm-floating--unset-floating): Add _NET_WM_ALLOWED_ACTIONS support. * exwm-floating.el (exwm-floating--set-floating) (exwm-floating--unset-floating): Support initial state hint. * exwm.el (exwm--update-hints): Fetch initial state. (exwm--update-state, exwm--on-PropertyNotify): WM_STATE is not intended to be read. * exwm-core.el (exwm-state): * exwm-floating.el (exwm-floating-hide): * exwm-input.el (exwm-input--update-focus): * exwm-layout.el (exwm-layout--set-state) (exwm-layout--iconic-state-p, exwm-layout--show, exwm-layout--hide): * exwm-manage.el (exwm-manage--on-MapRequest): Improve WM_STATE support. * exwm-input.el (exwm-input--set-focus): * exwm-input.el (exwm-input--update-focus) (exwm-input--set-active-window): * exwm.el (exwm--on-ClientMessage): Add _NET_ACTIVE_WINDOW support. * exwm-layout.el (exwm-layout--set-client-list-stacking): Improve _NET_CLIENT_LIST_STACKING support. * exwm-manage.el (exwm-manage--set-client-list) (exwm-manage--manage-window, exwm-manage--unmanage-window): Improve _NET_CLIENT_LIST support. * exwm-manage.el (exwm-manage--manage-window): * exwm-workspace.el (exwm-workspace--set-desktop) (exwm-workspace-move-window): * exwm.el (exwm--on-ClientMessage): Add _NET_WM_DESKTOP support. * exwm-randr.el (exwm-randr--refresh): * exwm-workspace.el (exwm-workspace--set-desktop-geometry) (exwm-workspace--init): Add _NET_DESKTOP_GEOMETRY support. * exwm-workspace.el (exwm-workspace--set-desktop-geometry): Renamed from `exwm-workspace--update-desktop-geometry'. * exwm-randr.el (exwm-randr--refresh): Improve _NET_WORKAREA support. * exwm-workspace.el (exwm-workspace--set-fullscreen): Correct variables names. * exwm-workspace.el (exwm-workspace--init): * exwm.el (exwm--init-icccm-ewmh): Set _NET_NUMBER_OF_DESKTOPS in workspace module. * exwm-workspace.el (exwm-workspace--init): * exwm.el (exwm--init-icccm-ewmh): Set _NET_DESKTOP_VIEWPORT in workspace module. * exwm.el (exwm--on-ClientMessage): Improve _NET_CURRENT_DESKTOP support. * exwm.el (exwm--on-ClientMessage): Add _NET_CLOSE_WINDOW support. * exwm.el (exwm--on-ClientMessage): Add WM_CHANGE_STATE support. * exwm.el (exwm--init-icccm-ewmh): Update supported atoms.
Diffstat (limited to 'exwm-floating.el')
-rw-r--r-- | exwm-floating.el | 46 |
1 files changed, 37 insertions, 9 deletions
diff --git a/exwm-floating.el b/exwm-floating.el index d4f57b73d2f9..9d4d948d30a9 100644 --- a/exwm-floating.el +++ b/exwm-floating.el @@ -49,13 +49,31 @@ (defvar exwm-floating--cursor-bottom-left nil) (defvar exwm-floating--cursor-left nil) +(defun exwm-floating--set-allowed-actions (id tilling) + "Set _NET_WM_ALLOWED_ACTIONS." + (xcb:+request exwm--connection + (make-instance 'xcb:ewmh:set-_NET_WM_ALLOWED_ACTIONS + :window id + :data (if tilling + (vector xcb:Atom:_NET_WM_ACTION_MINIMIZE + xcb:Atom:_NET_WM_ACTION_FULLSCREEN + xcb:Atom:_NET_WM_ACTION_CHANGE_DESKTOP + xcb:Atom:_NET_WM_ACTION_CLOSE) + (vector xcb:Atom:_NET_WM_ACTION_MOVE + xcb:Atom:_NET_WM_ACTION_RESIZE + xcb:Atom:_NET_WM_ACTION_MINIMIZE + xcb:Atom:_NET_WM_ACTION_FULLSCREEN + xcb:Atom:_NET_WM_ACTION_CHANGE_DESKTOP + xcb:Atom:_NET_WM_ACTION_CLOSE))))) + (defvar exwm-workspace--current) (defvar exwm-workspace--list) (defvar exwm-workspace-current-index) (defvar exwm-workspace--switch-history-outdated) -(declare-function exwm-layout--refresh "exwm-layout.el") -(declare-function exwm-layout--show "exwm-layout.el") +(declare-function exwm-layout--refresh "exwm-layout.el" ()) +(declare-function exwm-layout--show "exwm-layout.el" (id &optional window)) +(declare-function exwm-layout--iconic-state-p "exwm-layout.el" (&optional id)) (defun exwm-floating--set-floating (id) "Make window ID floating." @@ -205,6 +223,7 @@ xcb:ConfigWindow:Y)) :x (- x exwm-floating-border-width) :y (- y exwm-floating-border-width))) + (exwm-floating--set-allowed-actions id nil) (xcb:flush exwm--connection) ;; Set window/buffer (with-current-buffer (exwm--id->buffer id) @@ -217,9 +236,13 @@ (add-hook 'window-configuration-change-hook #'exwm-layout--refresh) (set-window-dedicated-p window t) (exwm-layout--show id window)) - (with-selected-frame exwm-workspace--current - (exwm-layout--refresh)) - (select-frame-set-input-focus frame)) + (if (exwm-layout--iconic-state-p id) + ;; Hide iconic floating X windows. + (with-current-buffer (exwm--id->buffer id) + (exwm-floating-hide)) + (with-selected-frame exwm-workspace--current + (exwm-layout--refresh)) + (select-frame-set-input-focus frame))) (run-hooks 'exwm-floating-setup-hook) ;; Redraw the frame. (redisplay)) @@ -269,6 +292,7 @@ :sibling (frame-parameter exwm-workspace--current 'exwm-container) :stack-mode xcb:StackMode:Above))) + (exwm-floating--set-allowed-actions id t) (xcb:flush exwm--connection) (with-current-buffer buffer (when exwm--floating-frame ;from floating to non-floating @@ -278,9 +302,11 @@ (setq window-size-fixed nil exwm--floating-frame nil exwm--frame exwm-workspace--current)) - (let ((window (frame-selected-window exwm-workspace--current))) - (set-window-buffer window buffer) - (select-window window))) + (unless (exwm-layout--iconic-state-p) + ;; Only show X windows in normal state. + (let ((window (frame-selected-window exwm-workspace--current))) + (set-window-buffer window buffer) + (select-window window)))) (run-hooks 'exwm-floating-exit-hook)) ;;;###autoload @@ -292,6 +318,8 @@ (exwm-floating--unset-floating exwm--id) (exwm-floating--set-floating exwm--id)))) +(declare-function exwm-layout--set-state "exwm-layout.el" (id state)) + ;;;###autoload (defun exwm-floating-hide () "Hide the current floating X window (which would show again when selected)." @@ -304,7 +332,7 @@ :window exwm--container :value-mask xcb:ConfigWindow:StackMode :stack-mode xcb:StackMode:Below)) - ;; FIXME: Should it be put into iconic state? + (exwm-layout--set-state exwm--id xcb:icccm:WM_STATE:IconicState) (xcb:flush exwm--connection) (select-frame-set-input-focus exwm-workspace--current))) |