La solution à ce problème est simple :
Vous devez utiliser le bon membre de structure avec le XDestroyWindow () fonction.
En raison de la norme d'implémentation des structures d'événements X11, elles sont très similaires les unes aux autres. Chaque structure commence par le membre 'type', et les premiers membres sont pratiquement toujours les mêmes.
Supposons maintenant :
int = 4 bytes
Bool = 4 bytes
unsigned long = 8 bytes
Display* = 8 bytes
Window = 4 bytes
Si vous appelez XDestroyWindow () avec e.xdestroywindow.window , vous serez à 28 octets du début de la structure de l'événement, alors que si vous utilisez e.xclient.window , vous seriez à 24 octets.
Puisque vous allez appeler XDestroyWindow () avec un mauvais argument de fenêtre, cela échouera. Au lieu de cela, si vous l'appelez en utilisant e.xdestroywindow.event (qui est à 24 octets du début de la structure de l'événement), l'adresse serait correcte et la fonction fonctionnerait correctement.
Si vous jetez un coup d'œil vous-même au Xlib.h fichier, vous remarquerez que les deux structures ont la fenêtre élément positionné différemment.
Cela dit, rappelez-vous que Xlib a été développé pendant des années et que de nombreux programmeurs travaillent quotidiennement avec, donc s'il y a une erreur mystérieuse, ce n'est probablement pas dans Xlib. Comme dernier indice, je veux vous dire :si vous voulez aller plus loin avec la programmation Xlib, prenez toujours les fichiers d'en-tête comme référence principale, suivis du manuel du système, puis de tout le reste.
La seule erreur avec votre code à la fin est :
XDestroyWindow(display,e.xdestroywindow.window);
Qui doit être remplacé par ceci :
XDestroyWindow(display,e.xclient.window);
Au lieu de cela, l'utilisation de commutateur est bon, et est le plus implémenté, sans aucun problème avec le code X11.
REMARQUE :J'ai testé votre code moi-même, en changeant uniquement cette ligne, puis en faisant divers tests, en imprimant le résultat. La XDestroyWindow () est à coup sûr la seule erreur.
Appelez simplement XDestroyWindow()
juste avant XCloseDisplay()
.
Modifier :
Désolé, je n'ai pas compris le truc XSetWMProtocols. Maintenant, j'ai lu à ce sujet. Je pense que vous accédez au mauvais membre de l'union de l'événement.
XDestroyWindow(affichage,e.xdestroywindow.window);
Devrait probablement être :
XDestroyWindow(display,e.xclient.window);