我有一个透明的、水印式的应用程序,使用C语言中的XLib编写。目前,如果你在应用程序的任何地方单击,什么也不会发生,但我希望它可以将鼠标输入传递到下面的任何内容上。例如:如果你单击下面应用程序下的关闭窗口的“X”按钮,它应该关闭应用程序,而不是什么都不做。
好的,这是我找到的内容。
请注意,这个功能是在最近十年中添加的,所以如果你有一个旧版本的X11,这可能会起作用或者不起作用。
首先将以下内容包含到你的项目中,因为它们是必需的:
#include <X11/extensions/shape.h>
#include <X11/extensions/Xfixes.h>
如果要更改输入几何图形(也就是您可以与窗口交互的地方),在这种情况下,我们将其设置为0 x 0像素,这意味着没有任何交互。以下是一个示例:
XRectangle rect;
XserverRegion region = XFixesCreateRegion(display, &rect, 1);
XFixesSetWindowShapeRegion(display, window, ShapeInput, 0, 0, region);
XFixesDestroyRegion(display, region);
并将此添加到项目链接器中 -lXfixes
gtk_widget_input_shape_combine_region
的实现。我之前使用其前身 gtk_widget_input_shape_combine_mask
以使弹出窗口的所有部分都不接收任何事件。XShapeCombineRectangles
是相关的调用(链接的 do_shape_combine_region
在这种情况下使用 shape = ShapeInput
)。XQueryTree
可能会有所帮助。将其执行到根窗口上,获取子窗口列表,找到它们的位置并将鼠标/键盘的XEvent
传递给相应的窗口。你需要实现一个小窗口管理器,它将使用XSelectInput监听默认根窗口上的所有事件。
然后在fd = connectionNember(display)上进行轮询。
每当你收到事件时,请检查它是否是鼠标事件,它会给你x、y。你可以通过遍历窗口堆栈找到正确的窗口。
然后使用XGrabPinter将事件报告给底层窗口。
一些额外的注意事项:
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);