From 38886de0c3e9ea5729ef23e4c653fa2822f52e8f Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 6 Apr 2021 14:43:39 +0200 Subject: xscreensaver 6.00 --- driver/dpms.c | 211 +++++++++++++++++++--------------------------------------- 1 file changed, 69 insertions(+), 142 deletions(-) (limited to 'driver/dpms.c') diff --git a/driver/dpms.c b/driver/dpms.c index 3a8803c..15721ea 100644 --- a/driver/dpms.c +++ b/driver/dpms.c @@ -1,5 +1,5 @@ -/* dpms.c --- syncing the X Display Power Management values - * xscreensaver, Copyright (c) 2001-2017 Jamie Zawinski +/* dpms.c --- syncing the X Display Power Management System values + * xscreensaver, Copyright © 2001-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -10,88 +10,36 @@ * implied warranty. */ -/* Display Power Management System (DPMS.) - - On XFree86 systems, "man xset" reports: - - -dpms The -dpms option disables DPMS (Energy Star) features. - +dpms The +dpms option enables DPMS (Energy Star) features. - - dpms flags... - The dpms option allows the DPMS (Energy Star) - parameters to be set. The option can take up to three - numerical values, or the `force' flag followed by a - DPMS state. The `force' flags forces the server to - immediately switch to the DPMS state specified. The - DPMS state can be one of `standby', `suspend', or - `off'. When numerical values are given, they set the - inactivity period before the three modes are activated. - The first value given is for the `standby' mode, the - second is for the `suspend' mode, and the third is for - the `off' mode. Setting these values implicitly - enables the DPMS features. A value of zero disables a - particular mode. - - However, note that the implementation is more than a little bogus, - in that there is code in /usr/X11R6/lib/libXdpms.a to implement all - the usual server-extension-querying utilities -- but there are no - prototypes in any header file! Thus, the prototypes here. (The - stuff in X11/extensions/dpms.h and X11/extensions/dpmsstr.h define - the raw X protcol, they don't define the API to libXdpms.a.) - - Some documentation: - Library: ftp://ftp.x.org/pub/R6.4/xc/doc/specs/Xext/DPMSLib.ms - Protocol: ftp://ftp.x.org/pub/R6.4/xc/doc/specs/Xext/DPMS.ms - */ - #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include +#include -#ifdef HAVE_DPMS_EXTENSION /* almost the whole file */ +#include "xscreensaver.h" -# include -# include -/*# include */ +#ifndef HAVE_DPMS_EXTENSION /* almost the whole file */ - /* Why this crap is not in a header file somewhere, I have no idea. Losers! - */ - extern Bool DPMSQueryExtension (Display *, int *event_ret, int *err_ret); - extern Status DPMSGetVersion (Display *, int *major_ret, int *minor_ret); - extern Bool DPMSCapable (Display *); - extern Status DPMSInfo (Display *, CARD16 *power_level, BOOL *state); - extern Status DPMSEnable (Display *dpy); - extern Status DPMSDisable (Display *dpy); - extern Status DPMSForceLevel (Display *, CARD16 level); - extern Status DPMSSetTimeouts (Display *, CARD16 standby, CARD16 suspend, - CARD16 off); - extern Bool DPMSGetTimeouts (Display *, CARD16 *standby, - CARD16 *suspend, CARD16 *off); - -#endif /* HAVE_DPMS_EXTENSION */ - - -/* This file doesn't need the Xt headers, so stub these types out... */ -#undef XtPointer -#define XtAppContext void* -#define XrmDatabase void* -#define XtIntervalId void* -#define XtPointer void* -#define Widget void* +void +sync_server_dpms_settings (Display *dpy, struct saver_preferences *p) +{ + if (p->verbose_p) + fprintf (stderr, "%s: DPMS not supported at compile time\n", blurb()); +} -#include "xscreensaver.h" +Bool monitor_powered_on_p (Display *dpy) { return True; } +void monitor_power_on (saver_info *si, Bool on_p) { return; } + +#else /* HAVE_DPMS_EXTENSION -- whole file */ -#ifdef HAVE_DPMS_EXTENSION +# include +# include -#define CLAMP_DOWN(var,val,mi) do { int old = (var); (var) -= (val); if ((var) < (mi) || (var) > old) (var) = (mi); } while (0) static Bool error_handler_hit_p = False; -static int idle_offset = 0; - static int ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error) { @@ -99,17 +47,9 @@ ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error) return 0; } -void -store_dpms_offset(int offset) -{ - idle_offset = offset < 15 ? 0 : offset; -} - void -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) +sync_server_dpms_settings (Display *dpy, struct saver_preferences *p) { int event = 0, error = 0; BOOL o_enabled = False; @@ -117,11 +57,29 @@ sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p, CARD16 o_standby = 0, o_suspend = 0, o_off = 0; Bool bogus_p = False; + Bool enabled_p = (p->dpms_enabled_p && p->mode != DONT_BLANK); + Bool dpms_quickoff_p = p->dpms_quickoff_p; + int standby_secs = p->dpms_standby / 1000; + int suspend_secs = p->dpms_suspend / 1000; + int off_secs = p->dpms_off / 1000; + Bool verbose_p = p->verbose_p; + static Bool warned_p = False; + + /* If the monitor is currently powered off, defer any changes until + we are next called while it is powered on. */ + if (! monitor_powered_on_p (dpy)) + return; + + /* Why did I do this? It makes DPMS never happen. + XSetScreenSaver (dpy, 0, 0, 0, 0); + XForceScreenSaver (dpy, ScreenSaverReset); + */ + if (dpms_quickoff_p && !off_secs) - { - /* To do this, we might need to temporarily re-enable DPMS first. */ - off_secs = 0xFFFF; - } + { + /* 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" */ @@ -135,13 +93,6 @@ sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p, if (bogus_p) enabled_p = False; - if (idle_offset != 0) - { - CLAMP_DOWN (standby_secs, idle_offset, 10); - CLAMP_DOWN (suspend_secs, idle_offset, 10); - CLAMP_DOWN (off_secs, idle_offset, 10); - } - /* X protocol sends these values in a CARD16, so truncate them to 16 bits. This means that the maximum timeout is 18:12:15. */ @@ -151,22 +102,25 @@ sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p, if (! DPMSQueryExtension (dpy, &event, &error)) { - if (verbose_p) - fprintf (stderr, "%s: XDPMS extension not supported.\n", blurb()); + if (verbose_p && !warned_p) + fprintf (stderr, "%s: XDPMS extension not supported\n", blurb()); + warned_p = True; return; } if (! DPMSCapable (dpy)) { - if (verbose_p) - fprintf (stderr, "%s: DPMS not supported.\n", blurb()); + if (verbose_p && !warned_p) + fprintf (stderr, "%s: DPMS not supported\n", blurb()); + warned_p = True; return; } if (! DPMSInfo (dpy, &o_power, &o_enabled)) { - if (verbose_p) - fprintf (stderr, "%s: unable to get DPMS state.\n", blurb()); + if (verbose_p && !warned_p) + fprintf (stderr, "%s: unable to get DPMS state\n", blurb()); + warned_p = True; return; } @@ -174,19 +128,20 @@ sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p, { if (! (enabled_p ? DPMSEnable (dpy) : DPMSDisable (dpy))) { - if (verbose_p) - fprintf (stderr, "%s: unable to set DPMS state.\n", blurb()); + if (verbose_p && !warned_p) + fprintf (stderr, "%s: unable to set DPMS state\n", blurb()); + warned_p = True; return; } else if (verbose_p) - fprintf (stderr, "%s: turned DPMS %s.\n", blurb(), + fprintf (stderr, "%s: turned DPMS %s\n", blurb(), enabled_p ? "on" : "off"); } if (bogus_p) { if (verbose_p) - fprintf (stderr, "%s: not setting bogus DPMS timeouts: %d %d %d.\n", + fprintf (stderr, "%s: not setting bogus DPMS timeouts: %d %d %d\n", blurb(), standby_secs, suspend_secs, off_secs); return; } @@ -194,7 +149,7 @@ sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p, if (!DPMSGetTimeouts (dpy, &o_standby, &o_suspend, &o_off)) { if (verbose_p) - fprintf (stderr, "%s: unable to get DPMS timeouts.\n", blurb()); + fprintf (stderr, "%s: unable to get DPMS timeouts\n", blurb()); return; } @@ -205,34 +160,34 @@ sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p, if (!DPMSSetTimeouts (dpy, standby_secs, suspend_secs, off_secs)) { if (verbose_p) - fprintf (stderr, "%s: unable to set DPMS timeouts.\n", blurb()); + fprintf (stderr, "%s: unable to set DPMS timeouts\n", blurb()); return; } else if (verbose_p) - fprintf (stderr, "%s: set DPMS timeouts: %d %d %d.\n", blurb(), + fprintf (stderr, "%s: set DPMS timeouts: %d %d %d\n", blurb(), standby_secs, suspend_secs, off_secs); } } Bool -monitor_powered_on_p (saver_info *si) +monitor_powered_on_p (Display *dpy) { Bool result; int event_number, error_number; BOOL onoff = False; CARD16 state; - if (!DPMSQueryExtension(si->dpy, &event_number, &error_number)) + if (!DPMSQueryExtension(dpy, &event_number, &error_number)) /* Server doesn't know -- assume the monitor is on. */ result = True; - else if (!DPMSCapable(si->dpy)) + else if (!DPMSCapable(dpy)) /* Server says the monitor doesn't do power management -- so it's on. */ result = True; else { - DPMSInfo(si->dpy, &state, &onoff); + DPMSInfo(dpy, &state, &onoff); if (!onoff) /* Server says DPMS is disabled -- so the monitor is on. */ result = True; @@ -252,17 +207,19 @@ monitor_powered_on_p (saver_info *si) void monitor_power_on (saver_info *si, Bool on_p) { - if ((!!on_p) != monitor_powered_on_p (si)) + if ((!!on_p) != monitor_powered_on_p (si->dpy)) { XErrorHandler old_handler; int event_number, error_number; + static Bool warned_p = False; if (!DPMSQueryExtension(si->dpy, &event_number, &error_number) || !DPMSCapable(si->dpy)) { - if (si->prefs.verbose_p) + if (si->prefs.verbose_p && !warned_p) fprintf (stderr, - "%s: unable to power %s monitor: no DPMS extension.\n", + "%s: unable to power %s monitor: no DPMS extension\n", blurb(), (on_p ? "on" : "off")); + warned_p = True; return; } @@ -286,42 +243,12 @@ monitor_power_on (saver_info *si, Bool on_p) XSetErrorHandler (old_handler); /* Ignore error_handler_hit_p, just probe monitor instead */ - if ((!!on_p) != monitor_powered_on_p (si)) /* double-check */ + if ((!!on_p) != monitor_powered_on_p (si->dpy)) /* double-check */ fprintf (stderr, - "%s: DPMSForceLevel(dpy, %s) did not change monitor power state.\n", + "%s: DPMSForceLevel(dpy, %s) did not change monitor power state\n", blurb(), (on_p ? "DPMSModeOn" : "DPMSModeOff")); } } -#else /* !HAVE_DPMS_EXTENSION */ - -void -store_dpms_offset(Display *dpy, Bool reset_p) -{ -} - - -void -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) -{ - if (verbose_p) - fprintf (stderr, "%s: DPMS support not compiled in.\n", blurb()); -} - -Bool -monitor_powered_on_p (saver_info *si) -{ - return True; -} - -void -monitor_power_on (saver_info *si, Bool on_p) -{ - return; -} - -#endif /* !HAVE_DPMS_EXTENSION */ +#endif /* HAVE_DPMS_EXTENSION -- whole file */ -- cgit v1.2.3-55-g7522