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