XNextEvent 没有返回?

问题描述

我是 c 和 xorg-server 编程的新手。我想做任何事情,但 XNextEvent 只会返回它被调用的前 3 次。之后它会再次返回,直到我引发一些事件,例如调整窗口大小或全屏显示。因此,如果窗口处于停止状态,XNextEvent 将不会返回。这对我来说一定是一些明显的错误吧?源代码

#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,WIDTH,HEIGHT,1,BlackPixel(dis,WhitePixel(dis,screen)
    );

    XSelectInput(dis,win,ExposureMask | KeyPressMask);
    gc = XCreateGC(dis,0);
    XSetBackground(dis,gc,screen));
    XSetForeground(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 所说的。