--- ./src/ui/ui-drv/x11/xlib.c.gege 2003-04-10 22:06:21.000000000 +0200 +++ ./src/ui/ui-drv/x11/xlib.c 2003-04-10 22:20:26.000000000 +0200 @@ -97,6 +97,18 @@ } #ifdef MITSHM +// Trap SHM errors +static Bool shm_error = False; +static int (*old_error_handler)(Display *, XErrorEvent *); + +static int error_handler(Display *d, XErrorEvent *e) +{ + if (e->error_code == BadAccess) { + shm_error = True; + return 0; + } else + return old_error_handler(d, e); +} int alloc_shm_image (xdisplay * new) { @@ -155,10 +167,15 @@ (char *) new->image[i]->data; new->xshminfo[i].readOnly = True; + /* Try to attach SHM image, catching errors */ + shm_error = False; + old_error_handler = XSetErrorHandler(error_handler); + new->SharedMemFlag = XShmAttach (new->display, &new->xshminfo[i]); XSync (new->display, False); - if (!new->SharedMemFlag) + XSetErrorHandler(old_error_handler); + if (!new->SharedMemFlag || shm_error) { XDestroyImage (new->image[i]); new->image[i] = (XImage *) NULL;