如何在X11子窗口中获取事件?

时间:2012-03-22 11:49:19

标签: linux events gtk x11 gdk

我需要在X11子窗口中处理事件(MouseDown,MouseUp,MouseMove,KeyDown,KeyUp)。这个孩子X11窗口的父级 - GtkWidget,所以我无法创建主循环...

我该怎么做?

谢谢!

3 个答案:

答案 0 :(得分:1)

XGrabPointerXGrabKeyboard

如果您想从gtk小部件中获取事件,可以使用g_signal_connect()。

    g_signal_connect(G_OBJECT(mChild), "button_press_event",
                     G_CALLBACK(BPHandler), NULL);
    g_signal_connect(G_OBJECT(mChild), "key_press_event",
                     G_CALLBACK(KPHandler), NULL);

答案 1 :(得分:1)

嗯,你需要某种事件泵,并且作为共享X显示连接上的子窗口意味着,它被束缚到主事件循环。从技术上讲,您可以使用自己的显示连接和事件循环启动第二个线程。不幸的是,Xlib不是非常安全,特别是在这方面。你可以用Xcb做到这一点。

另一种方法是将孩子置于一个单独的过程中并使用XEmbed。

答案 2 :(得分:0)