我有一个透明的,水印状的应用程序,用C中的XLib编写。目前如果你点击应用程序的任何地方没有任何反应,但我希望它将鼠标输入传递给它下面的任何东西。例如如果单击X关闭应用程序下方的窗口,它应该关闭应用程序,而不是什么都不做。
答案 0 :(得分:2)
如果您不希望“水印”窗口接收任何输入,而是让输入转到它下面的窗口,那么我会查看implementation behind gtk_widget_input_shape_combine_region
。我之前使用它的前身gtk_widget_input_shape_combine_mask
导致弹出窗口的所有部分都不接收任何事件。
我在这里不在我的舒适区域,但看起来XShapeCombineRectangles是相关的调用(在这种情况下,do_shape_combine_region
与[{1}}一起调用)。
答案 1 :(得分:1)
我认为XQueryTree
可能有所帮助。执行它到根窗口并获取子窗口列表,找到它们的位置并将鼠标/键盘XEvent
传递到适当的窗口。
注意:您必须处理活动/非活动窗口,活动/非活动区域 窗口,另一个窗口的子,大小和其他的x / y位置 视窗。代码将变得混乱。
答案 2 :(得分:0)
你需要实现一个小窗口管理器,它将全部监听 使用XSelectInput在默认根indow上的事件。
然后在fd = connectionNember(显示)上进行轮询。
每当您收到活动时。检查这是否是鼠标事件,它会 给你x,y。您可以通过遍历窗口堆栈找到正确的窗口。
然后使用XGrabPinter将事件报告给基础窗口。
答案 3 :(得分:0)
这就是我found。
请注意,此功能是在过去十年中添加的,因此如果您使用旧版本的X11,则可能会也可能不会。
首先将这些内容包含在您需要的项目中:
#include <X11/extensions/shape.h>
#include <X11/extensions/Xfixes.h>
要更改输入几何体(即可以与窗口交互的位置),在这种情况下,我们将其设置为0乘0像素,这意味着没有。这是一个例子:
XRectangle rect;
XserverRegion region = XFixesCreateRegion(display, &rect, 1);
XFixesSetWindowShapeRegion(display, window, ShapeInput, 0, 0, region);
XFixesDestroyRegion(display, region);
并将其添加到项目链接器-lXfixes
答案 4 :(得分:0)
一些附加说明:
BadRequest
错误xcb_shape_mask(conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_BOUNDING, window, 0, 0, 0);
xcb_shape_rectangles(conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_INPUT, XCB_CLIP_ORDERING_UNSORTED, window, 0, 0, 0, NULL);
至于它是如何工作的,我不知道。众所周知,XShape 没有文档记录。然而结果似乎是一样的。