2016-04-07 96 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進行比較。如果它匹配,繼續並從列表中刪除它,因爲它現在已經消失。

我的任務欄似乎有一個錯誤,如果應用程序崩潰而不是正常關閉,所以我可能仍然缺少一些東西,但檢查事件在大多數情況下工作。