由于X是一个服务器,是否有一种方法可以通过套接字而不是使用XNextEvent
来监听X事件?
我有一个程序,通过在主线程中运行的循环中调用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;
}
XPeekEvent()
在一个线程中循环等待事件,当有事件排队时,通知主线程(可以使用eventfd
或其他你喜欢的方式),让它读取排队的事件(XPending()
会告诉你有多少个事件)。 - undefined