http://svn.poeml.de/viewvc/ppc/src-unpacked/xscreensaver/xscreensaver-4.12.tar.bz2...
[xscreensaver] / utils / resources.c
index 1e73abec15558679ff9ed75017c68df88d5b9879..980878204d78e657e0f11a8989051d8ff3228c52 100644 (file)
@@ -1,4 +1,5 @@
-/* xscreensaver, Copyright (c) 1992 Jamie Zawinski <jwz@mcom.com>
+/* xscreensaver, Copyright (c) 1992, 1997, 1998, 2001, 2003
+ *  Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  * implied warranty.
  */
 
-#if __STDC__
-#include <stdlib.h>
-#include <string.h>
-#endif
-
-#include <stdio.h>
-#include <X11/Xlib.h>
+#include "utils.h"
+#include "resources.h"
 #include <X11/Xresource.h>
 
+
 /* Resource functions.  Assumes: */
 
 extern char *progname;
 extern char *progclass;
 extern XrmDatabase db;
 
-#if __STDC__
-char *get_string_resource (char *res_name, char *res_class);
-int parse_time (char *string, Bool seconds_default_p, Bool silent_p);
 static unsigned int get_time_resource (char *res_name, char *res_class,
                                       Bool sec_p);
-#endif
 
 #ifndef isupper
 # define isupper(c)  ((c) >= 'A' && (c) <= 'Z')
@@ -39,8 +32,7 @@ static unsigned int get_time_resource (char *res_name, char *res_class,
 #endif
 
 char *
-get_string_resource (res_name, res_class)
-     char *res_name, *res_class;
+get_string_resource (char *res_name, char *res_class)
 {
   XrmValue value;
   char *type;
@@ -62,8 +54,7 @@ get_string_resource (res_name, res_class)
 }
 
 Bool 
-get_boolean_resource (res_name, res_class)
-     char *res_name, *res_class;
+get_boolean_resource (char *res_name, char *res_class)
 {
   char *tmp, buf [100];
   char *s = get_string_resource (res_name, res_class);
@@ -74,27 +65,47 @@ get_boolean_resource (res_name, res_class)
   *tmp = 0;
   free (os);
 
+  while (*buf &&
+        (buf[strlen(buf)-1] == ' ' ||
+         buf[strlen(buf)-1] == '\t'))
+    buf[strlen(buf)-1] = 0;
+
   if (!strcmp (buf, "on") || !strcmp (buf, "true") || !strcmp (buf, "yes"))
     return 1;
   if (!strcmp (buf,"off") || !strcmp (buf, "false") || !strcmp (buf,"no"))
     return 0;
   fprintf (stderr, "%s: %s must be boolean, not %s.\n",
-          progname, res_class, buf);
+          progname, res_name, buf);
   return 0;
 }
 
 int 
-get_integer_resource (res_name, res_class)
-     char *res_name, *res_class;
+get_integer_resource (char *res_name, char *res_class)
 {
   int val;
   char c, *s = get_string_resource (res_name, res_class);
+  char *ss = s;
   if (!s) return 0;
-  if (1 == sscanf (s, " %d %c", &val, &c))
+
+  while (*ss && *ss <= ' ') ss++;                      /* skip whitespace */
+
+  if (ss[0] == '0' && (ss[1] == 'x' || ss[1] == 'X'))  /* 0x: parse as hex */
     {
-      free (s);
-      return val;
+      if (1 == sscanf (ss+2, "%x %c", (unsigned int *) &val, &c))
+       {
+         free (s);
+         return val;
+       }
+    }
+  else                                                 /* else parse as dec */
+    {
+      if (1 == sscanf (ss, "%d %c", &val, &c))
+       {
+         free (s);
+         return val;
+       }
     }
+
   fprintf (stderr, "%s: %s must be an integer, not %s.\n",
           progname, res_name, s);
   free (s);
@@ -102,8 +113,7 @@ get_integer_resource (res_name, res_class)
 }
 
 double
-get_float_resource (res_name, res_class)
-     char *res_name, *res_class;
+get_float_resource (char *res_name, char *res_class)
 {
   double val;
   char c, *s = get_string_resource (res_name, res_class);
@@ -121,39 +131,64 @@ get_float_resource (res_name, res_class)
 
 
 unsigned int
-get_pixel_resource (res_name, res_class, dpy, cmap)
-     char *res_name, *res_class;
-     Display *dpy;
-     Colormap cmap;
+get_pixel_resource (char *res_name, char *res_class,
+                   Display *dpy, Colormap cmap)
 {
   XColor color;
   char *s = get_string_resource (res_name, res_class);
+  char *s2;
+  Bool ok = True;
   if (!s) goto DEFAULT;
 
+  for (s2 = s + strlen(s) - 1; s2 > s; s2--)
+    if (*s2 == ' ' || *s2 == '\t')
+      *s2 = 0;
+    else
+      break;
+
   if (! XParseColor (dpy, cmap, s, &color))
     {
-      fprintf (stderr, "%s: can't parse color %s\n", progname, s);
+      fprintf (stderr, "%s: can't parse color %s", progname, s);
+      ok = False;
       goto DEFAULT;
     }
   if (! XAllocColor (dpy, cmap, &color))
     {
-      fprintf (stderr, "%s: couldn't allocate color %s\n", progname, s);
+      fprintf (stderr, "%s: couldn't allocate color %s", progname, s);
+      ok = False;
       goto DEFAULT;
     }
   free (s);
   return color.pixel;
  DEFAULT:
   if (s) free (s);
-  return (strcmp (res_class, "Background")
-         ? WhitePixel (dpy, DefaultScreen (dpy))
-         : BlackPixel (dpy, DefaultScreen (dpy)));
+
+  {
+    Bool black_p = (strlen(res_class) >= 10 &&
+                    !strcasecmp ("Background",
+                                 res_class + strlen(res_class) - 10));
+    if (!ok)
+      fprintf (stderr, ": using %s.\n", (black_p ? "black" : "white"));
+    color.flags = DoRed|DoGreen|DoBlue;
+    color.red = color.green = color.blue = (black_p ? 0 : 0xFFFF);
+    if (XAllocColor (dpy, cmap, &color))
+      return color.pixel;
+    else
+      {
+        fprintf (stderr, "%s: couldn't allocate %s either!\n", progname,
+                 (black_p ? "black" : "white"));
+        /* We can't use BlackPixel/WhitePixel here, because we don't know
+           what screen we're allocating on (only an issue when running inside
+           the xscreensaver daemon: for hacks, DefaultScreen is fine.)
+         */
+        return 0;
+      }
+  }
 }
 
 
 int
-parse_time (string, seconds_default_p, silent_p)
-     char *string;
-     Bool seconds_default_p, silent_p;
+parse_time (const char *string, Bool seconds_default_p, Bool silent_p)
 {
   unsigned int h, m, s;
   char c;
@@ -194,9 +229,7 @@ parse_time (string, seconds_default_p, silent_p)
 }
 
 static unsigned int 
-get_time_resource (res_name, res_class, sec_p)
-     char *res_name, *res_class;
-     Bool sec_p;
+get_time_resource (char *res_name, char *res_class, Bool sec_p)
 {
   int val;
   char *s = get_string_resource (res_name, res_class);
@@ -207,15 +240,13 @@ get_time_resource (res_name, res_class, sec_p)
 }
 
 unsigned int 
-get_seconds_resource (res_name, res_class)
-     char *res_name, *res_class;
+get_seconds_resource (char *res_name, char *res_class)
 {
   return get_time_resource (res_name, res_class, True);
 }
 
 unsigned int 
-get_minutes_resource (res_name, res_class)
-     char *res_name, *res_class;
+get_minutes_resource (char *res_name, char *res_class)
 {
   return get_time_resource (res_name, res_class, False);
 }