http://www.ibiblio.org/pub/historic-linux/ftp-archives/sunsite.unc.edu/Sep-29-1996...
[xscreensaver] / hacks / screenhack.c
index 12802ffae5828c4f4b1f1a622e99e62ff72efefe..6c7a03003044567373a2264ce231c53f6ed08a0f 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992 Jamie Zawinski <jwz@lucid.com>
+/* xscreensaver, Copyright (c) 1992, 1995 Jamie Zawinski <jwz@netscape.com>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -35,6 +35,8 @@
 #include <X11/Intrinsic.h>
 #include <X11/IntrinsicP.h>
 #include <X11/CoreP.h>
+#include <X11/Shell.h>
+#include <X11/StringDefs.h>
 #include <X11/Xmu/Error.h>
 #include "screenhack.h"
 
@@ -42,12 +44,19 @@ char *progname;
 XrmDatabase db;
 Bool mono_p;
 
+#if __STDC__
+# define P(x) x
+#else
+# define P(x)()
+#endif
+
 
 static XrmOptionDescRec default_options [] = {
   { "-root",   ".root",                XrmoptionNoArg, "True" },
   { "-window", ".root",                XrmoptionNoArg, "False" },
   { "-mono",   ".mono",                XrmoptionNoArg, "True" },
-  { "-install",        ".installColormap",     XrmoptionNoArg, "True" }
+  { "-install",        ".installColormap",     XrmoptionNoArg, "True" },
+  { "-visual", ".visualID",            XrmoptionSepArg, 0 }
 };
 
 static char *default_defaults[] = {
@@ -55,6 +64,7 @@ static char *default_defaults[] = {
   "*geometry:          500x500", /* this should be .geometry, but nooooo... */
   "*mono:              false",
   "*installColormap:   false",
+  "*visualID:          default",
   0
 };
 
@@ -63,7 +73,7 @@ static int merged_options_size;
 static char **merged_defaults;
 
 static void
-merge_options ()
+merge_options P((void))
 {
   int options_sizeof = options_size * sizeof (options[0]);
   int defaults_size;
@@ -121,6 +131,7 @@ main (argc, argv)
   Widget toplevel;
   Display *dpy;
   Window window;
+  Visual *visual;
   Colormap cmap;
   Bool root_p;
   XEvent event;
@@ -171,12 +182,38 @@ main (argc, argv)
       XtDestroyWidget (toplevel);
       XGetWindowAttributes (dpy, window, &xgwa);
       cmap = xgwa.colormap;
+      visual = xgwa.visual;
     }
   else
     {
+      visual = get_visual_resource (dpy, "visualID", "VisualID");
+
+      XtVaSetValues (toplevel, XtNmappedWhenManaged, False, 0);
       XtRealizeWidget (toplevel);
       window = XtWindow (toplevel);
-      if (get_boolean_resource ("installColormap", "InstallColormap"))
+
+      if (visual != DefaultVisualOfScreen (XtScreen (toplevel)))
+       {
+         Arg av [20];
+         int ac;
+         unsigned int bg, bd;
+         Widget new;
+         cmap = XCreateColormap (dpy, window, visual, AllocNone);
+         bg = get_pixel_resource ("background", "Background", dpy, cmap);
+         bd = get_pixel_resource ("borderColor", "Foreground", dpy, cmap);
+         ac = 0;
+         XtSetArg (av[ac], XtNvisual, visual); ac++;
+         XtSetArg (av[ac], XtNcolormap, cmap); ac++;
+         XtSetArg (av[ac], XtNdepth, get_visual_depth (dpy, visual)); ac++;
+         XtSetArg (av[ac], XtNbackground, (Pixel) bg); ac++;
+         XtSetArg (av[ac], XtNborderColor, (Pixel) bd); ac++;
+         new = XtAppCreateShell (progname, progclass,
+                                 topLevelShellWidgetClass, dpy,
+                                 av, ac);
+         XtDestroyWidget (toplevel);
+         toplevel = new;
+       }
+      else if (get_boolean_resource ("installColormap", "InstallColormap"))
        {
          cmap = XCreateColormap (dpy, window,
                                  DefaultVisualOfScreen (XtScreen (toplevel)),
@@ -184,8 +221,14 @@ main (argc, argv)
          XSetWindowColormap (dpy, window, cmap);
        }
       else
-       cmap = DefaultColormap (dpy, DefaultScreen (dpy));
+       {
+         cmap = DefaultColormap (dpy, DefaultScreen (dpy));
+       }
+
+      XtPopup (toplevel, XtGrabNone);
+      window = XtWindow (toplevel);
     }
+
   if (!get_boolean_resource ("dontClearWindow", "Boolean")) /* kludge-o-rama */
     {
       XSetWindowBackground (dpy, window,