# 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;
#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))
{
/* 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);
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;
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;
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.)
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 */