pygtk窗口中有一个忽略所有鼠标事件的框(透传事件)

6 投票
1 回答
1188 浏览
提问于 2025-04-17 11:17

我想做的是:创建一个全屏的pygtk窗口,这个窗口总是在最上面,里面有一个webkit小部件可以显示一些html内容,但我希望这个窗口的某个区域完全透明,这样下面的窗口就能看得见。(这似乎是可行的:能否在透明背景上渲染网页内容?

我希望的是,有时候能把在这个透明区域发生的所有鼠标事件传递给我应用窗口下面的窗口,这样我就可以正常与它们互动。所以不仅仅是视觉上的透明,还要在鼠标事件上也透明。

理论上,我想我可以用pygtk的Eventbox捕捉我感兴趣的所有事件,找到我窗口正下方的窗口,然后用python-xlib把这个事件传递给它。

不过,这样的解决方案似乎不是最优雅的,有没有更好的方法呢?

1 个回答

6

正如你猜测的那样,转发事件并不好用;这样会产生很多竞争条件,而且有些应用程序会忽略来自 XSendEvent 的信息。

你可以做的是设置输入形状掩码。可以查看这个链接:http://www.x.org/releases/current/doc/xextproto/shape.html,然后看看 XFixesSetWindowShapeRegion() 这个函数,它在 /usr/include/X11/extensions/Xfixes.h 文件里,允许你指定一个形状的“类型”(在这里你需要 ShapeInput)。

大概是这样的:

XRectangle rect;
XserverRegion region = XFixesCreateRegion(display, &rect, 1);
XFixesSetWindowShapeRegion(display, window, ShapeInput, 0, 0, region);
XFixesDestroyRegion(display, region);

设置 ShapeInput 的功能“仅仅”在5-6年前才有,所以如果你在意非常老旧的 X11 版本,可能会遇到麻烦。

撰写回答