【问题标题】:check for reparented window close events检查重新设置的窗口关闭事件
【发布时间】:2016-04-07 14:56:19
【问题描述】:

我正在尝试为 X11 制作一个 xlib 托盘栏,它使用 XEMBED 嵌入托盘图标,如tray specs 中所述。但是,当我使用托盘图标关闭应用程序时,它只是将其从容器窗口中删除,但黑色容器窗口矩形和我的代码中的条目仍然存在。

XEMBED documentation 中写着

嵌入器有责任跟踪所有转发的 加速器并在客户端窗口消失时将其删除。

但是,当嵌入式窗口死机时,我的应用程序没有收到任何事件或指示。

我基本上只收到一个停靠请求事件,之后什么都没有。当一个停靠请求事件出现时,我为我的面板创建一个子窗口,其中包含托盘窗口并像这样重新设置它:

enum trayIconSize = 24; // dimensions of icon

icon.trayWindow = XCreateWindow(x.display, panel.window, 0, 0, ...);
icon.ownerHandle = event.data.l[2]; // window id of icon which wants to dock

XReparentWindow(x.display, icon.ownerHandle, icon.trayWindow, 0, 0);
XMoveResizeWindow(x.display, icon.ownerHandle, 0, 0, trayIconSize, trayIconSize);

将其添加到面板没有任何问题,但我不知道如何检查何时再次将其删除。

如何让我的应用程序接收这些托盘图标的关闭事件,或者如何检查重新设置的窗口是否仍然存在?

【问题讨论】:

    标签: d xlib system-tray freedesktop.org xembed


    【解决方案1】:

    实际上,我自己之前已经这样做过:https://github.com/adamdruppe/taskbar 它对我在宽度方面的特定设置有一些技巧,但其中大部分应该是合理可用的,并且代码可能会帮助指导您。

    但是您想要做的是在图标窗口上请求事件。已经有一段时间了,所以我在这里有点用我自己的代码作为指导,但是当我收到停靠请求时,我打电话给XSelectInput(dd, id, EventMask.StructureNotifyMask);

    StructureNotifyMask 订阅了包括MapNotifyDestroyNotify 在内的事件,你很快就会知道这是怎么回事 :)

    一旦您在图标窗口中选择了输入,您的常规事件循环就可以检查 DestroyNotifyUnmapNotify 事件(我的代码同时检查了这两个事件,tbh,我不确定当图标已删除)并将事件的.window 成员与您图标的窗口ID 进行比较。如果匹配,请继续将其从您的列表中删除,因为它现在已经消失了。

    如果应用程序崩溃而不是正常关闭,我的任务栏似乎确实存在错误,所以我可能仍然遗漏了一些东西,但在大多数情况下检查事件是可行的。

    【讨论】:

      猜你喜欢
      • 2011-03-12
      • 1970-01-01
      • 2013-05-18
      • 2019-03-27
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多