GNU/Linux >> Tutoriels Linux >  >> Linux

Comment quitter le programme X11 sans erreur

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);

Linux
  1. Erreur dans le fichier Sudoers ? Voici comment vous pouvez y remédier.

  2. Vim surligne les textes en rouge ? Voici comment vous pouvez arrêter cela !

  3. Comment exécuter un programme spécifique en tant que root sans invite de mot de passe ?

  4. Comment rediriger les informations d'erreur du programme C exécutable vers Stdout ? (Mac OS X)?

  5. Comment sortir de 'screen' sans taper 'exit' ?

Comment quitter un conteneur Docker

Astuces Ubuntu :comment se connecter sans saisir de nom d'utilisateur ni de mot de passe

Comment masquer le pointeur de la souris sous Linux/X11 ?

Comment quitter si une commande a échoué ?

Comment quitter une connexion SSH ?

Comment puis-je sortir une commande dans un fichier, sans obtenir un fichier vide en cas d'erreur ?