You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:15:00