about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAdrián Medraño Calvo <adrian@medranocalvo.com>2022-03-24T00·00+0000
committerAdrián Medraño Calvo <adrian@medranocalvo.com>2022-03-24T00·00+0000
commite43bd782580fc7f2aa7f5f92da1c5d7c992b6d1c (patch)
tree7c7305097a1950c4924a556fbf067acfbe7ab84f
parent563cba2abcfe1df6ed433dc09f6ef412a8e2c706 (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.
-rw-r--r--exwm-core.el15
-rw-r--r--exwm-workspace.el21
2 files changed, 32 insertions, 4 deletions
diff --git a/exwm-core.el b/exwm-core.el
index 5356ef9b97e1..995b590dc582 100644
--- a/exwm-core.el
+++ b/exwm-core.el
@@ -193,6 +193,21 @@ least SECS seconds later."
               (lsh (lsh (pop rgb) -8) 8)
               (lsh (pop rgb) -8)))))
 
+(defun exwm--get-visual-depth-colormap (conn id)
+  "Get visual, depth and colormap from X window ID.
+Return a three element list with the respective results."
+  (let (ret-visual ret-depth ret-colormap)
+    (with-slots (visual colormap)
+        (xcb:+request-unchecked+reply conn
+            (make-instance 'xcb:GetWindowAttributes :window id))
+      (setq ret-visual visual)
+      (setq ret-colormap colormap))
+    (with-slots (depth)
+        (xcb:+request-unchecked+reply conn
+            (make-instance 'xcb:GetGeometry :drawable id))
+      (setq ret-depth depth))
+    (list ret-visual ret-depth ret-colormap)))
+
 ;; Internal variables
 (defvar-local exwm--id nil)               ;window ID
 (defvar-local exwm--configurations nil)   ;initial configurations.
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