LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (https://www.linuxquestions.org/questions/programming-9/)
-   -   How to make X program not abort when its window is closed/server killed? (https://www.linuxquestions.org/questions/programming-9/how-to-make-x-program-not-abort-when-its-window-is-closed-server-killed-782237/)

10110111 01-14-2010 02:25 PM

How to make X program not abort when its window is closed/server killed?
 
I try to run a simple Xlib program:
Code:

/*
  Simple Xlib application drawing a box in a window.
  gcc input.c -o output -lX11
 */

 #include <X11/Xlib.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>

 int main(void) {
  Display *d;
  Window w;
  XEvent e;
  char *msg = "Hello, World!";
  int s;

                        /* open connection with the server */
  d = XOpenDisplay(NULL);
  if (d == NULL) {
    fprintf(stderr, "Cannot open display\n");
    exit(1);
  }

  s = DefaultScreen(d);

                        /* create window */
  w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 200, 200, 1,
                          BlackPixel(d, s), WhitePixel(d, s));

                        /* select kind of events we are interested in */
  XSelectInput(d, w, ExposureMask | KeyPressMask);

                        /* map (show) the window */
  XMapWindow(d, w);

                        /* event loop */
  while (1) {
    XNextEvent(d, &e);
                        /* draw or redraw the window */
    if (e.type == Expose) {
      XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10);
      XDrawString(d, w, DefaultGC(d, s), 50, 50, msg, strlen(msg));
    }
                        /* exit on key press */
    if (e.type == KeyPress)
      break;
  }

                        /* close connection to server */
  XCloseDisplay(d);

  return 0;
 }

When i kill X server or close program's window, it aborts with error:
Quote:

XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0.0"
after 9 requests (9 known processed) with 0 events remaining.
I found that XNextEvent is the reason of abort.
How can i make it try to reconnect to new server or do anything else instead of just aborting?

paulsm4 01-15-2010 09:30 AM

Hi -

This thread might be useful to you:

http://www.linuxquestions.org/questi...IOErrorHandler

Search for "XSetIOErrorHandler" or "WM_DELETE_WINDOW".

'Hope that helps .. PSM

10110111 01-15-2010 01:41 PM

Quote:

Xlib calls the program's supplied error handler if any sort of system call error occurs (for example, the connection to the server was lost). This is assumed to be a fatal condition, and the called routine should not return. If the I/O error handler does return, the client process exits.
So, how should the program continue execution if it doesn't assume i/o error as fatal? goto some label in main()? But then there's a memory leak at least in stack... is there a better way?

paulsm4 01-17-2010 12:22 AM

Hi -

If you want to mess around with Xlib, you get to manage the low level details yourself.

If you wanted to try a higher-level framework (which, of course, I strongly encourage), then the framework will probably let you handle things like "window manager close" events more easily. You might want to investigate either/both GTK+ and/or Qt.

IMHO .. PSM


All times are GMT -5. The time now is 01:58 PM.