【发布时间】:2021-11-18 14:07:34
【问题描述】:
假设我想一个接一个地绘制矩形。我如何知道 X 服务器何时完成绘制一个矩形?有没有办法从 X 服务器获得任何确认? 在下面的代码中,我在 500,500 处绘制了第一个矩形,并在暴露处理程序中重新绘制了相同的矩形。之后,我在 1000,1000 处绘制了一个新矩形。问题是第一个矩形从未被绘制。我必须通过 Expose 事件处理程序多少次? 多少次才足够?
#include <X11/Xlib.h>
#include <X11/extensions/XTest.h>
#include <X11/Xutil.h>
#include <iostream>
using namespace std;
int main(){
Display *disp;
int screen;
Window win;
GC gc;
disp = XOpenDisplay(NULL);
screen = DefaultScreen(disp);
XColor color;
Colormap colormap;
char black[] = "#ffffff";
colormap = DefaultColormap(disp, 0);
XParseColor(disp, colormap, black, &color);
XAllocColor(disp, colormap, &color);
win = XCreateSimpleWindow(disp, RootWindow(disp, screen), 10,
10, 1500, 1500, 0, WhitePixel(disp, screen), color.pixel);
XSizeHints my_hints = {0};
my_hints.flags = PPosition | PSize;
my_hints.x = 10;
my_hints.y = 10;
my_hints.width = 1500;
my_hints.height = 1500;
XSetNormalHints(disp, win, &my_hints);
XMapWindow(disp, win);
gc = XCreateGC(disp, win, 0, 0);
XColor color1;
Colormap colormap1;
char red[] = "#000000";
colormap1 = DefaultColormap(disp, 0);
XParseColor(disp, colormap1, red, &color1);
XAllocColor(disp, colormap1, &color1);
XSetForeground(disp, gc, color1.pixel);
XSelectInput(disp, win, ExposureMask);
int x1 = 500;
int x2 = 500;
XEvent event;
int i = 0;
while(true){
XDrawRectangle(disp, win, gc, x1, x1, 500, 500);
XNextEvent(disp, &event);
if(event.xany.window == win){
if(event.type == Expose){
cout << i << endl;
XDrawRectangle(disp, win, gc, x1, x2, 500, 500);
}
}
i++;
x1 += 500;
x2 += 500;
}
XFreeGC(disp, gc);
XDestroyWindow(disp, win);
XCloseDisplay(disp);
return 0;
}
输出
0
1
2
3
【问题讨论】:
-
渲染是独立和异步的。如果一个窗口被揭开,它会在某个时候被绘制出来。这与窗口中运行的进程无关。获取所有事件是没有意义的,因为这包括太多其他的东西。相反,请定期使用计时器绘制矩形。