使用X Composite扩展创建X11 overlay窗口无法绘制内容求助
问题原因
- 缺少Composite扩展初始化流程:代码没有验证Composite扩展是否可用、也没有对根窗口启用复合重定向,
XCompositeGetOverlayWindow调用不会返回可用窗口。 - 绘制颜色alpha通道为0:overlay窗口默认使用带alpha通道的32位视觉,你调用
WhitePixel获取的是默认24位视觉的白色值,对应32位格式下alpha通道值为0,绘制的线条完全透明,肉眼不可见。 - 多余的窗口映射操作:
XCompositeGetOverlayWindow返回的窗口默认已经处于映射状态,手动调用XMapWindow无实际作用。 - 未设置窗口属性规避窗口管理器拦截:没有设置
override_redirect属性,openbox可能会对窗口的层级、显示策略做拦截修改。
修复后的代码
#include <stdio.h> #include <X11/Xlib.h> #include <X11/extensions/Xcomposite.h> #include <X11/Xutil.h> int main() { Display *display = XOpenDisplay(NULL); if (display == NULL) { fprintf(stderr, "Couldn't establish connection with X Server\n"); return 1; } // 初始化Composite扩展 int composite_opcode, composite_event, composite_error; if (!XQueryExtension(display, "Composite", &composite_opcode, &composite_event, &composite_error)) { fprintf(stderr, "Composite extension not available\n"); XCloseDisplay(display); return 1; } int major, minor; XCompositeQueryVersion(display, &major, &minor); // 对根窗口启用复合重定向 XCompositeRedirectSubwindows(display, DefaultRootWindow(display), CompositeRedirectAutomatic); int screen_id = DefaultScreen(display); Window parent = XRootWindow(display, screen_id); Window overlay_window = XCompositeGetOverlayWindow(display, parent); // 设置override_redirect规避窗口管理器拦截 XSetWindowAttributes attrs = {.override_redirect = True}; XChangeWindowAttributes(display, overlay_window, CWOverrideRedirect, &attrs); // 创建带alpha通道的不透明白色画笔 XGCValues gc_val; gc_val.foreground = 0xFFFFFFFF; GC gc = XCreateGC(display, overlay_window, GCForeground, &gc_val); XSelectInput(display, overlay_window, ExposureMask); XFlush(display); XEvent event; for(;;) { XNextEvent(display, &event); switch(event.type) { case Expose: XDrawLine(display, overlay_window, gc, 0, 100, 200, 100); XFlush(display); break; default: break; } } XCompositeReleaseOverlayWindow(display, overlay_window); XCloseDisplay(display); return 0; }
编译&运行注意事项
- 编译时需要链接X11和Xcomposite库,编译命令为
gcc your_code.c -o overlay -lX11 -lXcomposite - 如果使用picom合成器仍然看不到内容,可以尝试关闭picom的
fade、opacity全局规则,或者给overlay窗口添加_NET_WM_WINDOW_TYPE_DOCK属性提升层级优先级。
内容的提问来源于stack exchange,提问作者phoney_badger
相关产品推荐
相关产品推荐

