XNextEvent 没有返回?

XNextEvent is not returning?

我是 c 语言和 xorg-server 编程的新手。我希望做任何事情,但 XNextEvent 只会 return 它被调用的前三次。之后它会再 return 直到我调用一些事件,例如调整 window 的大小或进入全屏。因此,如果 window 处于停滞状态,XNextEvent 将不会 return。这一定是我的一些明显错误吧?源代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>

#define WIDTH 1000
#define HEIGHT 600
#define CELL_SIZE 10

Display *dis;
int screen;
Window win;
XEvent event;
GC gc;

void init(){
    dis = XOpenDisplay(NULL);
    if (dis == NULL){
        fprintf(stderr, "Cannot open display");
        exit(1);
    }
    screen = DefaultScreen(dis);
    
    win = XCreateSimpleWindow(
        dis,
        RootWindow(dis, screen),
        100, 100, WIDTH, HEIGHT, 1,
        BlackPixel(dis, screen),
        WhitePixel(dis, screen)
    );

    XSelectInput(dis, win, ExposureMask | KeyPressMask);
    gc = XCreateGC(dis, win, 0, 0);
    XSetBackground(dis, gc, WhitePixel(dis, screen));
    XSetForeground(dis, gc, BlackPixel(dis, screen));
    XClearWindow(dis, win);
    XMapRaised(dis, win);
}

void close_program(){
    XFreeGC(dis, gc);
    XDestroyWindow(dis, win);
    XCloseDisplay(dis);
    exit(0);
}

int main(){
    init();

    while (1){
        XNextEvent(dis, &event);
        if (event.type == Expose){
            printf("Will this execute? Prolly not.\n");
        }
            printf("Will this execute? no.\n");
    } 
    return 0;
}

我知道我没有使用 close_program 功能,还在研究中

如果队列中没有待处理的事件,XNextEvent 将阻塞直到有一个。 documentation 就是这么说的。