http://ftp.x.org/contrib/applications/xscreensaver-2.21.tar.gz
[xscreensaver] / driver / xscreensaver.c
index 07633112d2a4022bea5c30c8fcd6d68f48f3b8f6..7f4b0bd8a816a99b39582ba3c61248fc34ac85ce 100644 (file)
@@ -158,7 +158,6 @@ char *progclass = 0;
 XrmDatabase db = 0;
 
 
-static Atom XA_SCREENSAVER;
 static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_CYCLE, XA_NEXT, XA_PREV;
 static Atom XA_EXIT, XA_RESTART, XA_DEMO, XA_LOCK;
 
@@ -166,10 +165,10 @@ static Atom XA_EXIT, XA_RESTART, XA_DEMO, XA_LOCK;
 static XrmOptionDescRec options [] = {
   { "-timeout",                   ".timeout",          XrmoptionSepArg, 0 },
   { "-cycle",             ".cycle",            XrmoptionSepArg, 0 },
-  { "-idelay",            ".initialDelay",     XrmoptionSepArg, 0 },
-  { "-nice",              ".nice",             XrmoptionSepArg, 0 },
-  { "-visual",            ".visualID",         XrmoptionSepArg, 0 },
+  { "-lock-mode",         ".lock",             XrmoptionNoArg, "on" },
+  { "-no-lock-mode",      ".lock",             XrmoptionNoArg, "off" },
   { "-lock-timeout",      ".lockTimeout",      XrmoptionSepArg, 0 },
+  { "-visual",            ".visualID",         XrmoptionSepArg, 0 },
   { "-install",                   ".installColormap",  XrmoptionNoArg, "on" },
   { "-no-install",        ".installColormap",  XrmoptionNoArg, "off" },
   { "-verbose",                   ".verbose",          XrmoptionNoArg, "on" },
@@ -180,8 +179,8 @@ static XrmOptionDescRec options [] = {
   { "-no-mit-extension",   ".mitSaverExtension",XrmoptionNoArg, "off" },
   { "-sgi-extension",     ".sgiSaverExtension",XrmoptionNoArg, "on" },
   { "-no-sgi-extension",   ".sgiSaverExtension",XrmoptionNoArg, "off" },
-  { "-lock",              ".lock",             XrmoptionNoArg, "on" },
-  { "-no-lock",                   ".lock",             XrmoptionNoArg, "off" }
+  { "-idelay",            ".initialDelay",     XrmoptionSepArg, 0 },
+  { "-nice",              ".nice",             XrmoptionSepArg, 0 }
 };
 
 static char *defaults[] = {
@@ -198,29 +197,29 @@ The standard Xt command-line options are accepted; other options include:\n\
 \n\
     -timeout <minutes>         When the screensaver should activate.\n\
     -cycle <minutes>           How long to let each hack run.\n\
-    -idelay <seconds>          How long to sleep before startup.\n\
+    -lock-mode                 Require a password before deactivating.\n\
+    -no-lock-mode              Don't.\n\
+    -lock-timeout <minutes>    Grace period before locking; default 0.\n\
     -visual <id-or-class>      Which X visual to run on.\n\
-    -demo                      Enter interactive demo mode on startup.\n\
     -install                   Install a private colormap.\n\
     -no-install                Don't.\n\
     -verbose                   Be loud.\n\
     -silent                    Don't.\n\
-    -xidle-extension           Use the R5 XIdle server extension.\n\
-    -no-xidle-extension        Don't.\n\
     -mit-extension             Use the R6 MIT_SCREEN_SAVER server extension.\n\
     -no-mit-extension          Don't.\n\
     -sgi-extension             Use the SGI SCREEN-SAVER server extension.\n\
     -no-sgi-extension          Don't.\n\
-    -lock                      Require a password before deactivating.\n\
-    -no-lock                   Don't.\n\
-    -lock-timeout <minutes>    Grace period before locking; default 0.\n\
+    -xidle-extension           Use the R5 XIdle server extension.\n\
+    -no-xidle-extension        Don't.\n\
     -help                      This message.\n\
 \n\
-Use the `xscreensaver-command' program to control a running screensaver.\n\
+The `xscreensaver' program should be left running in the background.\n\
+Use the `xscreensaver-command' program to manipulate a running xscreensaver.\n\
+\n\
+The `*programs' resource controls which graphics demos will be launched by\n\
+the screensaver.  See `man xscreensaver' or the web page for more details.\n\
 \n\
-The *programs resource controls which graphics demos will be launched by the\n\
-screensaver.  See the man page for more details.  For updates, check\n\
-http://people.netscape.com/jwz/xscreensaver/\n\n",
+For updates, check http://people.netscape.com/jwz/xscreensaver/\n\n",
          si->version);
 
 #ifdef NO_LOCKING
@@ -299,7 +298,7 @@ get_screenhacks (saver_info *si)
 
   d = get_string_resource ("programs", "Programs");
 
-  size = strlen (d);
+  size = d ? strlen (d) : 0;
   p->screenhacks = (char **) malloc (sizeof (char *) * hacks_size);
   p->screenhacks_count = 0;
 
@@ -541,6 +540,8 @@ initialize_connection (saver_info *si, int argc, char **argv)
   si->db = XtDatabase (si->dpy);
   XtGetApplicationNameAndClass (si->dpy, &progname, &progclass);
 
+  if(strlen(progname)  > 100) progname [99] = 0;  /* keep it short. */
+
   db = si->db; /* resources.c needs this */
 
   if (argc == 2 && !strcmp (argv[1], "-help"))
@@ -551,7 +552,39 @@ initialize_connection (saver_info *si, int argc, char **argv)
 
   else if (argc > 1)
     {
-      fprintf (stderr, "%s: unknown option %s\n", progname, argv [1]);
+      const char *s = argv[1];
+      fprintf (stderr, "%s: unknown option \"%s\".  Try \"-help\".\n",
+              progname, s);
+
+      if (s[0] == '-' && s[1] == '-') s++;
+      if (!strcmp (s, "-activate") ||
+         !strcmp (s, "-deactivate") ||
+         !strcmp (s, "-cycle") ||
+         !strcmp (s, "-next") ||
+         !strcmp (s, "-prev") ||
+         !strcmp (s, "-exit") ||
+         !strcmp (s, "-restart") ||
+         !strcmp (s, "-demo") ||
+         !strcmp (s, "-lock") ||
+         !strcmp (s, "-version") ||
+         !strcmp (s, "-time"))
+       {
+         fprintf (stderr, "\n\
+    However, %s is an option to the `xscreensaver-command' program.\n\
+    The `xscreensaver' program is a daemon that runs in the background.\n\
+    You control a running xscreensaver process by sending it messages\n\
+    with `xscreensaver-command'.  See the man pages for details,\n\
+    or check the web page: http://people.netscape.com/jwz/xscreensaver/\n\n",
+                  s);
+
+         /* Since version 1.21 renamed the "-lock" option to "-lock-mode",
+            suggest that explicitly. */
+         if (!strcmp (s, "-lock"))
+           fprintf (stderr, "\
+    Or perhaps you meant either the \"-lock-mode\" or the\n\
+    \"-lock-timeout <minutes>\" options to xscreensaver?\n\n");
+       }
+
       exit (1);
     }
   get_resources (si);
@@ -621,6 +654,8 @@ initialize (saver_info *si, int argc, char **argv)
   si->version [4] = 0;
   progname = argv[0]; /* reset later; this is for the benefit of lock_init() */
 
+  if(strlen(progname) > 100) progname[99] = 0;  /* keep it short. */
+
 #ifdef NO_LOCKING
   si->locking_disabled_p = True;
   si->nolock_reason = "not compiled with locking support";
@@ -644,9 +679,9 @@ initialize (saver_info *si, int argc, char **argv)
 
   progclass = "XScreenSaver";
 
-  /* remove -demo switch before saving argv */
+  /* remove -initial-demo-mode switch before saving argv */
   for (i = 1; i < argc; i++)
-    while (!strcmp ("-demo", argv [i]))
+    while (!strcmp ("-initial-demo-mode", argv [i]))
       {
        int j;
        initial_demo_mode_p = True;
@@ -666,7 +701,8 @@ initialize (saver_info *si, int argc, char **argv)
 
   
   for (i = 0; i < si->nscreens; i++)
-    ensure_no_screensaver_running (si->dpy, si->screens[i].screen);
+    if (ensure_no_screensaver_running (si->dpy, si->screens[i].screen))
+      exit (1);
 
   si->demo_mode_p = initial_demo_mode_p;
   srandom ((int) time ((time_t *) 0));