一个忽略所有X(mouse)事件(将其传递)的带有盒子的pygtk窗口

6
我想做以下事情:创建一个全屏、总在最上层的pygtk窗口,其中包含一个显示一些html的webkit小部件,并且有一个完全透明的框,以便下面的窗口可见。(这似乎是可能的:是否可以使用WebKit在透明背景上渲染Web内容?
我的目标是有时将发生在透明框中的所有鼠标事件传递到我的应用程序窗口下方的窗口中,以便我可以正常地与它们交互。因此,不仅在视觉上透明,而且对鼠标事件也是透明的。
理论上,我想我可以通过pygtk Eventbox捕获所有我感兴趣的事件,使用wnck找到直接在我窗口下面的窗口,然后用python-xlib将此事件传递给它。
这似乎并不是最优雅的解决方案;是否有更好的方法?
1个回答

6
转发事件不会很好地工作,正如您所猜测的那样;它会创建许多竞争条件,并且一些应用程序将忽略来自 XSendEvent 的内容。
您可以做的是设置输入形状掩码。请参见 http://www.x.org/releases/current/doc/xextproto/shape.html,然后查看 /usr/include/X11/extensions/Xfixes.h 中的 XFixesSetWindowShapeRegion(),它允许您指定一个形状 "kind"(这里您需要 ShapeInput)。
类似以下内容:
XRectangle rect;
XserverRegion region = XFixesCreateRegion(display, &rect, 1);
XFixesSetWindowShapeRegion(display, window, ShapeInput, 0, 0, region);
XFixesDestroyRegion(display, region);

设置 ShapeInput 的能力仅有5-6年的历史,因此如果您关心非常老旧的X11版本,可能会出现问题。


另外,通过谷歌搜索正确的术语,我找到了类似的内容:https://dev59.com/iVLTa4cB1Zd3GeqPZVF9 - Rumex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接