X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=driver%2Fxset.c;h=99d11c2f96a18ae79a65428cbbed2ba36a6adec6;hb=3f438031d610c7e15fd33876a879b97e290e05fb;hp=f2afcee755011f33289f5bb6f9b62d7f5ac53af4;hpb=cccbddbc4140cf9a06d7d95cc5c0ca36eb5d6e28;p=xscreensaver diff --git a/driver/xset.c b/driver/xset.c index f2afcee7..99d11c2f 100644 --- a/driver/xset.c +++ b/driver/xset.c @@ -1,5 +1,5 @@ /* xset.c --- interacting with server extensions and the builtin screensaver. - * xscreensaver, Copyright (c) 1991-2002 Jamie Zawinski + * xscreensaver, Copyright (c) 1991-2005 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 @@ -156,6 +156,44 @@ query_xidle_extension (saver_info *si) #endif /* HAVE_XIDLE_EXTENSION */ + +/* Resize and Rotate server extension hackery. + */ + +#ifdef HAVE_RANDR + +# include + +Bool +query_randr_extension (saver_info *si) +{ + saver_preferences *p = &si->prefs; + Bool ok = XRRQueryExtension (si->dpy, + &si->randr_event_number, + &si->randr_error_number); + + if (ok) + { + int nscreens = ScreenCount (si->dpy); /* number of *real* screens */ + int i; + + if (p->verbose_p) + fprintf (stderr, "%s: selecting RANDR events\n", blurb()); + for (i = 0; i < nscreens; i++) +# ifdef RRScreenChangeNotifyMask /* randr.h 1.5, 2002/09/29 */ + XRRSelectInput (si->dpy, RootWindow (si->dpy, i), + RRScreenChangeNotifyMask); +# else /* !RRScreenChangeNotifyMask */ /* Xrandr.h 1.4, 2001/06/07 */ + XRRScreenChangeSelectInput (si->dpy, RootWindow (si->dpy, i), True); +# endif /* !RRScreenChangeNotifyMask */ + } + + return ok; +} + +#endif /* HAVE_RANDR */ + + /* Figuring out what the appropriate XSetScreenSaver() parameters are (one wouldn't expect this to be rocket science.) @@ -193,7 +231,7 @@ disable_builtin_screensaver (saver_info *si, Bool unblank_screen_p) /* I suspect (but am not sure) that DontAllowExposures might have something to do with powering off the monitor as well, at least - on some systems that don't support XDPMS? Who know... */ + on some systems that don't support XDPMS? Who knows... */ desired_allow_exp = AllowExposures; if (si->using_mit_saver_extension || si->using_sgi_saver_extension) @@ -218,6 +256,12 @@ disable_builtin_screensaver (saver_info *si, Bool unblank_screen_p) desired_server_timeout = 0; } + /* XSetScreenSaver() generates BadValue if either timeout parameter + exceeds 15 bits (signed short.) That is 09:06:07. + */ + if (desired_server_timeout > 0x7FFF) desired_server_timeout = 0x7FFF; + if (desired_server_interval > 0x7FFF) desired_server_interval = 0x7FFF; + if (desired_server_timeout != current_server_timeout || desired_server_interval != current_server_interval || desired_prefer_blank != current_prefer_blank || @@ -259,125 +303,3 @@ disable_builtin_screensaver (saver_info *si, Bool unblank_screen_p) /* Turn off the server builtin saver if it is now running. */ XForceScreenSaver (si->dpy, ScreenSaverReset); } - - -/* 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_DPMS_EXTENSION - -#include /* for CARD16 */ -#include -#include - -extern Bool DPMSQueryExtension (Display *dpy, int *event_ret, int *error_ret); -extern Bool DPMSCapable (Display *dpy); -extern Status DPMSForceLevel (Display *dpy, CARD16 level); -extern Status DPMSInfo (Display *dpy, CARD16 *power_level, BOOL *state); - -#if 0 /* others we don't use */ -extern Status DPMSGetVersion (Display *dpy, int *major_ret, int *minor_ret); -extern Status DPMSSetTimeouts (Display *dpy, - CARD16 standby, CARD16 suspend, CARD16 off); -extern Bool DPMSGetTimeouts (Display *dpy, - CARD16 *standby, CARD16 *suspend, CARD16 *off); -extern Status DPMSEnable (Display *dpy); -extern Status DPMSDisable (Display *dpy); -#endif /* 0 */ - - -Bool -monitor_powered_on_p (saver_info *si) -{ - Bool result; - int event_number, error_number; - BOOL onoff = False; - CARD16 state; - - if (!DPMSQueryExtension(si->dpy, &event_number, &error_number)) - /* Server doesn't know -- assume the monitor is on. */ - result = True; - - else if (!DPMSCapable(si->dpy)) - /* Server says the monitor doesn't do power management -- so it's on. */ - result = True; - - else - { - DPMSInfo(si->dpy, &state, &onoff); - if (!onoff) - /* Server says DPMS is disabled -- so the monitor is on. */ - result = True; - else - switch (state) { - case DPMSModeOn: result = True; break; /* really on */ - case DPMSModeStandby: result = False; break; /* kinda off */ - case DPMSModeSuspend: result = False; break; /* pretty off */ - case DPMSModeOff: result = False; break; /* really off */ - default: result = True; break; /* protocol error? */ - } - } - - return result; -} - -void -monitor_power_on (saver_info *si) -{ - if (!monitor_powered_on_p (si)) - { - DPMSForceLevel(si->dpy, DPMSModeOn); - XSync(si->dpy, False); - if (!monitor_powered_on_p (si)) - fprintf (stderr, - "%s: DPMSForceLevel(dpy, DPMSModeOn) did not power the monitor on?\n", - blurb()); - } -} - -#else /* !HAVE_DPMS_EXTENSION */ - -Bool -monitor_powered_on_p (saver_info *si) -{ - return True; -} - -void -monitor_power_on (saver_info *si) -{ - return; -} - -#endif /* !HAVE_DPMS_EXTENSION */