# 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;
Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID;
-Atom XA_SCREENSAVER_TIME;
+Atom XA_SCREENSAVER_STATUS;
extern saver_info *global_si_kludge; /* I hate C so much... */
-static void store_activate_time (saver_info *si, Bool use_last_p);
-
#define ALL_POINTER_EVENTS \
(ButtonPressMask | ButtonReleaseMask | EnterWindowMask | \
LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | \
vrs = restore_real_vroot_1 (si);
emergency_kill_subproc (si);
- if (vrs && (p->verbose_p || status != 0))
- fprintf (real_stderr, "%s: vroot restored, exiting.\n", blurb());
- else if (p->verbose_p)
- fprintf (real_stderr, "%s: no vroot to restore; exiting.\n", blurb());
+ if (p->verbose_p) /* nobody cares about this */
+ {
+ if (vrs)
+ fprintf (real_stderr, "%s: vroot restored, exiting.\n", blurb());
+ else if (p->verbose_p)
+ fprintf (real_stderr, "%s: no vroot to restore; exiting.\n", blurb());
+ }
fflush(real_stdout);
struct passwd *p = getpwuid (getuid ());
const char *name, *host;
char *id;
-
+
/* First store the name and class on the window.
*/
class_hints.res_name = progname;
}
+void
+store_saver_status (saver_info *si)
+{
+ CARD32 *status;
+ int size = si->nscreens + 2;
+ int i;
+
+ status = (CARD32 *) calloc (size, sizeof(CARD32));
+
+ status[0] = (CARD32) (si->screen_blanked_p
+ ? (si->locked_p ? XA_LOCK : XA_BLANK)
+ : 0);
+ status[1] = (CARD32) si->blank_time;
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ status [2 + i] = ssi->current_hack + 1;
+ }
+
+ XChangeProperty (si->dpy,
+ RootWindow (si->dpy, 0), /* always screen #0 */
+ XA_SCREENSAVER_STATUS,
+ XA_INTEGER, 32, PropModeReplace,
+ (unsigned char *) status, size);
+}
+
+
+
/* Returns the area of the screen which the xscreensaver window should cover.
Normally this is the whole screen, but if the X server's root window is
actually larger than the monitor's displayable area, then we want to
#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;
ssi->current_visual, attrmask, &attrs);
reset_stderr (ssi);
- store_activate_time(si, True);
if (p->verbose_p)
fprintf (stderr, "%s: saver window is 0x%lx.\n",
blurb(), (unsigned long) ssi->screensaver_window);
}
-
- store_saver_id (ssi);
+ store_saver_id (ssi); /* store window name and IDs */
if (!ssi->cursor)
{
}
#endif /* HAVE_XF86VMODE */
}
- 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
+ raise_window (si, False, False, False);
si->screen_blanked_p = True;
+ si->blank_time = time ((time_t) 0);
si->last_wall_clock_time = 0;
+ store_saver_status (si); /* store blank time */
+
return True;
}
+
void
unblank_screen (saver_info *si)
{
int i;
monitor_power_on (si);
-
- store_activate_time (si, True);
reset_watchdog_timer (si, False);
if (si->demoing_p)
kill_xsetroot_data (si->dpy, ssi->screensaver_window, p->verbose_p);
}
- store_activate_time(si, False); /* store unblank time */
-
+ store_saver_status (si); /* store unblank time */
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.)
XUnmapWindow (si->dpy, si->screens[i].screensaver_window);
si->screen_blanked_p = False;
+ si->blank_time = time ((time_t) 0);
si->last_wall_clock_time = 0;
-}
-
-static void
-store_activate_time (saver_info *si, Bool use_last_p)
-{
- static time_t last_time = 0;
- time_t now = ((use_last_p && last_time) ? last_time : time ((time_t) 0));
- CARD32 now32 = (CARD32) now;
- int i;
- last_time = now;
-
- for (i = 0; i < si->nscreens; i++)
- {
- saver_screen_info *ssi = &si->screens[i];
- if (!ssi->screensaver_window) continue;
- XChangeProperty (si->dpy, ssi->screensaver_window, XA_SCREENSAVER_TIME,
- XA_INTEGER, 32, PropModeReplace,
- (unsigned char *) &now32, 1);
- }
+ store_saver_status (si); /* store unblank time */
}
if (visual_name && *visual_name)
{
- if (!strcmp(visual_name, "default-i"))
+ if (!strcmp(visual_name, "default-i") ||
+ !strcmp(visual_name, "Default-i") ||
+ !strcmp(visual_name, "Default-I")
+ )
{
visual_name = "default";
install_cmap_p = True;
}
- else if (!strcmp(visual_name, "default-n"))
+ else if (!strcmp(visual_name, "default-n") ||
+ !strcmp(visual_name, "Default-n") ||
+ !strcmp(visual_name, "Default-N"))
{
visual_name = "default";
install_cmap_p = False;
}
#ifdef DAEMON_USE_GL
else if (!strcmp(visual_name, "gl") ||
+ !strcmp(visual_name, "Gl") ||
!strcmp(visual_name, "GL"))
{
new_v = get_gl_visual (ssi->screen);
raise_window (si, True, True, False);
store_vroot_property (si->dpy,
ssi->screensaver_window, ssi->screensaver_window);
- store_activate_time (si, True);
-
/* Transfer the grabs from the old window to the new.
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 */