【发布时间】:2021-10-09 20:53:28
【问题描述】:
在我的 reparenting 窗口管理器中,我有一些代码来创建框架窗口:
let screen = &self.conn.setup().roots[self.scrno];
let geom = self.conn.get_geometry(ev.window)?.reply()?;
let attr = self.conn.get_window_attributes(ev.window)?.reply()?;
let frame_win = self.conn.generate_id()?;
let frame_cmap = self.conn.generate_id()?;
self.conn.create_colormap(
xproto::ColormapAlloc::NONE,
frame_cmap,
ev.window,
attr.visual,
)?;
self.conn
.change_property32(
xproto::PropMode::REPLACE,
ev.window,
self.net_atoms[ewmh::Net::WMWindowOpacity as usize],
xproto::AtomEnum::CARDINAL,
&[1],
)?
.check()?;
let win_aux = xproto::CreateWindowAux::new()
.event_mask(
xproto::EventMask::EXPOSURE
| xproto::EventMask::SUBSTRUCTURE_REDIRECT
| xproto::EventMask::SUBSTRUCTURE_NOTIFY
| xproto::EventMask::BUTTON_PRESS
| xproto::EventMask::BUTTON_RELEASE
| xproto::EventMask::POINTER_MOTION
| xproto::EventMask::ENTER_WINDOW
| xproto::EventMask::PROPERTY_CHANGE,
)
.background_pixel(self.config.background_pixel)
.border_pixel(self.config.border_pixel)
.colormap(frame_cmap);
self.conn.create_window(
geom.depth,
frame_win,
screen.root,
geom.x,
geom.y,
geom.width,
geom.height + self.config.title_height as u16,
self.config.border_width as u16,
xproto::WindowClass::INPUT_OUTPUT,
attr.visual,
&win_aux,
)?;
我遇到的问题是,当 attr.depth 为 32 时(我尊重它而不是 COPY_FROM_PARENT 以便透明度起作用,请参阅Opacity in a reparenting WM),框架窗口最终也是透明的。那不是我想要的。 (当然,只有在合成器运行时)
如果 background_pixel 是纯色,为什么窗口背景是透明的,我该如何解决这个问题?
【问题讨论】: