http://www.jwz.org/xscreensaver/xscreensaver-5.09.tar.gz
[xscreensaver] / OSX / PrefsReader.m
index 3c20f3dcf328db28ecbd24bba93b6a83b39a334a..507a557b09b5cbdc498d77f2c6b48f4a370ed923 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2006 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2006-2009 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
@@ -66,7 +66,7 @@
     else
       nsval = [NSString stringWithCString:val encoding:NSUTF8StringEncoding];
       
-//    NSLog (@"default: \"%@\" = \"%@\" [%@]\n", nskey, nsval, [nsval class]);
+//    NSLog (@"default: \"%@\" = \"%@\" [%@]", nskey, nsval, [nsval class]);
     [dict setValue:nsval forKey:nskey];
     free (line);
     defs++;
 - (char *) getStringResource: (const char *) name
 {
   NSObject *o = [self getObjectResource:name];
-  //NSLog(@"%s = %@\n",name,o);
+  //NSLog(@"%s = %@",name,o);
   if (o == nil) {
     if (! (!strcmp(name, "eraseMode") || // erase.c
            // xlockmore.c reads all of these whether used or not...
            !strcmp(name, "font") ||
            !strcmp(name, "labelFont") ||  // grabclient.c
            !strcmp(name, "titleFont") ||
+           !strcmp(name, "fpsFont") ||    // fps.c
+           !strcmp(name, "foreground") || // fps.c
            !strcmp(name, "background")
            ))
-      NSLog(@"warning: no preference \"%s\" [string]\n", name);
+      NSLog(@"warning: no preference \"%s\" [string]", name);
     return NULL;
   }
-#if 0
-  if (! [o isKindOfClass:[NSString class]]) {
-    NSAssert2(0, @"%s = \"%@\" but should have been an NSString", name, o);
-    abort();
-  }
-#else
   if (! [o isKindOfClass:[NSString class]]) {
     NSLog(@"asked for %s as a string, but it is a %@", name, [o class]);
     o = [(NSNumber *) o stringValue];
   }
-#endif
 
   NSString *os = (NSString *) o;
-  const char *result = [os cStringUsingEncoding:NSUTF8StringEncoding];
-  return strdup (result);
+  char *result = strdup ([os cStringUsingEncoding:NSUTF8StringEncoding]);
+
+  // Kludge: if the string is surrounded with single-quotes, remove them.
+  // This happens when the .xml file says things like arg="-foo 'bar baz'"
+  if (result[0] == '\'' && result[strlen(result)-1] == '\'') {
+    result[strlen(result)-1] = 0;
+    strcpy (result, result+1);
+  }
+
+  // Kludge: assume that any string that begins with "~" and has a "/"
+  // anywhere in it should be expanded as if it is a pathname.
+  if (result[0] == '~' && strchr (result, '/')) {
+    os = [NSString stringWithCString:result encoding:NSUTF8StringEncoding];
+    free (result);
+    result = strdup ([[os stringByExpandingTildeInPath]
+                       cStringUsingEncoding:NSUTF8StringEncoding]);
+  }
+
+  return result;
 }
 
 
            !strcmp(name, "mono") ||
            !strcmp(name, "count") ||
            !strcmp(name, "ncolors") ||
+           !strcmp(name, "doFPS") ||      // fps.c
            !strcmp(name, "eraseSeconds")  // erase.c
            ))
-      NSLog(@"warning: no preference \"%s\" [float]\n", name);
+      NSLog(@"warning: no preference \"%s\" [float]", name);
     return 0.0;
   }
   if ([o isKindOfClass:[NSString class]]) {
 
 - (int) getIntegerResource: (const char *) name
 {
-  return (int) [self getFloatResource:name];
+  // Sliders might store float values for integral resources; round them.
+  float v = [self getFloatResource:name];
+  int i = (int) (v + (v < 0 ? -0.5 : 0.5)); // ignore sign or -1 rounds to 0
+  // if (i != v) NSLog(@"%s: rounded %.3f to %d", name, v, i);
+  return i;
 }
 
 
   if (n == 0) return NO;
   else if (n == 1) return YES;
   else {
-    NSAssert2(0, @"%s = %d but should have been 0 or 1\n", name, n);
+    NSAssert2(0, @"%s = %d but should have been 0 or 1", name, n);
     abort();
   }
 }