http://ftp.x.org/contrib/applications/xscreensaver-3.20.tar.gz
[xscreensaver] / hacks / screenhack.c
index 5a70760d53d81e99ae3e3bf71b21a9d0ba9f190d..786d24b4cc5ddf95a3f02eb4186c5c5fecedb0e8 100644 (file)
 #include "version.h"
 #include "vroot.h"
 
+#ifndef isupper
+# define isupper(c)  ((c) >= 'A' && (c) <= 'Z')
+#endif
+#ifndef _tolower
+# define _tolower(c)  ((c) - 'A' + 'a')
+#endif
+
+
 char *progname;
 XrmDatabase db;
 XtAppContext app;
@@ -244,6 +252,11 @@ pick_visual (Screen *screen)
    */
   Visual *v = 0;
   char *string = get_string_resource ("visualID", "VisualID");
+  char *s;
+
+  if (string)
+    for (s = string; *s; s++)
+      if (isupper (*s)) *s = _tolower (*s);
 
   if (!string || !*string ||
       !strcmp (string, "gl") ||
@@ -262,12 +275,61 @@ 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.
+ */
+static void
+visual_warning (Screen *screen, Window window, Visual *visual, Colormap cmap,
+                Bool window_p)
+{
+  char *visual_string = get_string_resource ("visualID", "VisualID");
+  Visual *desired_visual = pick_visual (screen);
+  char win[100];
+  char why[100];
+
+  if (window == RootWindowOfScreen (screen))
+    strcpy (win, "root window");
+  else
+    sprintf (win, "window 0x%x", (unsigned long) window);
+
+  if (window_p)
+    sprintf (why, "-window-id 0x%x", (unsigned long) window);
+  else
+    strcpy (why, "-root");
+
+  if (visual_string && *visual_string)
+    {
+      if (visual != desired_visual)
+        {
+          fprintf (stderr, "%s: ignoring `-visual %s' because of `%s'.\n",
+                   progname, visual_string, why);
+          fprintf (stderr, "%s: using %s's visual 0x%x.\n",
+                   progname, win, XVisualIDFromVisual (visual));
+        }
+      free (visual_string);
+    }
+
+  if (visual == DefaultVisualOfScreen (screen) &&
+      has_writable_cells (screen, visual) &&
+      get_boolean_resource ("installColormap", "InstallColormap"))
+    {
+      fprintf (stderr, "%s: ignoring `-install' because of `%s'.\n",
+               progname, why);
+      fprintf (stderr, "%s: using %s's colormap 0x%x.\n",
+               progname, win, (unsigned long) cmap);
+    }
+}
+
+
 int
 main (int argc, char **argv)
 {
   Widget toplevel;
   Display *dpy;
   Window window;
+  Screen *screen;
   Visual *visual;
   Colormap cmap;
   Bool root_p;
@@ -297,7 +359,9 @@ main (int argc, char **argv)
                              merged_options_size, &argc, argv,
                              merged_defaults, 0, 0);
   dpy = XtDisplay (toplevel);
+  screen = XtScreen (toplevel);
   db = XtDatabase (dpy);
+
   XtGetApplicationNameAndClass (dpy, &progname, &progclass);
 
   /* half-assed way of avoiding buffer-overrun attacks. */
@@ -378,6 +442,7 @@ main (int argc, char **argv)
       XGetWindowAttributes (dpy, window, &xgwa);
       cmap = xgwa.colormap;
       visual = xgwa.visual;
+      visual_warning (screen, window, visual, cmap, True);
     }
   else if (root_p)
     {
@@ -387,11 +452,11 @@ main (int argc, char **argv)
       XGetWindowAttributes (dpy, window, &xgwa);
       cmap = xgwa.colormap;
       visual = xgwa.visual;
+      visual_warning (screen, window, visual, cmap, False);
     }
   else
     {
       Boolean def_visual_p;
-      Screen *screen = XtScreen (toplevel);
       visual = pick_visual (screen);
 
       if (toplevel->core.width <= 0)