X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=driver%2Fxscreensaver.c;h=63a63c83da2360cdc70ff06e59bb905210abeb57;hb=3c58fb6311db49c46f1670922933b27c6ea0c065;hp=641ccddace6851da837c3e13e478a7aaaaf9a165;hpb=a445bdd3e3ba4abbee441844b6665b4c3c13d48c;p=xscreensaver diff --git a/driver/xscreensaver.c b/driver/xscreensaver.c index 641ccdda..63a63c83 100644 --- a/driver/xscreensaver.c +++ b/driver/xscreensaver.c @@ -292,16 +292,27 @@ int saver_ehandler (Display *dpy, XErrorEvent *error) { saver_info *si = global_si_kludge; /* I hate C so much... */ + int i; if (!real_stderr) real_stderr = stderr; fprintf (real_stderr, "\n" "#######################################" "#######################################\n\n" - "%s: X Error! PLEASE REPORT THIS BUG.\n\n" - "#######################################" - "#######################################\n\n", + "%s: X Error! PLEASE REPORT THIS BUG.\n", blurb()); + + for (i = 0; i < si->nscreens; i++) + fprintf (real_stderr, "%s: screen %d: 0x%x, 0x%x, 0x%x\n", + blurb(), i, + RootWindowOfScreen (si->screens[i].screen), + si->screens[i].real_vroot, + si->screens[i].screensaver_window); + + fprintf (real_stderr, "\n" + "#######################################" + "#######################################\n\n"); + if (XmuPrintDefaultErrorMessage (dpy, error, real_stderr)) { fprintf (real_stderr, "\n"); @@ -740,6 +751,10 @@ initialize_per_screen_info (saver_info *si, Widget toplevel_shell) } si->fading_possible_p = found_any_writable_cells; + +#ifdef HAVE_XF86VMODE_GAMMA + si->fading_possible_p = True; /* if we can gamma fade, go for it */ +#endif } @@ -1172,9 +1187,12 @@ main (int argc, char **argv) */ +static Bool error_handler_hit_p = False; + static int ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error) { + error_handler_hit_p = True; return 0; } @@ -1190,11 +1208,13 @@ XGetAtomName_safe (Display *dpy, Atom atom) if (!atom) return 0; XSync (dpy, False); + error_handler_hit_p = False; old_handler = XSetErrorHandler (ignore_all_errors_ehandler); result = XGetAtomName (dpy, atom); XSync (dpy, False); XSetErrorHandler (old_handler); XSync (dpy, False); + if (error_handler_hit_p) result = 0; if (result) return result; @@ -1215,6 +1235,8 @@ clientmessage_response (saver_info *si, Window w, Bool error, char *proto; int L; saver_preferences *p = &si->prefs; + XErrorHandler old_handler; + if (error || p->verbose_p) fprintf (stderr, "%s: %s\n", blurb(), stderr_msg); @@ -1224,9 +1246,23 @@ clientmessage_response (saver_info *si, Window w, Bool error, strcpy (proto+1, protocol_msg); L++; + /* Ignore all X errors while sending a response to a ClientMessage. + Pretty much the only way we could get an error here is if the + window we're trying to send the reply on has been deleted, in + which case, the sender of the ClientMessage won't see our response + anyway. + */ + XSync (si->dpy, False); + error_handler_hit_p = False; + old_handler = XSetErrorHandler (ignore_all_errors_ehandler); + XChangeProperty (si->dpy, w, XA_SCREENSAVER_RESPONSE, XA_STRING, 8, PropModeReplace, (unsigned char *) proto, L); + XSync (si->dpy, False); + XSetErrorHandler (old_handler); + XSync (si->dpy, False); + free (proto); }