Die Lösung für dieses Problem ist einfach:
Sie müssen das richtige Strukturelement mit dem XDestroyWindow verwenden () Funktion.
Aufgrund des Implementierungsstandards der X11-Ereignisstrukturen sind sie einander sehr ähnlich. Jede Struktur beginnt mit dem 'Typ'-Member, und die ersten Mitglieder sind praktisch immer gleich.
Nehmen Sie nun an:
int = 4 bytes
Bool = 4 bytes
unsigned long = 8 bytes
Display* = 8 bytes
Window = 4 bytes
Wenn Sie XDestroyWindow aufrufen () mit e.xdestroywindow.window , werden Sie 28 Bytes vom Beginn der Ereignisstruktur entfernt sein, während Sie e.xclient.window verwenden , wären Sie 24 Bytes entfernt.
Da Sie XDestroyWindow aufrufen werden () mit einem falschen Fensterargument wird es fehlschlagen. Stattdessen, wenn Sie es mit e.xdestroywindow.event aufrufen (was 24 Bytes vom Beginn der Ereignisstruktur entfernt ist), wäre die Adresse richtig und die Funktion würde ordnungsgemäß funktionieren.
Werfen Sie selbst einen Blick auf die Xlib.h -Datei werden Sie feststellen, dass die beiden Strukturen das Fenster haben Element anders positioniert.
Denken Sie daran, dass Xlib seit Jahren entwickelt wird und viele Programmierer jeden Tag damit arbeiten. Wenn also ein mysteriöser Fehler auftritt, liegt er wahrscheinlich nicht in Xlib. Als letzten Hinweis möchte ich Ihnen sagen:Wenn Sie mit der Xlib-Programmierung weiterkommen wollen, nehmen Sie immer die Header-Dateien als primäre Referenz, gefolgt vom Systemhandbuch, dann dem ganzen Rest.
Der einzige Fehler mit Ihrem Code am Ende ist:
XDestroyWindow(display,e.xdestroywindow.window);
Was muss geändert werden in:
XDestroyWindow(display,e.xclient.window);
Stattdessen die Verwendung von switch ist gut und am besten implementiert, ohne Probleme mit dem X11-Code.
HINWEIS :Ich habe Ihren Code selbst getestet, indem ich nur diese Zeile geändert und dann verschiedene Tests durchgeführt und das Ergebnis gedruckt habe. Das XDestroyWindow () Zeile ist sicher der einzige Fehler.
Rufen Sie einfach XDestroyWindow()
an direkt vor XCloseDisplay()
.
Bearbeiten:
Tut mir leid, ich habe die XSetWMProtocols-Sache nicht verstanden. Jetzt habe ich mich eingelesen. Ich glaube, Sie greifen auf das falsche Mitglied der Event Union zu.
XDestroyWindow(display,e.xdestroywindow.window);
Sollte wahrscheinlich lauten:
XDestroyWindow(display,e.xclient.window);