单击透明xlib窗口

时间:2013-05-06 14:30:33

标签: c xlib

我有一个透明的,水印状的应用程序,用C中的XLib编写。目前如果你点击应用程序的任何地方没有任何反应,但我希望它将鼠标输入传递给它下面的任何东西。例如如果单击X关闭应用程序下方的窗口,它应该关闭应用程序,而不是什么都不做。

5 个答案:

答案 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)

  1. 你需要实现一个小窗口管理器,它将全部监听 使用XSelectInput在默认根indow上的事件。

  2. 然后在fd = connectionNember(显示)上进行轮询。

  3. 每当您收到活动时。检查这是否是鼠标事件,它会 给你x,y。您可以通过遍历窗口堆栈找到正确的窗口。

  4. 然后使用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)

一些附加说明:

  • 如果您想在 xcb 中执行此操作,请确保先查询 xfixes 5.0 版,否则您将收到模糊的 BadRequest 错误
  • 这是另一种方法(从 picom source 中窃取,而后者又从 compiz 源☺中窃取了它)
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 没有文档记录。然而结果似乎是一样的。