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.
This commit is contained in:
Adrián Medraño Calvo 2022-03-24 00:00:00 +00:00
parent 563cba2abc
commit e43bd78258
2 changed files with 32 additions and 4 deletions

View file

@ -193,6 +193,21 @@ least SECS seconds later."
(lsh (lsh (pop rgb) -8) 8) (lsh (lsh (pop rgb) -8) 8)
(lsh (pop rgb) -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 ;; Internal variables
(defvar-local exwm--id nil) ;window ID (defvar-local exwm--id nil) ;window ID
(defvar-local exwm--configurations nil) ;initial configurations. (defvar-local exwm--configurations nil) ;initial configurations.

View file

@ -1326,7 +1326,8 @@ Please check `exwm-workspace--minibuffer-own-frame-p' first."
(let ((outer-id (string-to-number (frame-parameter frame (let ((outer-id (string-to-number (frame-parameter frame
'outer-window-id))) 'outer-window-id)))
(window-id (string-to-number (frame-parameter frame '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 ;; Save window IDs
(set-frame-parameter frame 'exwm-outer-id outer-id) (set-frame-parameter frame 'exwm-outer-id outer-id)
(set-frame-parameter frame 'exwm-id window-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 (dolist (param '(exwm-randr-monitor
exwm-geometry)) exwm-geometry))
(set-frame-parameter frame param (frame-parameter w param)))) (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 (xcb:+request exwm--connection
(make-instance 'xcb:CreateWindow (make-instance 'xcb:CreateWindow
:depth 0 :depth frame-depth
:wid container :wid container
:parent exwm--root :parent exwm--root
:x -1 :x -1
@ -1351,10 +1360,14 @@ Please check `exwm-workspace--minibuffer-own-frame-p' first."
:height 1 :height 1
:border-width 0 :border-width 0
:class xcb:WindowClass:InputOutput :class xcb:WindowClass:InputOutput
:visual 0 :visual frame-visual
:value-mask (logior xcb:CW:BackPixmap :value-mask (logior xcb:CW:BackPixmap
xcb:CW:BorderPixel
xcb:CW:Colormap
xcb:CW:OverrideRedirect) xcb:CW:OverrideRedirect)
:background-pixmap xcb:BackPixmap:ParentRelative :background-pixmap xcb:BackPixmap:None
:border-pixel 0
:colormap frame-colormap
:override-redirect 1)) :override-redirect 1))
(xcb:+request exwm--connection (xcb:+request exwm--connection
(make-instance 'xcb:ConfigureWindow (make-instance 'xcb:ConfigureWindow