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-x11

    Danke für die Hilfe

    Ich kann mir vorstellen, da gibt es sicher noch andere interessante WM-Kommandos ?


Anmelden zum Antworten