GNU/Linux >> Linux Esercitazione >  >> Linux

Come si esce dal programma X11 senza errori

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

Linux
  1. Come risolvere l'errore sudoers - "mi dispiace, devi avere un tty per eseguire sudo"

  2. Errore nel file Sudoers? Ecco come puoi risolverlo.

  3. Come installare il programma in locale senza privilegi Sudo?

  4. Come reindirizzare le informazioni sull'errore del programma C eseguibile su Stdout? (Mac Os X)?

  5. Come andare oltre la finestra 9 in GNU Screen senza andare all'elenco delle finestre?

Suggerimenti per Ubuntu:come accedere senza inserire nome utente e password

Come esco dallo "schermo" senza digitare "esci"?

Come si crea una finestra in Linux con C++?

Come può un file manager montare un'unità senza root?

Come posso inviare un comando a un file, senza ottenere un file vuoto per errore?

Come si installa PHP5 senza installare Apache in Ubuntu?