我是X11的新手,所以我尝试编译并运行此代码
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
int screen_num;
Display *display;
int screen_width;
int screen_height;
Window root_window;
Window win;
int win_width, win_height;
int win_x, win_y;
int border_width = 4;
unsigned long white_pixel;
unsigned long black_pixel;
display = XOpenDisplay(NULL);
screen_num = DefaultScreen(display);
root_window = RootWindow(display, screen_num);
screen_width = DisplayWidth(display, screen_num);
screen_height = DisplayHeight(display, screen_num);
white_pixel = WhitePixel(display, screen_num);
black_pixel = BlackPixel(display, screen_num);
win_width = screen_width / 3;
win_height = screen_height / 3;
win_x = screen_width / 3;
win_y = screen_height / 3;
char window_name[] = "Basic Window Program";
XEvent report;
GC gc;
if (display == NULL) {
printf("Cannot connect to X server");
exit(-1);
}
// printf("Height:\t%dpx\n"\
"Width:\t%dpx\n"\
"White px.:\t%d\n"\
"Black px.:\t%d\n",
// screen_height, screen_width,
// white_pixel, black_pixel);
win=XCreateSimpleWindow(display,DefaultRootWindow(display),0,0,
200, 300, 5, white_pixel, black_pixel);
XClearWindow(display, win);
XMapRaised(display, win);
system("sleep 10");
}
注释的代码工作正常,并且所有值都正确打印了吗?但窗口拒绝显示。我在Debian 9上运行它,编译为
gcc -L/usr/X11/lib/ -lx11
其他所有方法都可以。我具有libx11-dev的最新版本,并且可以通过各种键盘干扰代码来正常运行。
答案 0 :(得分:2)
X11协议允许客户端应用程序将要在给定显示器上执行的一系列操作排队,然后立即将它们全部发送到显示服务器,从而减少了执行任何操作所需的网络往返次数。 (这在当今更为重要,当时客户端应用程序通常处于与显示服务器之间缓慢的TCP连接的另一端。)
Xlib假定它应该将所有显示操作排入队列,直到(a)内部缓冲区空间用完,(b)请求下一个输入事件或(c)显式 flush 待处理操作队列(在Xlib联机帮助页中称为“输出缓冲区”或“输出队列”)。
您的程序尚未达到可以处理输入事件的地步,因此您需要进行显式刷新:更改此
XMapRaised(display, win);
system("sleep 10");
}
对此
XMapRaised(display, win);
XFlush(display);
system("sleep 10");
}
,将出现一个窗口。我还建议您更改此
system("sleep 10");
}
对此
sleep(10);
return 0;
}
因为,如果有一种方法可以使用system
而无需进行操作,那么这种方法几乎总是更好;并且因为依靠return 0
末尾的隐式main
是不好的风格。