本文介绍了如何为Depth=32的窗口设置不透明背景的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在我的父子关系窗口管理器中,我有一些创建框架窗口的代码:
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.Deep为32时(我尊重它而不是Copy_from_Parent,以便透明工作,请参见Opacity in a reparenting WM),框架窗口最终也是透明的。这不是我想要的。(当然,仅当合成器运行时)
如果back_Pixel是纯色,为什么窗口背景是透明的,以及如何解决此问题?
推荐答案
我不再那么确定我的第一个答案,但我会再试一次。
您写道:
纯色到底是什么意思?这种纯色从何而来?尝试使用0xffffffff
作为此值,并查看这是否会起作用。在任何正常的X11服务器上,它应该是完全不透明的白色(&q;)。因为您正在查看Awesom的源代码,所以请查看它的color.c
。一个Alpha组件被固定在X11的设计上。因此,所有的X11&q;都假装不存在透明度。color.c
中有一条关于如何猜测将Alpha组件放置在何处的注释。
我预计大多数X11服务器使用像0xAARRGGBB
这样的像素值,因此0x80ff0000
将是半透明红色。但这是一个比color.c
更糟糕的猜测。
这篇关于如何为Depth=32的窗口设置不透明背景的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!