如何为重父化窗口管理器中depth=32的窗口设置不透明背景
问题原因
你使用客户端窗口的32位视觉创建框架窗口时,32位深度的像素格式包含8位alpha通道,你传入的background_pixel是不含alpha信息的24位RGB值,对应32位像素格式下alpha位为0,合成器会识别为完全透明,所以即使设置了纯色背景也会透出下层内容。
解决方案
最直接的方法是给背景色、边框色补全不透明的alpha通道值,修改代码中CreateWindowAux的配置部分即可:
// 给24位RGB色值补充最高8位alpha通道(0xFF表示完全不透明) let opaque_background = (0xFFu32 << 24) | self.config.background_pixel; let opaque_border = (0xFFu32 << 24) | self.config.border_pixel; 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(opaque_background) .border_pixel(opaque_border) .colormap(frame_cmap);
如果不需要框架窗口支持透明效果,也可以改为使用根窗口的24位深度和视觉创建框架窗口,框架窗口本身无alpha通道,自然不会出现透明问题,客户端窗口仍可保留32位深度实现透明效果。
内容的提问来源于stack exchange,提问作者gsb
相关产品推荐
相关产品推荐

