mirror of
https://github.com/emacs-exwm/exwm.git
synced 2024-11-23 21:17:59 +01:00
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:
parent
563cba2abc
commit
e43bd78258
2 changed files with 32 additions and 4 deletions
15
exwm-core.el
15
exwm-core.el
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue