X11应用程序无法绘制/双缓冲

时间:2015-02-21 20:01:22

标签: c linux x11 doublebuffered xcb

我有一个用C语言编写的小应用程序在Linux上运行,创建一个简单的X窗口,带有一个双缓冲区,写入一些像素,然后刷新。

我注意到,如果我没有添加延迟,则不会出现刷新的图片,我在这里犯了什么错误?

小应用基本上是:

Display * dsp = XOpenDisplay(NULL);
Window win = XCreateSimpleWindow(dsp, DefaultRootWindow(dsp), 0, 0, SIZ + 1, SIZ + 1, 1, 0, 0xffffff);
XMapWindow(dsp, win);
GC gc = XCreateGC(dsp, win, 0, NULL);
Pixmap double_buffer = XCreatePixmap(dsp, win, SIZ + 1, SIZ + 1, 24);

// write some pixels:
XSetForeground(dsp, gc, 0);
snprintf(buf, 2, "%c", ord);
text.chars = buf;
text.nchars = 1;
text.delta = text.font = 0;
XDrawText(dsp, double_buffer, gc, i, j, &text, 1);

// switch buffers:
XCopyArea(dsp, double_buffer, win, gc, 0, 0, SIZ, SIZ, 0, 0);
sleep(1); /* if I don't add this nothing is shown */
XFlush(dsp);

我的机器是64位Linux Debian,带有openbox和compositor(compton)。对于X11,我使用的是libx11-xcb-dev和intel驱动程序,没有专用的GPU。

1 个答案:

答案 0 :(得分:2)

X11不能以这种简单的方式工作。它是事件驱动的。您至少应该等待窗口的Expose事件进行一些绘制。例如,见Equivalent of "Invalidate Rect" / "WM_PAINT" in X11

相关问题