2016-04-07 2 views
0

tray specsで説明されているように、XEMBEDを使用してトレイアイコンを埋め込むX11用のxlibトレイバーを作成しようとしています。しかし、トレイアイコンを使用してアプリケーションを閉じると、コンテナウィンドウからは削除されますが、黒いコンテナウィンドウの四角形とコード内のエントリはまだ存在します。 XEMBED documentation改ざんされたウィンドウクローズイベントを確認する

それはすべての転送 アクセラレータを追跡するために、クライアントウィンドウが死んだときにそれらを削除するには埋め込みの責任である

言います。

ただし、埋め込みウィンドウが消滅しても、私のアプリケーションはイベントや表示を取得しません。

私は基本的にドック要求イベントのみを受信し、その後は何も受信しません。ドック要求イベントは、Iになると、トレイのウィンドウが含まれており、このようにそれをリペアレント私のパネルの子ウィンドウを作成します。パネルに追加

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幅のことで自分の設定にハックがありますが、そのほとんどは合理的に使えるはずです。

しかし、あなたがしたいことは、アイコンウィンドウでイベントを要求することです。これは、しばらくしているので、私はちょっとここでは、ガイドとしての私自身のコードを使用していますが、私はドック要求を得たとき、私はこれがどこにあるかあなたがprolly参照、MapNotifyDestroyNotifyを含むイベントへXSelectInput(dd, id, EventMask.StructureNotifyMask);

StructureNotifyMaskサブスクライブと呼ばれますあなたがアイコンウィンドウで入力を選択すると、通常イベントループはDestroyNotifyUnmapNotifyのイベントをチェックできます(私のコードは両方をチェックします、tbh、アイコンのときにどちらが実際にトリガーするのかわかりません)削除されます)、イベントのメンバー.windowとあなたのアイコンのウィンドウIDを比較してください。一致した場合は、今すぐ削除されたため、リストから削除してください。

私のタスクバーは、とは対照的に、アプリケーションがクラッシュが正常に閉じられている場合ので、私はまだ何かが足りないかもしれないが、バグを持っているように見えるが、イベントをチェックすることは、ほとんどの場合で動作しません。