http://svn.poeml.de/viewvc/ppc/src-unpacked/xscreensaver/xscreensaver-4.12.tar.bz2...
[xscreensaver] / utils / visual.c
index c37b6baa5e899628f12ff94e18398190a9bb1b33..8bb97646c2b14dd57394c26bf45b68db90358007 100644 (file)
@@ -1,4 +1,5 @@
-/* xscreensaver, Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998, 1999
+/* xscreensaver, Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2003
+ * 
  *  by Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -19,6 +20,7 @@
 #include "resources.h"  /* for get_string_resource() */
 #include "visual.h"
 
+#include <string.h>
 #include <X11/Xutil.h>
 
 extern char *progname;
@@ -36,8 +38,6 @@ static Visual *pick_best_visual (Screen *, Bool, Bool);
 static Visual *pick_mono_visual (Screen *);
 static Visual *pick_best_visual_of_class (Screen *, int);
 static Visual *pick_best_gl_visual (Screen *);
-static Visual *id_to_visual (Screen *, int);
-static Visual *id_to_visual (Screen *screen, int id);
 
 
 #define DEFAULT_VISUAL -1
@@ -78,7 +78,7 @@ get_visual (Screen *screen, const char *string, Bool prefer_writable_cells,
   else if (!strcmp (v, "greyscale"))             vclass = GrayScale;
   else if (!strcmp (v, "pseudocolor"))           vclass = PseudoColor;
   else if (!strcmp (v, "directcolor"))           vclass = DirectColor;
-  else if (1 == sscanf (v, " %ld %c", &id, &c))          vclass = SPECIFIC_VISUAL;
+  else if (1 == sscanf (v, " %lu %c", &id, &c))          vclass = SPECIFIC_VISUAL;
   else if (1 == sscanf (v, " 0x%lx %c", &id, &c)) vclass = SPECIFIC_VISUAL;
   else
     {
@@ -135,7 +135,7 @@ get_visual (Screen *screen, const char *string, Bool prefer_writable_cells,
       if (visual)
        result = visual;
       else if (verbose_p)
-       fprintf (stderr, "%s: no visual suitable for GL.\n", progname, v);
+       fprintf (stderr, "%s: no visual suitable for GL.\n", progname);
     }
   else if (vclass == SPECIFIC_VISUAL)
     {
@@ -263,7 +263,8 @@ pick_best_visual_of_class (Screen *screen, int visual_class)
       /* choose the 'best' one, if multiple */
       int i, best;
       Visual *visual;
-      for (i = 0, best = 0; i < out_count; i++)
+/*      for (i = 0, best = 0; i < out_count; i++) */
+      for (i = out_count-1, best = i; i >= 0; i--) /* go backwards */
        /* It's better if it's deeper, or if it's the same depth with
           more cells (does that ever happen?  Well, it could...) */
        if ((vi_out [i].depth > vi_out [best].depth) ||
@@ -325,7 +326,7 @@ pick_best_gl_visual (Screen *screen)
         result = vi_out[0].visual;
     }
 
-  if (result)
+  if (!result)
     /* No half-depth TrueColor?  Ok, try for any TrueColor (the deepest.) */
     result = pick_best_visual_of_class (screen, TrueColor);
 
@@ -337,7 +338,7 @@ pick_best_gl_visual (Screen *screen)
 }
 
 
-static Visual *
+Visual *
 id_to_visual (Screen *screen, int id)
 {
   Display *dpy = DisplayOfScreen (screen);
@@ -429,13 +430,12 @@ has_writable_cells (Screen *screen, Visual *visual)
     {
     case GrayScale:    /* Mappable grays. */
     case PseudoColor:  /* Mappable colors. */
+    case DirectColor:  /* Like TrueColor, but with three colormaps:
+                           one each for red, green, and blue. */
       return True;
     case StaticGray:   /* Fixed grays. */
     case TrueColor:    /* Fixed colors. */
-    case StaticColor:  /* (What's the difference again?) */
-    case DirectColor:  /* DirectColor visuals are like TrueColor, but have
-                          three colormaps - one for each component of RGB.
-                          Screw it. */
+    case StaticColor:  /* Like PseudoColor with an unmodifiable colormap. */
       return False;
     default:
       abort();