X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=driver%2Fxscreensaver.c;h=6ecaac324098b4d4557798e13ed36cfa193bc5f3;hb=14627f4038ada5d11456f3770090f3c39740d70f;hp=1eecf4ca73abce315bcc5f92b352dbeb662f83b2;hpb=278c59e14c53fd412b734e699bd4f314f766f804;p=xscreensaver diff --git a/driver/xscreensaver.c b/driver/xscreensaver.c index 1eecf4ca..6ecaac32 100644 --- a/driver/xscreensaver.c +++ b/driver/xscreensaver.c @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1991-1999 Jamie Zawinski +/* xscreensaver, Copyright (c) 1991-2000 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -59,7 +59,7 @@ * 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 @@ -70,8 +70,9 @@ * 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 @@ -110,13 +111,13 @@ * 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 @@ -162,9 +163,9 @@ XrmDatabase db = 0; 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; static XrmOptionDescRec options [] = { @@ -218,7 +219,7 @@ do_help (saver_info *si) fflush (stdout); fflush (stderr); fprintf (stdout, "\ -xscreensaver %s, copyright (c) 1991-1999 by Jamie Zawinski \n\ +xscreensaver %s, copyright (c) 1991-2000 by Jamie Zawinski \n\ The standard Xt command-line options are accepted; other options include:\n\ \n\ -timeout When the screensaver should activate.\n\ @@ -314,15 +315,17 @@ saver_ehandler (Display *dpy, XErrorEvent *error) "#######################################" "#######################################\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\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, @@ -368,12 +371,14 @@ startup_ehandler (String name, String type, String class, 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/faq.html\n" + " http://www.jwz.org/xscreensaver/man.html\n" + "\n", blurb()); fflush (stderr); @@ -438,7 +443,6 @@ lock_initialization (saver_info *si, int *argc, char **argv) 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)) @@ -480,7 +484,7 @@ connect_to_server (saver_info *si, int *argc, char **argv) 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); @@ -495,6 +499,7 @@ connect_to_server (saver_info *si, int *argc, char **argv) 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); @@ -589,7 +594,7 @@ print_banner (saver_info *si) if (p->verbose_p) fprintf (stderr, - "%s %s, copyright (c) 1991-1999 " + "%s %s, copyright (c) 1991-2000 " "by Jamie Zawinski .\n", progname, si->version); @@ -645,7 +650,7 @@ print_banner (saver_info *si) /* Examine all of the display's screens, and populate the `saver_screen_info' - structures. + structures. Make sure this is called after hack_environment() sets $PATH. */ static void initialize_per_screen_info (saver_info *si, Widget toplevel_shell) @@ -672,6 +677,9 @@ initialize_per_screen_info (saver_info *si, Widget toplevel_shell) ssi->current_visual = ssi->default_visual; ssi->current_depth = visual_depth (ssi->screen, ssi->current_visual); + /* Execute a subprocess to find the GL visual. */ + ssi->best_gl_visual = get_best_gl_visual (ssi); + if (ssi == si->default_screen) /* Since this is the default screen, use the one already created. */ ssi->toplevel_shell = toplevel_shell; @@ -954,7 +962,7 @@ main_loop (saver_info *si) 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 @@ -992,6 +1000,20 @@ main_loop (saver_info *si) 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 */ @@ -1006,7 +1028,7 @@ main_loop (saver_info *si) 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; @@ -1052,7 +1074,8 @@ main (int argc, char **argv) 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 (0); save_argv (argc, argv); set_version_string (si, &argc, argv); @@ -1084,7 +1107,10 @@ main (int argc, char **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); @@ -1399,11 +1425,11 @@ handle_clientmessage (saver_info *si, XEvent *event, Bool until_idle_p) 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 */ { @@ -1524,7 +1550,8 @@ analyze_display (saver_info *si) { "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(),