2016-04-07 98 views
0

我正在尝试为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); 

它添加到面板厂,没有任何问题,但我不知道该怎么检查何时再次移除它。

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

回答

2

我已经在我自己之前实际完成了这个工作:https://github.com/adamdruppe/taskbar它对我在宽度方面的特定设置进行了修改,但其中大部分应该是合理可用的,代码可能有助于指导您。

但是你想要做的是要求在图标窗口上的事件。它已经有一段时间,所以我有点用我自己的代码作为指导在这里,但是当我在码头的要求,我叫XSelectInput(dd, id, EventMask.StructureNotifyMask);

StructureNotifyMask订阅了事件,包括MapNotifyDestroyNotify,你prolly看到这是去:) :)

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

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