Abfangen WM_DELETE_WINDOW auf X11?
Möchte ich abfangen der WM_DELETE_WINDOW
- Nachricht wird gebucht, um eine bestimmte Auswahl von windows, eine Anwendung, die ich Schreibe (AllTray), so dass ich Tat es, anstatt von der Anwendung empfangen. Ich bin derzeit auf der Suche bei dem Versuch diese an die GDK-Ebene über gdk_display_add_client_message_filter
, wenn möglich, aber ich würde gerne mit ein Xlib-Lösung, wenn es auch; es scheint möglich sein, aber ich weiß einfach nicht scheinen zu verstehen, wie ich bin, um es erfolgreich zu tun.
Derzeit habe ich zwei Programme (in C geschrieben), die ich versuche zu nutzen, um diese herausgefunden, der erste nichts tut, sondern ein Fenster erstellen und registrieren, dass es weiß, über WM_DELETE_WINDOW
, und die zweite versuche, zu fangen, die Nachricht, aber scheint nicht das zu tun; es scheint zu tun genau nichts. Verstehe ich die Dokumentation falsch oder ist es etwas zusätzliches, das ich tun müssen (oder brauche ich, um zu vermeiden, mit GDK ausschließlich für diese)?
Der hintergrund: Vor meiner re-schreiben von AllTray, wie Sie Dinge tun, zu sein scheint, zu versuchen, Sie abzufangen ein Maus-klicken Sie auf die X-Taste selbst. Für einige window-Manager, das funktioniert, für den anderen ist es überhaupt nicht arbeiten, und für die anderen, musste der Benutzer manuell konfigurieren, und weisen AllTray, wo der Knopf zum schließen des Fensters war. Was ich Suche ist eine Lösung, die nicht die eine LD_LIBRARY_PRELOAD
und funktioniert für alle window-manager/application Kombination entspricht den aktuellen Normen und sendet eine WM_DELETE_WINDOW
ClientMessage, wenn das Fenster geschlossen ist.
UPDATE: ich bin noch auf der Suche nach einer Antwort. Die route, die ich nehme im moment ist es zu versuchen, reparent die Fenster und verwalten Sie es selber, aber ich kann einfach nicht damit es funktioniert. Nach der übernahme, ich bin anscheinend nicht in der Lage sein, um es wieder in irgendeiner Weise. Ich kann fehlen, etwas sehr grundlegendes, aber ich kann nicht herausfinden, wie man tatsächlich machen es erscheinen Sie, meine eigenen Fenster erneut, um es wieder auf dem Bildschirm.
UPDATE 2: Okay, also ich habe hit " another brick Wand. Die X-server-Dokumentation sagt, um die StructureNotifyMask auf das Fenster Ereignis-Maske zu erhalten, sowohl MapNotify und ReparentNotify Veranstaltungen. Mich würde interessieren, erhalten entweder. Meine aktuelle überlegung war, ein Fenster zu erstellen, die diente nur als event-Empfänger, und dann, wenn ich Ereignisse, die für interessante Dinge, die auf Sie einwirken, indem Sie die Schaffung und übernahme. Jedoch, diese einfach nicht zu funktionieren scheint. Die einzigen Ereignisse, die ich tatsächlich erhalten sind PropertyNotify Veranstaltungen. So, diese route scheint es nicht zu sein, tut sehr viel gutes, entweder.
- Ich denke, es könnte möglich sein, durch übernahme-die Fenster in Ihre eigene toplevel, und filtern, welche Ereignisse Sie weitergeben? Ich glaube nicht, dass die Art und Weise, die Sie derzeit versuchen arbeiten können.
- Gibt es irgendwelche Nachteile dabei? Das heißt, ist es alles in allem dazu führen würde, dass das zu stören Dinge wie XDND oder was auch immer? Ist es eine tragbare Idee (wie in, es wird nicht brechen, Anwendungen und window-Manager)? Ich scheine in der Lage zu finden, sehr wenig Informationen über das. Ich gehe davon aus, dass es auch bedeutet, dass ich hätte, um eine zu erstellen neuen "Eltern" - Fenster für jede neue client-Fenster, richtig?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß nicht, X11, aber ich habe mal gegoogelt mit "Abfangen
WM_DELETE_WINDOW
X11" als Schlagworte. Gefunden 17k - MarkMail und Mplayer-verpflichtet r154 - trunk/libvo. In beiden Fällen sind Sie die gleiche Sache zu tun.innerhalb
static void x11_init()
,dann, innerhalb
static int x11_check_events()
,Sehen XInternAtom, XSetWMProtocols und XNextEvent.
Nachdem ich das oben geschrieben habe, fand ich Umgang mit Fenster schließen in einem X11-app:
Leider die beste Antwort auf diese Frage ist eine Reihe von nicht-Antworten; gibt es technisch Möglichkeiten, um es zu erreichen, aber Sie haben alle übertretungen, die machen Sie sehr unpraktisch:
LD_PRELOAD
Bibliothek trick. Dies hat mehrere Nachteile:LD_PRELOAD
auch unter UNIX-ähnlichen Systemen.LD_PRELOAD
Modul für die einzelnen Bibliotheken, die eine Anwendung verwenden könnte, um zu sprechen mit X11.LD_PRELOAD
auch wenn Sie lief unter einem linker, der unterstützt es, weil Sie nicht verwenden, ein gemeinsam genutztes Objekt oder DLL zur Kommunikation mit X; denken Sie zum Beispiel an eine Java-Anwendung, die nutzt eine X11-Protokoll-Bibliothek, geschrieben in Java selbst.LD_PRELOAD
Bibliotheken müssen setuid/setgid, wenn Sie verwendet werden, die mit setuid/setgid-Programme. Dies ist natürlich eine potentielle Sicherheitslücke.Letztendlich konnte ich endlich mein Ziel erreichen, indem Sie mit einem ganz eigenen Mechanismus; wer interessiert ist, bitte sehen Sie die Close-to-Tray-Unterstützung in AllTray 0.7.5.1 dev und höher, einschließlich die git-master-branch auf github verfügbar.
Ok, zu erarbeiten, auf meinen früheren Vorschlag, möchten Sie vielleicht, um zu untersuchen XEmbed. Zumindest das könnte Ihnen einige Ideen zu versuchen.
Gelingt das nicht, würde ich schauen, wie andere ähnliche software sein könnten (z.B. wmdock, oder wie GtkPlug/GtkSocket implementiert ist), aber ich glaube, in beiden Fällen explizite Unterstützung ist erforderlich bei den Anwendungen.
Hoffe, das ist hilfreicher.
Sollten Sie Lesen ICCCM, die Ihnen sagt, wie Fenster-manager kommuniziert mit dem Kunden. Die meisten WM-erstellen Sie ein frame-Fenster, um das Fenster der obersten Ebene, über die übernahme. Also, wenn Ihr reparent zerbrechen der Beziehung bekannt durch die WM und Ihre client-Fenster.