我正在尝试构建一个较小的应用程序,它使用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