ftp://ftp.krokus.ru/pub/OpenBSD/distfiles/xscreensaver-4.22.tar.gz
[xscreensaver] / driver / xset.c
index 6dabdb2d156f9f3942ed070abbce2358f23a64ca..99d11c2f96a18ae79a65428cbbed2ba36a6adec6 100644 (file)
@@ -1,5 +1,5 @@
 /* xset.c --- interacting with server extensions and the builtin screensaver.
- * xscreensaver, Copyright (c) 1991-1998 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1991-2005 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
@@ -156,6 +156,44 @@ query_xidle_extension (saver_info *si)
 #endif /* HAVE_XIDLE_EXTENSION */
 
 
+\f
+/* Resize and Rotate server extension hackery.
+ */
+
+#ifdef HAVE_RANDR
+
+# include <X11/extensions/Xrandr.h>
+
+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 */
+
+
 \f
 /* 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,21 +256,22 @@ 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 ||
       desired_allow_exp != current_allow_exp)
     {
-      if (p->verbose_p && unblank_screen_p)
-        /* Used to print this all the time, but really, nobody cares.
-           Now only print it when verbose. */
-       fprintf (stderr,
-                "%s disabling server builtin screensaver.\n"
-                "%s: you can re-enable it with \"xset s on\".\n",
-                blurb(), blurb());
-
       if (p->verbose_p)
-       fprintf (stderr, "%s: (xset s %d %d; xset s %s; xset s %s)\n", blurb(),
+       fprintf (stderr,
+                 "%s: disabling server builtin screensaver:\n"
+                 "%s:  (xset s %d %d; xset s %s; xset s %s)\n",
+                 blurb(), blurb(),
                 desired_server_timeout, desired_server_interval,
                 (desired_prefer_blank ? "blank" : "noblank"),
                 (desired_allow_exp ? "expose" : "noexpose"));
@@ -264,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);
 }
-
-\f
-/* 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 <X11/Xproto.h>                        /* for CARD16 */
-#include <X11/extensions/dpms.h>
-#include <X11/extensions/dpmsstr.h>
-
-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 */