GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie beendet man das X11-Programm ohne Fehler?

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

Linux
  1. Fehler in Sudoers-Datei? So können Sie es beheben.

  2. Warum erhalten Sie cp:Weglassen des Verzeichnisfehlers in Linux und wie Sie ihn lösen können

  3. Wie führe ich ein bestimmtes Programm als Root ohne Passwortabfrage aus?

  4. Wie sendet man Tastenanschläge (f5) vom Terminal an ein Gui-Programm?

  5. Wie versteckt man den Mauszeiger unter Linux/X11?

So beenden Sie einen Docker-Container

Ubuntu-Tipps:So melden Sie sich an, ohne Benutzername und Passwort einzugeben

Wie kann man beenden, wenn ein Befehl fehlgeschlagen ist?

Wie komme ich aus dem Bildschirm heraus, ohne „exit“ einzugeben?

Wie kann man in GNU Screen an Fenster 9 vorbeigehen, ohne zur Fensterliste zu gehen?

Wie beende ich eine SSH-Verbindung?