在gdm / metacity忽略的X11的叠加窗口上绘图

时间:2014-12-19 10:51:23

标签: c++ c x11 cairo composite

我正在尝试构建一个较小的应用程序,它使用cairo在X11 / x-server显示的所有窗口之上。

我发现了一些有趣的起点,并且运行了一小段代码,简单地绘制了一个红色矩形 在按预期运行的较旧的Ubuntu安装上并绘制矩形。它还刷新每个事件的绘图,这也是预期的行为。 使用我的Gentoo Linux安装与Gnome 3.12(默认gdm作为窗口管理器运行)程序也运行,但似乎没有绘制任何东西。
我调试了一段时间并且在Ubuntu和Gnome运行之间没有真正的区别 - 除了在Ubuntu上显示矩形...

我错过了什么吗?

使用startx从普通x11环境启动可执行文件,〜/ .xinitrc中的条目exec test7也会得到预期结果。所以这一切都可能与gnome窗口管理器有关(使用metacity是gdm吗?)


这是我的(小)示例代码(test7.c):

#include <stdio.h>
#include <unistd.h>

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/extensions/Xcomposite.h>
#include <X11/extensions/Xfixes.h>
#include <X11/extensions/shape.h>

#include <cairo/cairo.h>
#include <cairo/cairo-xlib.h>

Display *dpy;
Window overlay;

void allow_input_passthrough(Window w)
{
    XserverRegion region = XFixesCreateRegion (dpy, NULL, 0);
    XFixesSetWindowShapeRegion(dpy, w, ShapeBounding, 0, 0, 0);
    XFixesSetWindowShapeRegion(dpy, w, ShapeInput, 0, 0, region);
    XFixesDestroyRegion(dpy, region);
}


int main()
{
    Window root;
    int screen, width, height;

    dpy = XOpenDisplay(NULL);
    screen = DefaultScreen(dpy);
    root = RootWindow(dpy, screen);
    //root = DefaultRootWindow (dpy);

    XCompositeRedirectSubwindows(dpy, root, CompositeRedirectAutomatic);
    XSelectInput(dpy, root, SubstructureNotifyMask);

    overlay = XCompositeGetOverlayWindow(dpy, root);
    allow_input_passthrough(overlay);

    width = DisplayWidth(dpy, screen);
    height = DisplayHeight(dpy, screen);

    cairo_surface_t *surf = cairo_xlib_surface_create(dpy, overlay,
                            DefaultVisual(dpy, screen),
                            width, height);
    cairo_t *cr = cairo_create(surf);
    XSelectInput(dpy, overlay, ExposureMask);

    XEvent ev;
    for (;;) {
        XNextEvent(dpy, &ev);
        printf("XNextEvent()\n");

        cairo_set_source_rgb(cr, 1.0, 0.0, 0.0);
        cairo_rectangle(cr, 100.0, 100.0, 200.0, 200.0);
        cairo_fill(cr);
    }

    cairo_destroy(cr);
    cairo_surface_destroy(surf);
    XCloseDisplay(dpy);
    return 0;
}

使用以下命令编译gcc(或clang):

gcc test7.c -o test7 -O0 -g3 -lXfixes -lXcomposite -lcairo -lX11

一如既往:非常感谢提前!

Sebsatian

0 个答案:

没有答案