0

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

XEMBED 文档中它说

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

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

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

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);

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

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

4

1 回答 1

2

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

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

StructureNotifyMask订阅事件,包括MapNotify, DestroyNotify, 你会看到这是怎么回事 :)

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

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

于 2016-04-07T15:17:50.817 回答