【发布时间】:2021-12-05 01:13:09
【问题描述】:
由于某种原因,在我的重设 WM 中,我根本无法在深度为 32 的 X11 窗口上绘图。我已经尝试使用 Xft 来绘制文本、绘制矩形、绘制文本的内置功能......在深度 32 的窗口上什么都没有显示。这就是我使用 X11rb 库绘制窗口的方式:
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.active_border_pixel)
.colormap(attr.colormap);
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,
)?;
self.conn.grab_server()?.check()?;
self.conn
.change_save_set(xproto::SetMode::INSERT, ev.window)?
.check()?;
self.conn
.reparent_window(ev.window, frame_win, 0, self.config.title_height as i16)?
.check()?;
self.conn.map_window(ev.window)?.check()?;
self.conn.map_window(frame_win)?.check()?;
我该如何解决这个问题?
【问题讨论】:
-
我的怀疑是唯一不同的东西一定是独特的平局,因此它一定是一个问题。
-
无论您是否使用 Xft,看起来都会发生这种情况;这个问题通常只是绘制到 32 位窗口。
-
如何绘制到窗口?我认为核心协议最终应该总是使用零的 alpha,所以在你的窗口中“一堆洞”。您可以尝试将背景像素设置为“可见”(
0xffff0000或其他),然后检查您的绘图是否在其中“打孔”。 -
另外:您的代码示例显示了使用 x11rb 的 Rust 代码。您的问题说您使用 Xft(AFAIK 这个库仅适用于 Xlib),并且您的标签说您正在使用 xcb。你在用什么?
-
最初,我使用 Xft 并与 xlib 进行交互。后来我意识到框架窗口上没有绘图原语,所以我编辑了这个问题以使其更通用。我的背景颜色确实有 FF 的 alpha,但我也会尝试使用该颜色。谢谢!
标签: x11