GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo sale del programa X11 sin error?

La solución a este problema es sencilla:

Debe usar el miembro de estructura correcto con XDestroyWindow () función.

Debido al estándar de implementación de las estructuras de eventos X11, son muy similares entre sí. Toda estructura comienza con el miembro 'tipo', y los primeros miembros son prácticamente siempre los mismos.

Ahora suponga:

int = 4 bytes
Bool = 4 bytes
unsigned long = 8 bytes
Display* = 8 bytes
Window = 4 bytes

Si llama a XDestroyWindow () con e.xdestroywindow.window , estará a 28 bytes del comienzo de la estructura del evento, mientras que si usa e.xclient.window , estarías a 24 bytes de distancia.

Ya que vas a llamar a XDestroyWindow () con un argumento de ventana incorrecto, fallará. En cambio, si lo llama usando e.xdestroywindow.event (que está a 24 bytes del comienzo de la estructura del evento), la dirección sería correcta y la función funcionaría correctamente.

Si echas un vistazo tú mismo al Xlib.h notará que las dos estructuras tienen la ventana elemento posicionado de manera diferente.

Dicho esto, recuerda que Xlib se ha desarrollado durante años y muchos programadores trabajan con él todos los días, por lo que si hay un error misterioso, probablemente no esté dentro de Xlib. Como último consejo, quiero decirte:si quieres llegar más lejos con la programación de Xlib, siempre toma los archivos de encabezado como referencia principal, seguido del manual del sistema, y ​​luego todo lo demás.

El único error con su código al final es:

XDestroyWindow(display,e.xdestroywindow.window);

Que debe cambiarse a esto:

XDestroyWindow(display,e.xclient.window);

En su lugar, el uso de interruptor es bueno y es el más implementado, sin problemas en el código X11.

NOTA :Probé su código yo mismo, cambiando solo esa línea y luego haciendo varias pruebas, imprimiendo el resultado. La ventana XDestroy () la línea es sin duda el único error.


Solo llama al XDestroyWindow() justo antes del XCloseDisplay() .

Editar:

Lo siento, no entendí lo de XSetWMProtocols. Ahora lo he leído. Creo que estás accediendo al miembro equivocado de la unión de eventos.

XDestroyWindow(pantalla,e.xdestroywindow.ventana);

Probablemente debería ser:

XDestroyWindow(display,e.xclient.window);

Linux
  1. Cómo resolver el error de sudoers:"lo siento, debe tener un tty para ejecutar sudo"

  2. ¿Cómo redirigir la información de error del programa C ejecutable a la salida estándar? (Mac OS X)?

  3. Cómo salir de un contenedor Docker

  4. ¿Cómo se oculta el puntero del mouse en Linux/X11?

  5. ¿Cómo salir si falla un comando?

¿Cómo instalar el programa localmente sin privilegios de Sudo?

¿Cómo enviar pulsaciones de teclas (f5) desde la terminal a un programa Gui?

Consejos de Ubuntu:cómo iniciar sesión sin ingresar el nombre de usuario y la contraseña

¿Cómo salgo de la 'pantalla' sin escribir 'salir'?

¿Cómo puedo enviar un comando a un archivo sin obtener un archivo en blanco por error?

¿Cómo instala PHP5 sin instalar Apache en ubuntu?