Vorrei intercettare il messaggio WM_DELETE_WINDOW
inviato a una determinata selezione di finestre di un'applicazione che sto scrivendo (AllTray), in modo che possa agire su di esso anziché sull'applicazione che lo riceve. Attualmente sto cercando di provare questo al livello GDK via gdk_display_add_client_message_filter
se possibile, ma sarei felice con una soluzione Xlib se ce n'è una anche; it sembra essere possibile, ma non riesco a capire come devo farlo con successo.Intercettare WM_DELETE_WINDOW su X11?
Attualmente, ho due programmi (scritto in C), che sto cercando di utilizzare per ottenere questo calcolato fuori, the first one non fa altro che creare una finestra e registrare che sa circa WM_DELETE_WINDOW
, e the second one tentativi di catturare quel messaggio, ma sembra fallire nel farlo; sembra proprio non fare nulla. Sto comprendendo la documentazione sbagliata su questo, o c'è qualcosa di aggiuntivo che devo fare (o devo evitare di usare GDK interamente per questo)?
Lo sfondo è questo: prima della mia riscrittura di AllTray, il modo in cui farebbe le cose sembra essere quello di cercare di intercettare un clic del mouse sul pulsante X stesso. Per alcuni gestori di finestre, questo ha funzionato correttamente, per altri non funzionava affatto, e per gli altri, l'utente doveva configurarlo manualmente e istruire AllTray dove era il pulsante per chiudere la finestra. Quello che sto cercando è una soluzione che non coinvolge uno LD_LIBRARY_PRELOAD
e funzionerà per qualsiasi combinazione di gestore di finestre/applicazioni conforme agli standard attuali e invia un ClientMessage WM_DELETE_WINDOW
quando la finestra viene chiusa.
UPDATE: Sto ancora cercando una risposta. La strada che sto percorrendo in questo momento è cercare di riparare la finestra e gestirla da sola, ma non riesco a farlo funzionare. Dopo la riparazione, non riesco a recuperarlo in alcun modo. Potrei mancare qualcosa di molto fondamentale, ma non riesco a capire come effettivamente farlo apparire di nuovo la mia finestra, per riportarlo sullo schermo.
UPDATE 2: OK, quindi ho colpito un altro muro di mattoni. La documentazione del server X dice di impostare StructureNotifyMask sulla maschera eventi della finestra per ricevere sia gli eventi MapNotify che ReparentNotify. Sarei interessato a ricevere entrambi. Il mio pensiero corrente era di creare una finestra che servisse proprio come un ricevitore di eventi, e poi quando ricevo eventi per cose interessanti, agisco su di loro creando e riparando. Tuttavia, questo semplicemente non sembra funzionare. Gli unici eventi che effettivamente ricevo sono gli eventi PropertyNotify. Quindi, anche questa via non sembra fare molto bene.
Penso che potrebbe essere possibile riparando la finestra all'interno del tuo stesso livello e filtrando quali eventi si passano? Non penso che il modo in cui stai attualmente provando possa funzionare. – wrt
Ci sono degli svantaggi nel farlo in quel modo? Cioè, c'è qualcosa in particolare che potrebbe causare che interferire con cose come XDND o qualsiasi altra cosa? È un'idea portatile (come in, non si romperà applicazioni o gestori di finestre)? Mi sembra di essere in grado di trovare pochissime informazioni al riguardo. Suppongo che significhi anche che dovrei creare una nuova finestra "genitore" per ogni nuova finestra client, corretta? –