通过文件描述符或套接字轮询 X 事件

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)

meu*_*euh 5

ConnectionNumber(dpy)您可以使用显示屏上的宏来获取连接的文件描述符。看man ConnectionNumber

ConnectionNumber 宏返回指定显示器的连接号。

这可以用于select()检查poll()事件是否准备就绪。定义在/usr/include/X11/Xlib.h.