http://www.jwz.org/xscreensaver/xscreensaver-5.14.tar.gz
[xscreensaver] / driver / test-xdpms.c
index a401c38cd7aca45f7773882d54adebba4d3ab57a..b86aed3af56cfe409d4ffe4315a3189a66ab78f8 100644 (file)
@@ -1,5 +1,5 @@
 /* test-xdpms.c --- playing with the XDPMS extension.
- * xscreensaver, Copyright (c) 1998 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1998-2011 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -65,6 +65,16 @@ blurb (void)
 }
 
 
+static Bool error_handler_hit_p = False;
+
+static int
+ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
+{
+  error_handler_hit_p = True;
+  return 0;
+}
+
+
 int
 main (int argc, char **argv)
 {
@@ -148,11 +158,20 @@ main (int argc, char **argv)
          state == DPMSModeSuspend ||
          state == DPMSModeOff)
        {
-         Status st;
+          XErrorHandler old_handler;
+         int st;
          fprintf(stderr, "%s: monitor is off; turning it on.\n", blurb());
+
+          XSync (dpy, False);
+          error_handler_hit_p = False;
+          old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+          XSync (dpy, False);
          st = DPMSForceLevel (dpy, DPMSModeOn);
+          XSync (dpy, False);
+          if (error_handler_hit_p) st = -666;
+
          fprintf (stderr, "%s: DPMSForceLevel (dpy, DPMSModeOn) ==> %s\n",
-                  blurb(), (st ? "Ok" : "Error"));
+                  blurb(), (st == -666 ? "X Error" : st ? "Ok" : "Error"));
        }
 
       sleep (delay);