La soluzione a questo problema è semplice:
Devi utilizzare il membro della struttura corretto con XDestroyWindow () funzione.
A causa dello standard di implementazione delle strutture di eventi X11, sono molto simili tra loro. Ogni struttura inizia con il membro 'tipo', ei primi membri sono praticamente sempre gli stessi.
Ora supponi:
int = 4 bytes
Bool = 4 bytes
unsigned long = 8 bytes
Display* = 8 bytes
Window = 4 bytes
Se chiami XDestroyWindow () con e.xdestroywindow.window , sarai a 28 byte dall'inizio della struttura dell'evento, mentre se usi e.xclient.window , saresti a 24 byte di distanza.
Dal momento che chiamerai XDestroyWindow () con un argomento Window sbagliato, fallirà. Invece se lo chiami usando e.xdestroywindow.event (che dista 24 byte dall'inizio della struttura dell'evento), l'indirizzo sarebbe corretto e la funzione funzionerebbe correttamente.
Se dai un'occhiata tu stesso a Xlib.h file, noterai che le due strutture hanno la finestra elemento posizionato diversamente.
Detto questo, ricorda che Xlib è stato sviluppato per anni e molti programmatori ogni giorno ci lavorano, quindi se c'è un errore misterioso, probabilmente non è all'interno di Xlib. Come ultimo suggerimento voglio dirti:se vuoi andare più lontano con la programmazione di Xlib, prendi sempre i file di intestazione come riferimento principale, seguiti dal manuale di sistema, poi tutto il resto.
L'unico errore con il tuo codice alla fine è:
XDestroyWindow(display,e.xdestroywindow.window);
Che deve essere cambiato in questo:
XDestroyWindow(display,e.xclient.window);
Invece l'uso di switch è buono ed è il più implementato, senza problemi sul codice X11.
NOTA :Ho testato io stesso il tuo codice, cambiando solo quella riga, e poi facendo vari test, stampando il risultato. XDestroyWindow () è sicuramente l'unico errore.
Basta chiamare XDestroyWindow()
subito prima del XCloseDisplay()
.
Modifica:
Scusa, non ho capito la cosa XSetWMProtocols. Ora ho letto su di esso. Penso che tu stia accedendo al membro sbagliato dell'unione degli eventi.
XDestroyWindow(display,e.xdestroywindow.window);
Probabilmente dovrebbe essere:
XDestroyWindow(display,e.xclient.window);