http://ftp.x.org/contrib/applications/xscreensaver-3.19.tar.gz
[xscreensaver] / driver / windows.c
index a61788ba3510df0ebd07680a5b0c8afda8fe4180..205e43bdfe3d6df570542e58c35aa38beee5303a 100644 (file)
 # include <X11/extensions/xf86vmode.h>
 #endif /* HAVE_XF86VMODE */
 
-#ifdef HAVE_XHPDISABLERESET
-# include <X11/XHPlib.h>
-
- /* Calls to XHPDisableReset and XHPEnableReset must be balanced,
-    or BadAccess errors occur.  (Ok for this to be global, since it
-    affects the whole machine, not just the current screen.) */
-  Bool hp_locked_p = False;
-
-#endif /* HAVE_XHPDISABLERESET */
-
 
 /* This file doesn't need the Xt headers, so stub these types out... */
 #undef XtPointer
 #include "fade.h"
 
 
-#ifdef HAVE_VT_LOCKSWITCH
-# include <fcntl.h>
-# include <sys/ioctl.h>
-# include <sys/vt.h>
-  static void lock_vt (saver_info *si, Bool lock_p);
-#endif /* HAVE_VT_LOCKSWITCH */
-
-
 extern int kill (pid_t, int);          /* signal() is in sys/signal.h... */
 
 Atom XA_VROOT, XA_XSETROOT_ID;
@@ -821,12 +803,17 @@ get_screen_viewport (saver_screen_info *ssi,
 #ifdef HAVE_XF86VMODE
   saver_info *si = ssi->global;
   int screen_no = screen_number (ssi->screen);
-  int event, error;
+  int op, event, error;
   int dot;
   XF86VidModeModeLine ml;
   int x, y;
 
-  if (XF86VidModeQueryExtension (si->dpy, &event, &error) &&
+  /* Check for Xinerama first, because the VidModeExtension is broken
+     when Xinerama is present.  Wheee!
+   */
+
+  if (!XQueryExtension (si->dpy, "XINERAMA", &op, &event, &error) &&
+      XF86VidModeQueryExtension (si->dpy, &event, &error) &&
       XF86VidModeGetModeLine (si->dpy, screen_no, &dot, &ml) &&
       XF86VidModeGetViewPort (si->dpy, screen_no, &x, &y))
     {
@@ -840,6 +827,35 @@ get_screen_viewport (saver_screen_info *ssi,
         /* There is no viewport -- the screen does not scroll. */
         return;
 
+
+      /* Apparently some versions of XFree86 return nonsense here!
+         I've had reports of 1024x768 viewports at -1936862040, -1953705044.
+         So, sanity-check the values and give up if they are out of range.
+       */
+      if (*x_ret <  0 || *x_ret >= w ||
+          *y_ret <  0 || *y_ret >= h ||
+          *w_ret <= 0 || *w_ret >  w ||
+          *h_ret <= 0 || *h_ret >  h)
+        {
+          static int warned_once = 0;
+          if (!warned_once)
+            {
+              fprintf (stderr, "\n"
+                  "%s: X SERVER BUG: %dx%d viewport at %d,%d is impossible.\n"
+                  "%s: The XVidMode server extension is returning nonsense.\n"
+                  "%s: Please report this bug to your X server vendor.\n\n",
+                       blurb(), *w_ret, *h_ret, *x_ret, *y_ret,
+                       blurb(), blurb());
+              warned_once = 1;
+            }
+          *x_ret = 0;
+          *y_ret = 0;
+          *w_ret = w;
+          *h_ret = h;
+          return;
+        }
+          
+
       sprintf (msg, "%s: vp is %dx%d+%d+%d",
                blurb(), *w_ret, *h_ret, *x_ret, *y_ret);
 
@@ -922,7 +938,7 @@ initialize_screensaver_window_1 (saver_screen_info *ssi)
   int x, y, width, height;
   static Bool printed_visual_info = False;  /* only print the message once. */
 
-  get_screen_viewport (si->default_screen, &x, &y, &width, &height,
+  get_screen_viewport (ssi, &x, &y, &width, &height,
                        (p->verbose_p && !si->screen_blanked_p));
 
   black.red = black.green = black.blue = 0;
@@ -1269,19 +1285,6 @@ blank_screen (saver_info *si)
   store_activate_time (si, si->screen_blanked_p);
   raise_window (si, False, False, False);
 
-#ifdef HAVE_XHPDISABLERESET
-  if (si->locked_p && !hp_locked_p)
-    {
-      XHPDisableReset (si->dpy);       /* turn off C-Sh-Reset */
-      hp_locked_p = True;
-    }
-#endif
-
-#ifdef HAVE_VT_LOCKSWITCH
-  if (si->locked_p)
-      lock_vt (si, True);              /* turn off C-Alt-Fn */
-#endif
-
   si->screen_blanked_p = True;
   si->last_wall_clock_time = 0;
 
@@ -1396,18 +1399,6 @@ unblank_screen (saver_info *si)
   ungrab_keyboard_and_mouse (si);
   restore_real_vroot (si);
 
-#ifdef HAVE_XHPDISABLERESET
-  if (hp_locked_p)
-    {
-      XHPEnableReset (si->dpy);        /* turn C-Sh-Reset back on */
-      hp_locked_p = False;
-    }
-#endif
-
-#ifdef HAVE_VT_LOCKSWITCH
-  lock_vt (si, False);         /* turn C-Alt-Fn back on */
-#endif
-
   /* Unmap the windows a second time, dammit -- just to avoid a race
      with the screen-grabbing hacks.  (I'm not sure if this is really
      necessary; I'm stabbing in the dark now.)
@@ -1579,56 +1570,3 @@ select_visual (saver_screen_info *ssi, const char *visual_name)
 
   return got_it;
 }
-
-\f
-/* VT locking */
-
-#ifdef HAVE_VT_LOCKSWITCH
-static void
-lock_vt (saver_info *si, Bool lock_p)
-{
-  saver_preferences *p = &si->prefs;
-  static Bool locked_p = False;
-  const char *dev_console = "/dev/console";
-  int fd;
-
-  if (lock_p == locked_p)
-    return;
-
-  if (lock_p && !p->lock_vt_p)
-    return;
-
-  fd = open (dev_console, O_RDWR);
-  if (fd < 0)
-    {
-      char buf [255];
-      sprintf (buf, "%s: couldn't %s VTs: %s", blurb(),
-              (lock_p ? "lock" : "unlock"),
-              dev_console);
-#if 0 /* #### doesn't work yet, so don't bother complaining */
-      perror (buf);
-#endif
-      return;
-    }
-
-  if (ioctl (fd, (lock_p ? VT_LOCKSWITCH : VT_UNLOCKSWITCH)) == 0)
-    {
-      locked_p = lock_p;
-
-      if (p->verbose_p)
-       fprintf (stderr, "%s: %s VTs\n", blurb(),
-                (lock_p ? "locked" : "unlocked"));
-    }
-  else
-    {
-      char buf [255];
-      sprintf (buf, "%s: couldn't %s VTs: ioctl", blurb(),
-              (lock_p ? "lock" : "unlock"));
-#if 0 /* #### doesn't work yet, so don't bother complaining */
-      perror (buf);
-#endif
-    }
-
-  close (fd);
-}
-#endif /* HAVE_VT_LOCKSWITCH */