* This program accepts ClientMessages of type SCREENSAVER; these messages
* may contain the atom ACTIVATE or DEACTIVATE, meaning to turn the
* screensaver on or off now, regardless of the idleness of the user,
- * and a few other things. The included "xscreensaver_command" program
+ * and a few other things. The included "xscreensaver-command" program
* sends these messsages.
*
* If we don't have the XIdle, MIT-SCREEN-SAVER, or SGI SCREEN_SAVER
* KeyPress on windows which don't select them, because that would
* interfere with event propagation. This will break if any program
* changes its event mask to contain KeyRelease or PointerMotion more than
- * 30 seconds after creating the window, but that's probably pretty rare.
- *
+ * 30 seconds after creating the window, but such programs do not seem to
+ * occur in nature (I've never seen it happen in all these years.)
+ *
* The reason that we can't select KeyPresses on windows that don't have
* them already is that, when dispatching a KeyPress event, X finds the
* lowest (leafmost) window in the hierarchy on which *any* client selects
* to keep your emacs window alive even when xscreensaver has grabbed.
* - Go read the code related to `debug_p'.
* - You probably can't set breakpoints in functions that are called on
- * the other side of a call to fork() -- if your clients are dying
- * with signal 5, Trace/BPT Trap, you're losing in this way.
+ * the other side of a call to fork() -- if your subprocesses are
+ * dying with signal 5, Trace/BPT Trap, you're losing in this way.
* - If you aren't using a server extension, don't leave this stopped
* under the debugger for very long, or the X input buffer will get
* huge because of the keypress events it's selecting for. This can
* make your X server wedge with "no more input buffers."
- *
+ *
* ======================================================================== */
#ifdef HAVE_CONFIG_H
static Atom XA_SCREENSAVER_RESPONSE;
static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_CYCLE, XA_NEXT, XA_PREV;
-static Atom XA_EXIT, XA_RESTART, XA_LOCK, XA_SELECT;
+static Atom XA_RESTART, XA_SELECT;
static Atom XA_THROTTLE, XA_UNTHROTTLE;
-Atom XA_DEMO, XA_PREFS;
+Atom XA_DEMO, XA_PREFS, XA_EXIT, XA_LOCK, XA_BLANK;
\f
static XrmOptionDescRec options [] = {
"#######################################"
"#######################################\n\n");
fprintf (real_stderr,
- " If at all possible, please re-run xscreensaver with the command line\n"
- " arguments `-sync -verbose', and reproduce this bug. That will cause\n"
- " xscreensaver to dump a `core' file to the current directory. Please\n"
- " include the stack trace from that core file in your bug report.\n"
+ " If at all possible, please re-run xscreensaver with the command\ e\n"
+ " line arguments `-sync -verbose -no-capture', and reproduce this\n"
+ " bug. That will cause xscreensaver to dump a `core' file to the\n"
+ " current directory. Please include the stack trace from that core\n"
+ " file in your bug report. *DO NOT* mail the core file itself!\n"
+ " That won't work.\n"
"\n"
- " http://www.jwz.org/xscreensaver/bugs.html explains how to create the\n"
- " most useful bug reports, and how to examine core files.\n"
+ " http://www.jwz.org/xscreensaver/bugs.html explains how to create\n"
+ " the most useful bug reports, and how to examine core files.\n"
"\n"
- " The more information you can provide, the better. But please report\n"
+ " The more information you can provide, the better. But please\n"
" report this bug, regardless!\n"
"\n");
fprintf (real_stderr,
describe_uids (si, stderr);
fprintf (stderr, "\n"
- "%s: Errors at startup are usually authorization problems.\n"
- " Did you read the manual? Specifically, the parts\n"
- " that talk about XAUTH, XDM, and root logins?\n"
- "\n"
- " http://www.jwz.org/xscreensaver/man.html\n"
- "\n",
+ "%s: Errors at startup are usually authorization problems.\n"
+ " Did you read the manual and the FAQ? Specifically,\n"
+ " the parts of the manual that talk about XAUTH, XDM,\n"
+ " and root logins?\n"
+ "\n"
+ " http://www.jwz.org/xscreensaver/man.html\n"
+ "\n",
blurb());
fflush (stderr);
si->locking_disabled_p = True;
si->nolock_reason = "not compiled with locking support";
#else /* !NO_LOCKING */
- si->locking_disabled_p = False;
/* Finish initializing locking, now that we're out of privileged code. */
if (! lock_init (*argc, argv, si->prefs.verbose_p))
XA_SCREENSAVER = XInternAtom (si->dpy, "SCREENSAVER", False);
XA_SCREENSAVER_VERSION = XInternAtom (si->dpy, "_SCREENSAVER_VERSION",False);
XA_SCREENSAVER_ID = XInternAtom (si->dpy, "_SCREENSAVER_ID", False);
- XA_SCREENSAVER_TIME = XInternAtom (si->dpy, "_SCREENSAVER_TIME", False);
+ XA_SCREENSAVER_STATUS = XInternAtom (si->dpy, "_SCREENSAVER_STATUS", False);
XA_SCREENSAVER_RESPONSE = XInternAtom (si->dpy, "_SCREENSAVER_RESPONSE",
False);
XA_XSETROOT_ID = XInternAtom (si->dpy, "_XSETROOT_ID", False);
XA_DEMO = XInternAtom (si->dpy, "DEMO", False);
XA_PREFS = XInternAtom (si->dpy, "PREFS", False);
XA_LOCK = XInternAtom (si->dpy, "LOCK", False);
+ XA_BLANK = XInternAtom (si->dpy, "BLANK", False);
XA_THROTTLE = XInternAtom (si->dpy, "THROTTLE", False);
XA_UNTHROTTLE = XInternAtom (si->dpy, "UNTHROTTLE", False);
p->lock_p && /* and locking is enabled */
!si->locking_disabled_p && /* and locking is possible */
lock_timeout == 0) /* and locking is not timer-deferred */
- si->locked_p = True; /* then lock right now. */
+ set_locked_p (si, True); /* then lock right now. */
/* locked_p might be true already because of the above, or because of
the LOCK ClientMessage. But if not, and if we're supposed to lock
si->dbox_up_p = False;
XDefineCursor (si->dpy, ssi->screensaver_window, ssi->cursor);
suspend_screenhack (si, False); /* resume */
+
+ if (!ok_to_unblank &&
+ !screenhack_running_p (si))
+ {
+ /* If the lock dialog has been dismissed and we're not about to
+ unlock the screen, and there is currently no hack running,
+ then launch one. (There might be no hack running if DPMS
+ had kicked in. But DPMS is off now, so bring back the hack)
+ */
+ if (si->cycle_id)
+ XtRemoveTimeOut (si->cycle_id);
+ si->cycle_id = 0;
+ cycle_timer ((XtPointer) si, 0);
+ }
}
#endif /* !NO_LOCKING */
kill_screenhack (si);
unblank_screen (si);
- si->locked_p = False;
+ set_locked_p (si, False);
si->emergency_lock_p = False;
si->demoing_p = 0;
si->selection_mode = 0;
memset(si, 0, sizeof(*si));
global_si_kludge = si; /* I hate C so much... */
- srandom ((int) time ((time_t *) 0));
+# undef ya_rand_init
+ ya_rand_init ((int) time ((time_t *) 0));
save_argv (argc, argv);
set_version_string (si, &argc, argv);
if (p->verbose_p) analyze_display (si);
initialize_server_extensions (si);
+
+ si->blank_time = time ((time_t) 0); /* must be before ..._window */
initialize_screensaver_window (si);
+
select_events (si);
init_sigchld ();
disable_builtin_screensaver (si, True);
char *response = (until_idle_p
? "activating and locking."
: "locking.");
- si->locked_p = True;
- si->selection_mode = 0;
- si->demoing_p = False;
sprintf (buf, "LOCK ClientMessage received; %s", response);
clientmessage_response (si, window, False, buf, response);
+ set_locked_p (si, True);
+ si->selection_mode = 0;
+ si->demoing_p = False;
if (si->lock_id) /* we're doing it now, so lose the timeout */
{
{ "DOUBLE-BUFFER", "Double-Buffering" },
{ "DPMS", "Power Management" },
{ "GLX", "GLX" },
- { "XFree86-VidModeExtension", "XF86 Video-Mode" }
+ { "XFree86-VidModeExtension", "XF86 Video-Mode" },
+ { "XINERAMA", "Xinerama" }
};
fprintf (stderr, "%s: running on display \"%s\"\n", blurb(),