diff --git a/exwm-manage.el b/exwm-manage.el index 1dfd3c9..2ec21b3 100644 --- a/exwm-manage.el +++ b/exwm-manage.el @@ -37,6 +37,8 @@ You can still make the X windows floating afterwards.") "Normal hook run after a window is just managed, in the context of the corresponding buffer.") +(defvar exwm-manage--desktop nil "The desktop X window.") + (defun exwm-manage--update-geometry (id &optional force) "Update window geometry." (with-current-buffer (exwm--id->buffer id) @@ -198,6 +200,16 @@ corresponding buffer.") :y (/ (- (exwm-workspace--current-height) height) 2))))) + ;; Check for desktop. + (when (memq xcb:Atom:_NET_WM_WINDOW_TYPE_DESKTOP exwm-window-type) + ;; There should be only one desktop X window. + (setq exwm-manage--desktop id) + ;; Put it at bottom. + (xcb:+request exwm--connection + (make-instance 'xcb:ConfigureWindow + :window id + :value-mask xcb:ConfigWindow:StackMode + :stack-mode xcb:StackMode:Below))) (xcb:flush exwm--connection) (setq exwm--id-buffer-alist (assq-delete-all id exwm--id-buffer-alist)) (let ((kill-buffer-query-functions nil)) diff --git a/exwm-workspace.el b/exwm-workspace.el index 3d3a542..fec83d9 100644 --- a/exwm-workspace.el +++ b/exwm-workspace.el @@ -29,6 +29,8 @@ (require 'exwm-core) +(defvar exwm-manage--desktop) + (defvar exwm-workspace-number 1 "Initial number of workspaces.") (defvar exwm-workspace--list nil "List of all workspaces (Emacs frames).") (defvar exwm-workspace--current nil "Current active workspace.") @@ -369,11 +371,17 @@ If the minibuffer is detached, this value is 0.") :value-mask (logior xcb:ConfigWindow:X xcb:ConfigWindow:Y xcb:ConfigWindow:Width + (if exwm-manage--desktop + xcb:ConfigWindow:Sibling + 0) xcb:ConfigWindow:StackMode) :x (aref workarea 0) :y y :width width - :stack-mode xcb:StackMode:Below)) + :sibling exwm-manage--desktop + :stack-mode (if exwm-manage--desktop + xcb:StackMode:Above + xcb:StackMode:Below))) (xcb:+request exwm--connection (make-instance 'xcb:ConfigureWindow :window (frame-parameter exwm-workspace--minibuffer @@ -987,8 +995,14 @@ Please check `exwm-workspace--minibuffer-own-frame-p' first." (make-instance 'xcb:ConfigureWindow :window (frame-parameter exwm-workspace--minibuffer 'exwm-container) - :value-mask xcb:ConfigWindow:StackMode - :stack-mode xcb:StackMode:Below)) + :value-mask (logior (if exwm-manage--desktop + xcb:ConfigWindow:Sibling + 0) + xcb:ConfigWindow:StackMode) + :sibling exwm-manage--desktop + :stack-mode (if exwm-manage--desktop + xcb:StackMode:Above + xcb:StackMode:Below))) (xcb:flush exwm--connection)) (defun exwm-workspace--on-minibuffer-setup ()