Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在g_main_循环中添加Xorg事件处理_C_Glib - Fatal编程技术网

C 如何在g_main_循环中添加Xorg事件处理

C 如何在g_main_循环中添加Xorg事件处理,c,glib,C,Glib,我有一个捕捉Xorg和dbus事件的程序。为此,我初始化了dbus循环并启动了g_main_循环,但我不知道如何以自然的方式添加Xorg事件处理: GMainLoop * mainloop = NULL; mainloop = g_main_loop_new(NULL,FALSE); dbus_g_thread_init (); dbus_init(); // <<<<<<<<<<<<<<<<<

我有一个捕捉Xorg和dbus事件的程序。为此,我初始化了dbus循环并启动了g_main_循环,但我不知道如何以自然的方式添加Xorg事件处理:

GMainLoop * mainloop = NULL;
mainloop = g_main_loop_new(NULL,FALSE);
dbus_g_thread_init ();
dbus_init();
// <<<<<<<<<<<<<<<<<<<<<<<<<
//1 way using timeout 
//g_timeout_add(100, kbdd_default_iter, mainloop);
//2nd way using pthread
//GThread * t = g_thread_create(kbdd_default_loop, NULL, FALSE, NULL);
//>>>>>>>>>>>>>>>>>>>>>>>>>>>
g_main_loop_run(mainloop);
GMainLoop*mainloop=NULL;
mainloop=g_main_loop_new(NULL,FALSE);
dbus_g_thread_init();
dbus_init();
// >>>
g_主回路运行(主回路);
在默认的iter中,我检查是否有等待的X事件并处理它们

这两种方法似乎都不好,第一种是因为我不需要调用检查事件,第二种是因为我创建了一个额外的线程,并且必须创建额外的锁


另外,我知道我可以使用gtk lib,但我不想依赖于任何工具包。

如果您想在不使用超时的情况下将Xorg事件处理添加到主循环中(您认为这是浪费时间),则需要添加轮询X连接的源。为此,您需要在Xlib抽象层下面获得底层的X连接文件描述符。下面的完整程序就是这样做的。使用glib主循环进行轮询是的一种改编。我还借鉴了安德鲁·克劳斯的“GTK+开发的基础”

如果这看起来不是很“自然”,那是因为我怀疑是否有一种非常“自然”的方法来做到这一点——您实际上是在实现GDK的核心部分

/* needed to break into 'Display' struct internals. */
#define XLIB_ILLEGAL_ACCESS

#include <X11/Xlib.h> // Every Xlib program must include this
#include <assert.h>   // I include this to test return values the lazy way
#include <glib.h>

typedef struct _x11_source {
  GSource source;
  Display *dpy;
  Window w;
} x11_source_t;

static gboolean
x11_fd_prepare(GSource *source,
           gint *timeout)
{
  *timeout = -1;
  return FALSE;
}

static gboolean
x11_fd_check (GSource *source)
{
  return TRUE;
}

static gboolean
x11_fd_dispatch(GSource* source, GSourceFunc callback, gpointer user_data)
{
  static gint counter = 0;

  Display *dpy = ((x11_source_t*)source)->dpy;
  Window window = ((x11_source_t*)source)->w;

  XEvent e;

  while (XCheckWindowEvent(dpy,
               window,
               EnterWindowMask,
               &e))
    {
      if (e.type == EnterNotify)
    g_print("We're in!!! (%d)\n", ++counter);
    }

  return TRUE;
}

static gboolean
msg_beacon(gpointer data)
{
  static gint counter = 0;
  g_print("Beacon %d\n", ++counter);
  return TRUE;
}

int
main()
{
      Display *dpy = XOpenDisplay(NULL);
      assert(dpy);

      int blackColor = BlackPixel(dpy, DefaultScreen(dpy));
      int whiteColor = WhitePixel(dpy, DefaultScreen(dpy));

      Window w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, 
                     200, 100, 0, blackColor, blackColor);

      XSelectInput(dpy, w, StructureNotifyMask | EnterWindowMask);
      XMapWindow(dpy, w);

      for (;;) {
    XEvent e;
    XNextEvent(dpy, &e);
    if (e.type == MapNotify)
      break; 
      }

      GMainLoop *mainloop = NULL;
      mainloop = g_main_loop_new(NULL, FALSE);

      /* beacon to demonstrate we're not blocked. */
      g_timeout_add(300, msg_beacon, mainloop);

      GPollFD dpy_pollfd = {dpy->fd,
                G_IO_IN | G_IO_HUP | G_IO_ERR,
                0};

      GSourceFuncs x11_source_funcs = {
    x11_fd_prepare,
    x11_fd_check,
    x11_fd_dispatch,
    NULL, /* finalize */
    NULL, /* closure_callback */
    NULL /* closure_marshal */
      };

      GSource *x11_source =
    g_source_new(&x11_source_funcs, sizeof(x11_source_t));
      ((x11_source_t*)x11_source)->dpy = dpy;
      ((x11_source_t*)x11_source)->w = w;
      g_source_add_poll(x11_source, &dpy_pollfd);
      g_source_attach(x11_source, NULL);

      g_main_loop_run(mainloop);

      return 0;

}
/*需要进入“显示”结构内部*/
#定义XLIB_非法访问
#include//每个Xlib程序都必须包含此
#include//I包括它以惰性方式测试返回值
#包括
类型定义结构\u x11\u源{
G源;
显示*dpy;
窗口w;
}x11_源代码;
静态gboolean
x11_fd_准备(GSource*源,
gint*超时)
{
*超时=-1;
返回FALSE;
}
静态gboolean
x11_fd_检查(GSource*源)
{
返回TRUE;
}
静态gboolean
x11_fd_调度(GSource*源、GSourceFunc回调、gpointer用户_数据)
{
静态基特计数器=0;
显示*dpy=((x11_源*t*)源)->dpy;
Window Window=((x11_source_t*)source)->w;
XEvent e;
而(XCheckWindowEvent,dpy,
窗口,
输入窗口掩码,
&e) )
{
如果(e.type==EnterNotify)
g_print(“我们在!!!(%d)\n”,++计数器);
}
返回TRUE;
}
静态gboolean
信标(gpointer数据)
{
静态基特计数器=0;
g_打印(“信标%d\n”,++计数器);
返回TRUE;
}
int
main()
{
Display*dpy=XOpenDisplay(空);
断言(dpy);
int blackColor=BlackPixel(dpy,默认屏幕(dpy));
int whiteColor=WhitePixel(dpy,默认屏幕(dpy));
窗口w=XCreateSimpleWindow(dpy,DefaultRootWindow(dpy),0,0,
200,100,0,黑色,黑色);
XSelectInput(dpy、w、StructureNotifyMask | EnterWindowMask);
XMapWindow(dpy,w);
对于(;;){
XEvent e;
XNextEvent(dpy和e);
如果(e.type==MapNotify)
打破
}
GMainLoop*mainloop=NULL;
mainloop=g_main_loop_new(NULL,FALSE);
/*灯塔显示我们没有被封锁*/
g_超时_添加(300,消息信标,主循环);
GPollFD dpy_pollfd={dpy->fd,
G|IO|u IN | G|IO|u HUP | G|IO|u ERR,
0};
GSourceFuncs x11_source_funcs={
x11_fd_准备,
x11_fd_检查,
x11_fd_调度,
NULL,/*完成*/
NULL,/*闭包\u回调*/
NULL/*闭包\u封送*/
};
GSource*x11_源=
g_source_new(&x11_source_funcs,sizeof(x11_source_t));
((x11_source_t*)x11_source)->dpy=dpy;
((x11_源_t*)x11_源)->w=w;
g_源添加轮询(x11_源和dpy_轮询);
g_源附加(x11_源,空);
g_主回路运行(主回路);
返回0;
}

此实现是否有任何python版本?