SU3*_*SU3 3 c x11 epoll unix-socket
由于 X 是服务器,因此我有一种方法可以通过套接字监听 X 事件,而不是使用XNextEvent?
我有一个程序,通过在主线程中运行的循环中调用来监视系统epoll事件epoll_wait。由于我无法弄清楚如何通过文件描述符侦听 X 事件,因此我不得不XNextEvent在单独的线程中运行专用循环,并在事件发生时调用的函数的调用周围放置互斥体。
如果有人好奇的话,这是我编写的用于轮询 X 事件的函数。目前我只监听与键盘布局切换相关的事件。
void* xevent_loop(void*) {
int xkbEventType;
XkbQueryExtension(dpy, 0, &xkbEventType, 0, 0, 0);
XkbSelectEventDetails(dpy,
XkbUseCoreKbd, XkbStateNotify, XkbAllStateComponentsMask,
XkbGroupStateMask);
XSync(dpy, False);
for (XEvent e;;) {
XNextEvent(dpy, &e);
if (e.type == xkbEventType) {
XkbEvent* xkbe = (XkbEvent*) &e;
if (xkbe->any.xkb_type == XkbStateNotify) {
pthread_mutex_lock(&setroot_mutex);
fmt_kbd_layout(xkbe->state.group);
setroot();
pthread_mutex_unlock(&setroot_mutex);
}
}
}
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
ConnectionNumber(dpy)您可以使用显示屏上的宏来获取连接的文件描述符。看man ConnectionNumber:
ConnectionNumber 宏返回指定显示器的连接号。
这可以用于select()检查poll()事件是否准备就绪。定义在/usr/include/X11/Xlib.h.