检查重新设置的 window 关闭事件

check for reparented window close events

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

XEMBED documentation 中写着

It is the responsibility of the embedder to keep track of all forwarded accelerators and to remove them when the client window dies.

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

我基本上只收到停靠请求事件,之后没有其他任何事情。当出现停靠请求事件时,我为包含托盘 window 的面板创建一个子 window 并像这样重新设置它的父级:

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

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

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

我自己之前确实做过这个:https://github.com/adamdruppe/taskbar它有针对我在宽度方面的特定设置的 hack,但其中大部分应该是合理可用的,代码可能会帮助指导你。

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

StructureNotifyMask 订阅了包括 MapNotifyDestroyNotify 在内的事件,您很可能会看到这是怎么回事:)

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

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