Wie kann ich würdevoll beenden eine X11-event-Schleife?
Fast jedem tutorial finde ich sagt mir dies für mein event-Schleife:
XEvent event;
while (true)
{
XNextEvent(display, &event);
switch (event.type)
{
case Expose:
printf("Expose\n");
break;
default:
break;
}
}
Jedoch das anklicken des X zum schließen des Programms Ergebnisse in dieser Meldung.
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 10 requests (10 known processed) with 0 events remaining.
Es ist in der Tat merkwürdig zu mir, dass die Beispiele empfehlen die Verwendung einer unendlichen Schleife. Das klingt nicht natürlich, und meine andere X11-Programme nicht tun. So suchte ich herum. Ich fand heraus, wie capture the window close event.
Atom wmDeleteMessage = XInternAtom(mDisplay, "WM_DELETE_WINDOW", False);
XSetWMProtocols(display, window, &wmDeleteMessage, 1);
XEvent event;
bool running = true;
while (running)
{
XNextEvent(display, &event);
switch (event.type)
{
case Expose:
printf("Expose\n");
break;
case ClientMessage:
if (event.xclient.data.l[0] == wmDeleteMessage)
running = false;
break;
default:
break;
}
}
Funktioniert. Es beendet wird, ohne Fehler. ... Aber ich weigere mich zu glauben das ist der normale Weg, Dinge zu tun. Ich meine, ist dies der einzige Weg, um richtig zu beenden, eine X11 app? Es scheint wie eine Menge Arbeit, nur um zu erfassen, das close-Ereignis. Wie mache ich einen "richtigen" Ereignis-Schleife? Warum ist das close-Ereignis so tief vergraben? Was bin ich?
Nun, es ist nicht so sehr die "Arbeit" ich bin Beanspruchung über. Ich denke, es ist mehr nur: warum ist das so bestimmte Funktion, die so dunkel? Wie kann ich erteilen Sie die exit-Taste, "Standard-Verhalten"?
Das ganze X11-Bibliothek ist dunkel auf der Oberseite dunkel, die mehrere Ebenen tief ist. Es ist wie jemand nahm Dante ' s Inferno und schrieb es als eine C-API. Ich denke, wenn es gemacht wurde, seine Benutzerfreundlichkeit noch schlagen wie seine Vorgänger.
Hatte einen Kommentar über die Dante ' s Inferno Witz. Erste mal, dass ich lese, dass Referenz-und der C-API in ein und demselben Satz
InformationsquelleAutor TheBuzzSaw | 2012-05-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine solche Dinge wie "exit-Taste" oder "Anwendung" oder "close-Ereignis" in X11. Das ist by design.
Fensterdekorationen, exit-Tasten, und viele andere Dinge, die wir abhängig sind, nicht X11. Sie sind umgesetzt auf dem Kern X11 statt. Der name der jeweiligen Reihe von Konventionen verantwortlich für
wmDeleteMessage
ist ICCCM, schauen Sie.Xlib befasst sich nur mit dem core X11-Protokoll. Keine built-in-Ereignis schließen es.
Gibt es toolkits, die den Umgang mit ICCCM und alle anderen Dinge, die nicht in gebaut X11 einfacher (GTK, wxWindows, Qt, ...), die Sie wahrscheinlich wollen, um einen von denen benutzen.
InformationsquelleAutor n.m.
Das problem liegt in der Kommunikation zwischen X-Server und Window-Manager.
Beim Aufruf
XCreateWindow
oderXCreateSimpleWindow
, den X-Server erstellt Ihr Fenster (nicht angezeigt, bis Sie explizit anzeigen auf dem Bildschirm durch den AufrufXMapWindow
), und dann der Fenster-Manager ist verantwortlich für das anbringen von alle Dekorationen und Knöpfe, und system-Menü rund um Ihr Fenster.Können Sie anrufen
XDestroyWindow
auf Ihre eigenen zu löschen, die Fenster, und dies in der Regel bedeutet, dass es verschwindet einfach vom Bildschirm, aber dein Programm noch läuft und die Verbindung zum X-Server ist immer noch offen, so senden Sie es einige mehr Anfragen.Das problem beginnt, wenn der Benutzer klickt auf das kleine X - Taste an Ihrem Fenster der Fenster-Manager, weil es ist nicht erstellt, die der X-Server und es ist nicht sein Geschäft, um zu entscheiden, was zu tun ist dann. Jetzt ist es alle in den Händen der Window-Manager.
Wenn der Fenster-Manager einfach als
XDestroyWindow
am Fenster, es würde zu einem problem führen, wenn Ihre Anwendung wollten das closing-Ereignis etwas zu tun, bevor das Fenster zerstört wird. So das übereinkommen wurde festgelegt, zwischen X-Server und Window-Manager, um diesen Prozess zu behandeln.Ist das Standardverhalten der meisten Fenster-Manager zu zerstören der Fenster und schließen die Verbindung mit dem X-server, weil das ist, was die meisten Benutzer von Window-Manager erwarten würde: dass Sie, wenn Sie das Fenster schließen, das Programm wird beendet (und die Verbindung zum X-Server wird geschlossen, mit dem geschlossenen Fenster). Und dann, wenn Sie versuchen, zu nennen
XCloseDisplay(display)
, wird dazu führen, dass die IO-Fehler, die Sie erwähnt haben, weil die Verbindung zum server bereits geschlossen und diedisplay
Struktur ist ungültig.Hier ein Auszug aus der Xlib-Dokumentation, das erklärt dieser:
Ja, es wäre toll, wenn Sie sich nicht verbergen, so tief in Ihre docs, aber 😛
Aber wenn Sie schon finden, zum Glück ist es auch Hinweise für die Lösung.
Wenn Sie möchten, dass ein anderes Verhalten (das ist, zu erfassen, das closing-Ereignis vom Window-Manager) verwenden, benötigen Sie die
WM_DESTROY_WINDOW
Protokoll.Einen Auszug aus den docs:
Ich hatte den gleichen Fehler und ich wollte genau wissen, was es bewirkt und warum. Es dauerte einige Zeit, um es herauszufinden und finden Sie die richtige Erklärung in der doc, also setzte ich meine Erklärung hier zu sparen Sie die Zeit der anderen uninformierten.
InformationsquelleAutor SasQ