From 7f12d9fc7a88369a479ed2f0489ff3b10b347d13 Mon Sep 17 00:00:00 2001 From: Chris Feng Date: Fri, 15 Jul 2016 20:04:56 +0800 Subject: Add multi-dock support and fix fullscreen issues with dock * exwm.el (exwm--update-strut-legacy, exwm--update-strut-partial) (exwm--update-strut): Rename (strut => struts). * exwm-manage.el (exwm-manage--manage-window): Listen for UnmapNotify/DestroyNotify events of docks to stop tracking them. (exwm-manage--unmanage-window): Remove dock from tracking list when it's unmapped/destroyed. * exwm-workspace.el (exwm-workspace--id-struts-alist): New variable for tracking docks. (exwm-workspace--struts): Now it stores merged struts. (exwm-workspace--update-struts): New function for doing the 'merge'. * exwm.el (exwm--update-struts-legacy, exwm--update-struts-partial): Now update struts for multiple docks. * exwm-layout.el (exwm-layout-set-fullscreen) (exwm-layout-unset-fullscreen): * exwm-manage.el (exwm-manage--unmanage-window): Fix fullscreen mode with dock. * exwm-workspace.el (exwm-workspace--set-fullscreen): Add optional arguments for ignoring struts / resizing container only. (exwm-workspace-switch): Restack workspace/docks appropriately. --- exwm-manage.el | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) (limited to 'exwm-manage.el') diff --git a/exwm-manage.el b/exwm-manage.el index 13948902d281..359782229de2 100644 --- a/exwm-manage.el +++ b/exwm-manage.el @@ -86,7 +86,7 @@ corresponding buffer.") (declare-function exwm--update-title "exwm.el" (id)) (declare-function exwm--update-hints "exwm.el" (id &optional force)) (declare-function exwm--update-protocols "exwm.el" (id &optional force)) -(declare-function exwm--update-strut "exwm.el" (id)) +(declare-function exwm--update-struts "exwm.el" (id)) (declare-function exwm-floating--set-floating "exwm-floating.el" (id)) (declare-function exwm-floating--unset-floating "exwm-floating.el" (id)) (declare-function exwm-workspace--set-desktop "exwm-workspace.el" (id)) @@ -133,7 +133,7 @@ corresponding buffer.") (exwm--log "No need to manage #x%x" id) ;; Update struts. (when (memq xcb:Atom:_NET_WM_WINDOW_TYPE_DOCK exwm-window-type) - (exwm--update-strut id)) + (exwm--update-struts id)) ;; Remove all events (xcb:+request exwm--connection (make-instance 'xcb:ChangeWindowAttributes @@ -141,8 +141,9 @@ corresponding buffer.") :event-mask (if (memq xcb:Atom:_NET_WM_WINDOW_TYPE_DOCK exwm-window-type) - ;; Listen for change of struts property of dock. - xcb:EventMask:PropertyChange + ;; Listen for PropertyChange (struts) and + ;; UnmapNotify/DestroyNotify event of the dock. + exwm--client-event-mask xcb:EventMask:NoEvent))) ;; The window needs to be mapped (xcb:+request exwm--connection @@ -247,6 +248,15 @@ corresponding buffer.") (with-current-buffer (exwm--id->buffer id) (run-hooks 'exwm-manage-finish-hook))))) +(defvar exwm-workspace--id-struts-alist) +(defvar exwm-workspace--list) + +(declare-function exwm-workspace--update-struts "exwm-workspace.el" ()) +(declare-function exwm-workspace--set-fullscreen "exwm-workspace.el" + (frame &optional no-struts container-only)) +(declare-function exwm-workspace--set-workareas "exwm-workspace.el" + (&optional workareas)) + (defun exwm-manage--unmanage-window (id &optional withdraw-only) "Unmanage window ID. @@ -257,6 +267,14 @@ manager is shutting down." (exwm--log "Unmanage #x%x (buffer: %s, widthdraw: %s)" id buffer withdraw-only) (setq exwm--id-buffer-alist (assq-delete-all id exwm--id-buffer-alist)) + ;; Update workspaces when a dock is destroyed. + (when (assq id exwm-workspace--id-struts-alist) + (setq exwm-workspace--id-struts-alist + (assq-delete-all id exwm-workspace--id-struts-alist)) + (exwm-workspace--update-struts) + (dolist (f exwm-workspace--list) + (exwm-workspace--set-fullscreen f)) + (exwm-workspace--set-workareas)) (when (buffer-live-p buffer) (with-current-buffer buffer ;; Flickering seems unavoidable here if the DestroyWindow request is @@ -314,6 +332,9 @@ manager is shutting down." (xcb:+request exwm--connection (make-instance 'xcb:ReparentWindow :window window :parent exwm--root :x 0 :y 0)))) + ;; Restore the workspace if this X window is currently fullscreen. + (when exwm--fullscreen + (exwm-workspace--set-fullscreen exwm--frame)) ;; Destroy the X window container (and the frame container if any). (xcb:+request exwm--connection (make-instance 'xcb:DestroyWindow :window exwm--container)) -- cgit 1.4.1