http://packetstormsecurity.org/UNIX/admin/xscreensaver-3.30.tar.gz
[xscreensaver] / hacks / screenhack.c
index 786d24b4cc5ddf95a3f02eb4186c5c5fecedb0e8..be5c19befc6aad8defb6eaab1fed1274d6dec039 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992, 1995, 1997, 1998
+/* xscreensaver, Copyright (c) 1992, 1995, 1997, 1998, 2001
  *  Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -77,7 +77,6 @@ static XrmOptionDescRec default_options [] = {
   { "-install",        ".installColormap",     XrmoptionNoArg, "True" },
   { "-noinstall",".installColormap",   XrmoptionNoArg, "False" },
   { "-visual", ".visualID",            XrmoptionSepArg, 0 },
-  { "-window-id", ".windowID",         XrmoptionSepArg, 0 },
   { 0, 0, 0, 0 }
 };
 
@@ -87,7 +86,6 @@ static char *default_defaults[] = {
   "*mono:              false",
   "*installColormap:   false",
   "*visualID:          default",
-  "*windowID:          ",
   0
 };
 
@@ -276,9 +274,9 @@ pick_visual (Screen *screen)
 
 
 /* Notice when the user has requested a different visual or colormap
-   on a pre-existing window (e.g., "-root -visual truecolor" or
-   "-window-id 0x2c00001 -install") and complain, since when drawing
-   on an existing window, we have no choice about these things.
+   on a pre-existing window (e.g., "-root -visual truecolor") and 
+   complain, since when drawing on an existing window, we have no 
+   choice about these things.
  */
 static void
 visual_warning (Screen *screen, Window window, Visual *visual, Colormap cmap,
@@ -301,7 +299,16 @@ visual_warning (Screen *screen, Window window, Visual *visual, Colormap cmap,
 
   if (visual_string && *visual_string)
     {
-      if (visual != desired_visual)
+      char *s;
+      for (s = visual_string; *s; s++)
+        if (isupper (*s)) *s = _tolower (*s);
+
+      if (!strcmp (visual_string, "default") ||
+          !strcmp (visual_string, "default") ||
+          !strcmp (visual_string, "best"))
+        /* don't warn about these, just silently DWIM. */
+        ;
+      else if (visual != desired_visual)
         {
           fprintf (stderr, "%s: ignoring `-visual %s' because of `%s'.\n",
                    progname, visual_string, why);
@@ -320,6 +327,11 @@ visual_warning (Screen *screen, Window window, Visual *visual, Colormap cmap,
       fprintf (stderr, "%s: using %s's colormap 0x%x.\n",
                progname, win, (unsigned long) cmap);
     }
+
+# ifdef USE_GL
+  if (!validate_gl_visual (stderr, screen, win, visual))
+    exit (1);
+# endif /* USE_GL */
 }
 
 
@@ -333,7 +345,6 @@ main (int argc, char **argv)
   Visual *visual;
   Colormap cmap;
   Bool root_p;
-  Window on_window = 0;
   XEvent event;
   Boolean dont_clear /*, dont_map */;
   char version[255];
@@ -427,24 +438,7 @@ main (int argc, char **argv)
 
   root_p = get_boolean_resource ("root", "Boolean");
 
-  {
-    char *s = get_string_resource ("windowID", "WindowID");
-    if (s && *s)
-      on_window = get_integer_resource ("windowID", "WindowID");
-    if (s) free (s);
-  }
-
-  if (on_window)
-    {
-      XWindowAttributes xgwa;
-      window = (Window) on_window;
-      XtDestroyWidget (toplevel);
-      XGetWindowAttributes (dpy, window, &xgwa);
-      cmap = xgwa.colormap;
-      visual = xgwa.visual;
-      visual_warning (screen, window, visual, cmap, True);
-    }
-  else if (root_p)
+  if (root_p)
     {
       XWindowAttributes xgwa;
       window = RootWindowOfScreen (XtScreen (toplevel));
@@ -459,6 +453,11 @@ main (int argc, char **argv)
       Boolean def_visual_p;
       visual = pick_visual (screen);
 
+# ifdef USE_GL
+      if (!validate_gl_visual (stderr, screen, "window", visual))
+        exit (1);
+# endif /* USE_GL */
+
       if (toplevel->core.width <= 0)
        toplevel->core.width = 600;
       if (toplevel->core.height <= 0)
@@ -486,6 +485,7 @@ main (int argc, char **argv)
                                    XtNcolormap, cmap,
                                    XtNbackground, (Pixel) bg,
                                    XtNborderColor, (Pixel) bd,
+                                   XtNinput, True,  /* for WM_HINTS */
                                    0);
          XtDestroyWidget (toplevel);
          toplevel = new;
@@ -494,7 +494,10 @@ main (int argc, char **argv)
        }
       else
        {
-         XtVaSetValues (toplevel, XtNmappedWhenManaged, False, 0);
+         XtVaSetValues (toplevel,
+                         XtNmappedWhenManaged, False,
+                         XtNinput, True,  /* for WM_HINTS */
+                         0);
          XtRealizeWidget (toplevel);
          window = XtWindow (toplevel);
 
@@ -546,12 +549,18 @@ main (int argc, char **argv)
       XClearWindow (dpy, window);
     }
 
-  if (!root_p && !on_window)
+  if (!root_p)
     /* wait for it to be mapped */
     XIfEvent (dpy, &event, MapNotify_event_p, (XPointer) window);
 
   XSync (dpy, False);
-  srandom ((int) time ((time_t *) 0));
+
+  /* This is the one and only place that the random-number generator is
+     seeded in any screenhack.  You do not need to seed the RNG again,
+     it is done for you before your code is invoked. */
+# undef ya_rand_init
+  ya_rand_init (0);
+
   screenhack (dpy, window); /* doesn't return */
   return 0;
 }