创建2个X11窗口的简单C程序
问题描述:
我想在linux中创建2个窗口,稍后我将从一个单独的线程中绘制窗口。我目前有一个非确定性的错误,我创建的第二个窗口有时不会被创建(尽管没有错误)。创建2个X11窗口的简单C程序
这是代码。
static void create_x_window(Display *display, Window *win, int width, int height)
{
int screen_num = DefaultScreen(display);
unsigned long background = WhitePixel(display, screen_num);
unsigned long border = BlackPixel(display, screen_num);
*win = XCreateSimpleWindow(display, DefaultRootWindow(display), /* display, parent */
0,0, /* x, y */
width, height, /* width, height */
2, border, /* border width & colour */
background); /* background colour */
XSelectInput(display, *win, ButtonPressMask|StructureNotifyMask);
XMapWindow(display, *win);
}
int main(void) {
XInitThreads(); // prevent threaded XIO errors
local_display = XOpenDisplay(":0.0");
Window self_win, remote_win;
XEvent self_event, remote_event;
create_x_window(local_display, &remote_win, 640,480);
// this line flushes buffer and blocks so that the window doesn't crash for a reason i dont know yet
XNextEvent(local_display, &remote_event);
create_x_window(local_display, &self_win, 320, 240);
// this line flushes buffer and blocks so that the window doesn't crash for a reason i dont know yet
XNextEvent(local_display, &self_event);
while (1) {
}
return 0;
}
我真的不关心在窗口捕获输入,但我发现一个教程,有XSelectInput和XNextEvent例行(在事件循环),我遇到了麻烦,使这项工作没有任何。
答
这不是一个错误,它是一个功能。 You left out the event loop。
尽管您巧妙地将XNextEvent调用了两次,但X协议是异步的,因此服务器在调用XNextEvent时仍可能设置实际窗口,所以无关。
谢谢队友。我将XNextEvent放在事件循环之外的原因是因为我不希望它阻塞。似乎所有我需要做的是'while(XPending(local_display)){XNextEvent(local_display,&event)};' – James