X11 / Schliessen Button [X] abfangen
-
Ich habe folgendes Miniprogramm für ein X11 Fenster . Wen ich das laufende Programm mit [ESC] abbreche, wird es ordentlich beendet.
X connection to :0 broken (explicit kill or server shutdown).
Dies ist ein Zeichen, das mein Programm einfach vom X-Server abgewürgt wird. Etwa gleich, wie wen ich es in der Konsole mit "xkill" mache.
#include <X11/keysym.h> #include <X11/Xlib.h> #include <X11/Xutil.h> static Display *display; static int screen; static int depth; static Window win; int quit = 0; static int create_window (void) { display = XOpenDisplay (NULL); screen = XDefaultScreen (display); depth = XDefaultDepth (display, screen); win = XCreateSimpleWindow ( display, RootWindow (display, screen), 100, 10, 400, 300, 5, 0x000000, 0xFFFFFF); XSelectInput (display, win, ButtonPressMask | KeyPressMask); XMapWindow (display, win); } static void eventloop (void) { XEvent xev; XNextEvent (display, &xev); switch (xev.type) { case KeyPress: if (XLookupKeysym (&xev.xkey, 0) == XK_Escape){ quit = 1;} break; } } int main (int argc, char **argv) { create_window (); while (!quit) { eventloop ();} XDestroyWindow(display, win); XCloseDisplay (display); }
Nun zur Frage, kann ich dies irgendwie umgehen, zB. mit einem Event-Handle ?
Irgendwie muss es ja gehen, schon der einfachste Editor fängt dies ab, um die Daten zu speichern.
-
Der Fenstermanager "sendet" ein ClientMessage vom typ "WM_DELETE_WINDOW"
Für diese ClientMessage musst die Application sich registrieren dass du events von diesem Typ behandelt werden soll von der Application
-
@Mathuas Vermutlich wird ein Signal gesendet, also SIGTERM oder SIGKILL. Das musst du halt abfangen. man sigaction
-
@firefly sagte in :
WM_DELETE_WINDOW
Ich habe nach WM_DELETE_WINDOW gegoogelt und bin auf folgendes gestossen, dort hat es ein gutes Examples.
https://stackoverflow.com/questions/1157364/intercept-wm-delete-window-on-x11Danke für die Hilfe
Ich kann mir vorstellen, da gibt es sicher noch andere interessante WM-Kommandos ?