问题描述
我是 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 所说的。