Events GTK:在GTK套接字上抓取鼠标事件

Events GTK:在GTK套接字上抓取鼠标事件,events,gtk,gtk3,x11,Events,Gtk,Gtk3,X11,我遇到了Gtk.Socket和鼠标事件的问题。我在Gtk.Socket中没有收到任何鼠标事件信号 当我创建Gtk.Socket并将一些支持XEMBED协议的应用程序(例如rxvt unicode)嵌入其中时,我希望能够在Socket上钩住鼠标事件以更改焦点、弹出菜单等。但是Gtk.Socket本身不会接收任何鼠标事件 我对GTK是新手,实际上在X11世界也是如此。所以我不确定事件是如何分发到windows的。我几乎可以肯定,在我的例子Gtk.Socket中,这个嵌入式窗口会吃掉所有鼠标事件,并且

我遇到了Gtk.Socket和鼠标事件的问题。我在Gtk.Socket中没有收到任何鼠标事件信号

当我创建Gtk.Socket并将一些支持XEMBED协议的应用程序(例如rxvt unicode)嵌入其中时,我希望能够在Socket上钩住鼠标事件以更改焦点、弹出菜单等。但是Gtk.Socket本身不会接收任何鼠标事件

我对GTK是新手,实际上在X11世界也是如此。所以我不确定事件是如何分发到windows的。我几乎可以肯定,在我的例子Gtk.Socket中,这个嵌入式窗口会吃掉所有鼠标事件,并且不会将它们发送给它们的父母。有可能以某种方式破解它吗

这是一个简短的例子: 我删除了所有我试图获得的按钮按下事件,以保持简短

#!/usr/bin/python
from gi.repository import GdkX11, Gtk, Gdk
from subprocess import Popen

class MainWindow(Gtk.Window):
    def __init__(self, size_x, size_y):
        super(self.__class__, self).__init__()
        self.add_events(Gdk.EventMask.BUTTON_PRESS_MASK)
        self.resize(size_x, size_y)
        self.connect('delete-event', Gtk.main_quit)

        self.default_structure()

    def default_structure(self):
        child1 = TerminalWindow()
        child2 = TerminalWindow()

        layout = Gtk.HBox()
        layout.pack_start(child1, True, True, 0)
        layout.pack_start(child2, True, True, 0)
        self.add(layout)

class TerminalWindow(Gtk.Socket):
    def __init__(self):
        super(self.__class__, self).__init__()

        self.connect('realize', self.on_realize)
        self.connect('unrealize', Gtk.main_quit)

    def on_realize(self, *args):
        self.inner_process = Popen(['urxvt', '-embed', str(self.get_id()), '-pe', '-tabbed'])


if __name__ == "__main__":
    win = MainWindow(800, 300)
    win.show_all()

    Gtk.main()

在X11中,windows通常不会向其他窗口发送事件,也不会将事件传递给父窗口。相反,程序会记录发生在窗口上的事件的兴趣。任何程序都可以观看任何窗口。但不清楚你为什么想要这样。rxvt可以有自己的弹出窗口,如果您添加另一个窗口,它会有点混乱。是的,但不幸的是,您可能无法注册发生在另一个窗口上的鼠标事件。:-我为什么要这么做?首先,如果我有2个嵌入式urxvt,我想在单击时改变对它们的关注。第二个urxvt缺少类似终止符的内容—拆分、分组等。。。这就是我想做的。这就是为什么popupit可以使用一些键修改器,问题是我根本无法钩住鼠标事件为什么,你可以,没问题,但最好在你的套接字上创建一个InputOnly窗口并从中获取输入。我可以,但它不起作用。问题可能就在这里:MouseButtonPress可以在一个客户端上监听。如果我没弄错的话,你建议在GtkSocket上做一些透明的覆盖?但它不会妨碍在那里创建自己的urxvt窗口吗?我试试……嗯。我认为,当嵌入的窗口失去焦点时,您需要提升inputonly窗口,然后在单击时将其降低。