Tengo un "Hola mundo" bastante simple en X11 al final de la pregunta. Pero cuando sale me sale el mensaje de error en tiempo de ejecución a continuación:Cómo salir del programa X11 sin error
$ ./xtest
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 9 requests (7 known processed) with 0 events remaining.
así que he intentado manipular el wmDeleteMessage
mí, y yo era capaz de detener la ventana se cierre, así que sé que estoy recibiendo el evento correctamente. Luego de agregar un XDestroyWindow()
al manejo de eventos, recibo nuevos errores.
X Error of failed request: BadWindow (invalid Window parameter)
Major opcode of failed request: 4 (X_DestroyWindow)
Resource id in failed request: 0x130
Serial number of failed request: 12
Current serial number in output stream: 12
Suena como que estoy tratando de destruir una ventana ya destruida, pero si saco la XDestroyWindow()
que se mantiene vivo en mi pantalla.
A continuación se muestra el código con un intento de destruir a un controlador de ventana. ¿Cómo salgo sin ningún error?
#include<X11/Xlib.h>
#include <iostream>
int main()
{
Display *display;
if(!(display=XOpenDisplay(NULL)))
{
std::cerr << "ERROR: could not open display\n";
return 1;
}
int screen = DefaultScreen(display);
Window rootwind = RootWindow(display, screen);
Colormap cmap = DefaultColormap(display, screen);
Atom wmDeleteMessage = XInternAtom(display, "WM_DELETE_WINDOW", False);
int blackColor = BlackPixel(display, screen);
int whiteColor = WhitePixel(display, screen);
Window w = XCreateSimpleWindow(display, rootwind, 0, 0, 200, 100, 0, blackColor, blackColor);
XMapWindow(display, w);
XSetWMProtocols(display, w, &wmDeleteMessage, 1);
bool running = true;
while(running)
{
XEvent e;
XNextEvent(display, &e);
switch (e.type)
{
case ClientMessage:
if(e.xclient.data.l[0] == wmDeleteMessage)
{
std::cout << "Shutting down now!!!" << std::endl;
XDestroyWindow(display,e.xdestroywindow.window);
running=false;
break;
}
break;
}
}
XCloseDisplay(display);
return 0;
}
actualización
línea cambiado a:
std::cout << "Shutting down now!!!" << std::endl;
XDestroyWindow(display,w);
Qué no me gusta porque yo planeo tener más de ventana, pero por ahora estoy de nuevo a la primera mensaje de error que tuve:
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 9 requests (7 known processed) with 0 events remaining.
actualización
intentado cambiar muchas cosas como tener el bucle de ejecución fuera de XPending(). Decidió ejecutar el hello world de otra persona y me sale el mismo problema con su código. Debe haber algo mal con mi configuración.
Actualización Aparentemente, muchas personas tienen este problema. Google ftk tuvo este problema y lo arreglaron en su change log. Llaman a FTK_QUIT() que supongo que es como Exit(). Así que puse mi regreso allí dentro del ciclo y eso resolvió el problema. No estoy seguro por qué pero lo hizo. código fijo:
case ClientMessage:
if(e.xclient.data.l[0] == wmDeleteMessage)
{
XDestroyWindow(display,e.xclient.window);
XCloseDisplay(display);
return 0;
}
seguirá siendo dar respuesta correcta a alguien que pueda explicar por qué y si es posible mover la instrucción de retorno (junto con el XCloseDisplay
) fuera del bucle.
El bucle de eventos debe tener este aspecto salir correctamente:
XEvent e;
do
{
XNextEvent(display, &e);
if(e.type == ClientMessage && e.xclient.data.l[0] == wmDeleteMessage)
{
XDestroyWindow(display,e.xclient.window);
break;
}
//...
}while (XPending(display) > 0)
XCloseDisplay(display);
return 0;
Cuando se ejecuta en un comunicado switch
el código no funciona. Incluso si sale del bucle sin llamar a otra función X. La instrucción if
anterior colocada antes de su declaración switch
soluciona el problema sin regresar del programa dentro del ciclo.
Se agregó escape to loop porque se dio cuenta de que nunca se rompe. Todavía los mismos mensajes de error. –
¿Por qué quieres hacer directamente la programación de X11? Recomiendo usar un juego de herramientas gráficas, como GTK o Qt (pero también hay otras: FLTK, Fox ...) –
@Starynkevitch Más para entender cómo funciona. No por trabajo o escuela –