2016-04-07 34 views
0

Ich versuche, eine xlib Traybar für X11 zu machen, wo es die Tray-Icons mit XEMBED wie in der tray specs beschrieben bettet. Wenn ich jedoch die Anwendung mit dem Taskleistensymbol schließe, wird sie nur aus dem Containerfenster entfernt, aber das Rechteck des schwarzen Containerfensters und der Eintrag in meinem Code sind noch vorhanden.überprüfen für reparierte Fenster schließen Ereignisse

Im XEMBED documentation sagt es

Es ist die Verantwortung des Einbettungs ist die Übersicht über alle weitergeleitet Beschleuniger zu halten und sie zu entfernen, wenn das Client-Fenster stirbt.

Allerdings erhält meine Anwendung keine Ereignisse oder Hinweise, wenn ein eingebettetes Fenster stirbt.

Ich bekomme im Grunde nur ein Dock-Anfrage-Ereignis und nichts anderes danach. Wenn ein Dock Anforderungsereignis kommt in mir ein Kind Fenster für mein Panel erstellen, die das Fach Fenster enthält und es so Reparent:

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

es auf die Platte ohne Probleme funktionieren Hinzufügen, aber ich weiß nicht, wie man Überprüfen Sie, wann es wieder entfernt werden soll.

Wie kann ich meine Anwendung schließen Ereignisse für diese Tray-Symbole erhalten oder wie überprüfe ich, ob das reparierte Fenster noch existiert?

Antwort

2

Ich habe dies tatsächlich vor mir selbst getan: https://github.com/adamdruppe/taskbar es hat Hacks für meine spezifische Einrichtung in der Breite Sache, aber das meiste davon sollte einigermaßen brauchbar sein und der Code könnte helfen, Sie zu führen.

Aber was Sie tun möchten, ist, nach Ereignissen im Symbolfenster zu fragen. Es ist eine Weile her, so dass ich irgendwie meinen eigenen Code als Leitfaden hier verwendet wird, aber wenn ich das Dock Anfrage bekam, rief ich XSelectInput(dd, id, EventMask.StructureNotifyMask);

StructureNotifyMask abonniert Ereignisse einschließlich MapNotify, DestroyNotify Sie prolly sehen, wo dies gehen :)

Sobald Sie die Eingabe auf das Symbol Fenster ausgewählt haben, können Sie regelmäßige Ereignisschleife überprüfen Sie die DestroyNotify und UnmapNotify Ereignisse (mein Code überprüft beide, TBH, ich bin nicht sicher, welches das Symbol tatsächlich auslöst, wenn entfernt) und vergleichen Sie das .window Mitglied des Ereignisses mit der Fenster-ID Ihres Symbols. Wenn es übereinstimmt, gehen Sie voran und entfernen Sie es von Ihrer Liste, weil es jetzt weg ist.

Meine Taskleiste scheint einen Fehler zu haben, wenn die Anwendung abstürzt im Gegensatz zu normalerweise geschlossen ist, so könnte ich noch etwas fehlen, aber das Ereignis funktioniert Fälle in den meisten Kontrolle.