From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / driver / dpms.c
index d88737eefd98340fe9412a6ce4f03f4c2179aec8..553e476ee0886597ff6bfd4453a0e6c61732d1ad 100644 (file)
@@ -1,5 +1,5 @@
 /* dpms.c --- syncing the X Display Power Management values
- * xscreensaver, Copyright (c) 2001-2011 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 2001-2017 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
@@ -97,7 +97,7 @@ ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
 
 
 void
-sync_server_dpms_settings (Display *dpy, Bool enabled_p,
+sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p,
                            int standby_secs, int suspend_secs, int off_secs,
                            Bool verbose_p)
 {
@@ -107,6 +107,12 @@ sync_server_dpms_settings (Display *dpy, Bool enabled_p,
   CARD16 o_standby = 0, o_suspend = 0, o_off = 0;
   Bool bogus_p = False;
 
+  if (dpms_quickoff_p && !off_secs)
+  {
+    /* To do this, we might need to temporarily re-enable DPMS first. */
+    off_secs = 0xFFFF;
+  }
+
   if (standby_secs == 0 && suspend_secs == 0 && off_secs == 0)
     /* all zero implies "DPMS disabled" */
     enabled_p = False;
@@ -260,6 +266,7 @@ monitor_power_on (saver_info *si, Bool on_p)
       XSync (si->dpy, False);
       DPMSForceLevel(si->dpy, (on_p ? DPMSModeOn : DPMSModeOff));
       XSync (si->dpy, False);
+      XSetErrorHandler (old_handler);
       /* Ignore error_handler_hit_p, just probe monitor instead */
 
       if ((!!on_p) != monitor_powered_on_p (si))  /* double-check */