diff options
author | Adrián Medraño Calvo <adrian@medranocalvo.com> | 2022-03-24T00·00+0000 |
---|---|---|
committer | Adrián Medraño Calvo <adrian@medranocalvo.com> | 2022-03-24T00·00+0000 |
commit | e43bd782580fc7f2aa7f5f92da1c5d7c992b6d1c (patch) | |
tree | 7c7305097a1950c4924a556fbf067acfbe7ab84f /exwm-workspace.el | |
parent | 563cba2abcfe1df6ed433dc09f6ef412a8e2c706 (diff) |
Use 32-bit visual for frame containers
* exwm-core.el (exwm--get-visual-depth-colormap): New function. * exwm-workspace.el (exwm-workspace--add-frame-as-workspace): Use Emacs' frame's visual, depth and colormap. Reset all attributes that refer (also by default) to the parent window (the root window), as it might have a different visual, depth or colormap. Special-thanks-to: Elijah Malaby <qwe12345678910@gmail.com> for figuring out the changes needed to suport 32-bit visuals and proposing the initial version of this improvement.
Diffstat (limited to 'exwm-workspace.el')
-rw-r--r-- | exwm-workspace.el | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/exwm-workspace.el b/exwm-workspace.el index 083c8ac89390..fc68e1b07053 100644 --- a/exwm-workspace.el +++ b/exwm-workspace.el @@ -1326,7 +1326,8 @@ Please check `exwm-workspace--minibuffer-own-frame-p' first." (let ((outer-id (string-to-number (frame-parameter frame 'outer-window-id))) (window-id (string-to-number (frame-parameter frame 'window-id))) - (container (xcb:generate-id exwm--connection))) + (container (xcb:generate-id exwm--connection)) + frame-colormap frame-visual frame-depth) ;; Save window IDs (set-frame-parameter frame 'exwm-outer-id outer-id) (set-frame-parameter frame 'exwm-id window-id) @@ -1340,9 +1341,17 @@ Please check `exwm-workspace--minibuffer-own-frame-p' first." (dolist (param '(exwm-randr-monitor exwm-geometry)) (set-frame-parameter frame param (frame-parameter w param)))) + ;; Support transparency on the container X window when the Emacs frame + ;; does. Note that in addition to setting the visual, colormap and depth + ;; we must also reset the `:border-pixmap', as its default value is + ;; relative to the parent window, which might have a different depth. + (let* ((vdc (exwm--get-visual-depth-colormap exwm--connection outer-id))) + (setq frame-visual (car vdc)) + (setq frame-depth (cadr vdc)) + (setq frame-colormap (caddr vdc))) (xcb:+request exwm--connection (make-instance 'xcb:CreateWindow - :depth 0 + :depth frame-depth :wid container :parent exwm--root :x -1 @@ -1351,10 +1360,14 @@ Please check `exwm-workspace--minibuffer-own-frame-p' first." :height 1 :border-width 0 :class xcb:WindowClass:InputOutput - :visual 0 + :visual frame-visual :value-mask (logior xcb:CW:BackPixmap + xcb:CW:BorderPixel + xcb:CW:Colormap xcb:CW:OverrideRedirect) - :background-pixmap xcb:BackPixmap:ParentRelative + :background-pixmap xcb:BackPixmap:None + :border-pixel 0 + :colormap frame-colormap :override-redirect 1)) (xcb:+request exwm--connection (make-instance 'xcb:ConfigureWindow |