Window 没有出现在屏幕上

Window doesn't show up on the screen

我是 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");
}

评论的代码工作正常,所有的值都打印正确?但是 window 拒绝出现。我 运行 它在 Debian 9 上,用

编译
gcc -L/usr/X11/lib/ -lx11

其他一切正常。我有最新版本的 libx11-dev,以及键盘交互代码的变体 运行 好的。

X11 协议允许客户端应用程序将要在给定显示器上执行的一系列操作排队,然后将它们一次性全部发送到显示服务器,从而减少执行所需的网络往返次数任何事物。 (这在当时更为重要,当时客户端应用程序更常见于来自显示服务器的慢速 TCP 连接的另一端。)

Xlib 假设它应该将所有显示操作排队直到 (a) 它用完内部缓冲区 space,(b) 您请求下一个输入事件,或 (c) 您明确 flush 未决操作队列(这在 Xlib 联机帮助页中称为 "output buffer" 或 "output queue")。

您的程序还没有到达准备好处理输入事件的地步,因此您需要显式刷新:更改此

XMapRaised(display, win);
system("sleep 10");
}

至此

XMapRaised(display, win);
XFlush(display);
system("sleep 10");
}

和 window 将出现。我也想建议你改变这个

system("sleep 10");
}

至此

sleep(10);
return 0;
}

因为,如果有办法 不用 使用 system 做某事,那几乎总是更好;并且因为依赖 main 末尾的隐式 return 0 是不好的风格。