Ho un "Hello World" abbastanza semplice in X11 alla fine della domanda. Ma quando si esce ricevo i messaggi di errore di runtime di seguito:Come si esce dal programma X11 senza errore
$ ./xtest
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 9 requests (7 known processed) with 0 events remaining.
così ho provato la manipolazione del wmDeleteMessage
me stesso, e sono stato in grado di fermare la finestra da chiudere, quindi so io sono sempre correttamente l'evento. Di quanto ho aggiunto un XDestroyWindow()
alla gestione degli eventi e ottengo nuovi errori.
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
suona come io sto cercando di distruggere una finestra già distrutto, ma se prendo il XDestroyWindow()
rimane vivo sul mio schermo.
Di seguito è riportato il mio codice con un tentativo di distruggere un gestore di finestre. Come posso uscire senza errori?
#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;
}
Aggiornamento
linea cambiato in:
std::cout << "Shutting down now!!!" << std::endl;
XDestroyWindow(display,w);
Il che non mi piace, perché ho intenzione di avere più di finestra, ma per ora sono indietro al primo messaggio di errore che ho avuto:
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 9 requests (7 known processed) with 0 events remaining.
Aggiornamento
Provato a cambiare molte cose in giro come se il ciclo si allontanasse da XPending(). Ho deciso di eseguire il numero hello world di qualcun altro e ottengo lo stesso problema con il loro codice. Deve essere qualcosa di sbagliato con il mio setup.
Aggiornamento Apparentemente molte persone hanno questo problema. Google ftk ha avuto questo problema e lo hanno risolto nel loro change log. Chiamano FTK_QUIT() che sto indovinando è come Exit(). Così ho messo il mio ritorno proprio lì dentro il loop e questo ha risolto il problema. Non so perché, ma lo ha fatto. codice fisso:
case ClientMessage:
if(e.xclient.data.l[0] == wmDeleteMessage)
{
XDestroyWindow(display,e.xclient.window);
XCloseDisplay(display);
return 0;
}
darà ancora risposta corretta a qualcuno che può spiegare perché e se è possibile spostare l'istruzione return (insieme al XCloseDisplay
) al di fuori del ciclo.
il ciclo degli eventi dovrebbe essere simile a questo per uscire correttamente:
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;
Quando si esegue in un comunicato switch
il codice non funziona. Anche se esce dal ciclo senza chiamare un'altra funzione X. L'istruzione if
sopra posizionata prima della tua istruzione switch
risolve il problema senza tornare dal programma all'interno del ciclo.
Aggiunto escape to loop perché ha realizzato che non si interrompe mai. Ancora gli stessi messaggi di errore. –
Perché vuoi eseguire direttamente la programmazione X11? Consiglio vivamente di utilizzare un toolkit grafico, come GTK o Qt (ma ce ne sono anche altri: FLTK, Fox ...) –
@Starynkevitch Altro per capire come funziona. Non per lavoro o scuola. –