X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=driver%2Fdpms.c;h=4be93319050dd48b04e2b94c17e4b8c9d0a69997;hb=d1ae2829ff0fd2a96c16a0c8c5420efaa47d7b30;hp=3de78f2d21d57a33593c99b463acf961b521474f;hpb=5f9c47ca98dd43d8f59b7c27d3fde6edfde4fe21;p=xscreensaver diff --git a/driver/dpms.c b/driver/dpms.c index 3de78f2d..4be93319 100644 --- a/driver/dpms.c +++ b/driver/dpms.c @@ -86,8 +86,18 @@ #ifdef HAVE_DPMS_EXTENSION +static Bool error_handler_hit_p = False; + +static int +ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error) +{ + error_handler_hit_p = True; + return 0; +} + + 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) { @@ -97,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; @@ -221,6 +237,7 @@ monitor_power_on (saver_info *si, Bool on_p) { if ((!!on_p) != monitor_powered_on_p (si)) { + XErrorHandler old_handler; int event_number, error_number; if (!DPMSQueryExtension(si->dpy, &event_number, &error_number) || !DPMSCapable(si->dpy)) @@ -232,8 +249,24 @@ monitor_power_on (saver_info *si, Bool on_p) return; } + /* The manual for DPMSForceLevel() says that it throws BadMatch if + "DPMS is disabled on the specified display." + + The manual for DPMSCapable() says that it "returns True if the X + server is capable of DPMS." + + Apparently they consider "capable of DPMS" and "DPMS is enabled" + to be different things, and so even if DPMSCapable() returns + True, DPMSForceLevel() *might* throw an X Error. Isn't that + just fucking special. + */ + XSync (si->dpy, False); + error_handler_hit_p = False; + old_handler = XSetErrorHandler (ignore_all_errors_ehandler); + XSync (si->dpy, False); DPMSForceLevel(si->dpy, (on_p ? DPMSModeOn : DPMSModeOff)); - XSync(si->dpy, False); + XSync (si->dpy, False); + /* Ignore error_handler_hit_p, just probe monitor instead */ if ((!!on_p) != monitor_powered_on_p (si)) /* double-check */ fprintf (stderr,