From http://www.jwz.org/xscreensaver/xscreensaver-5.22.tar.gz
authorZygo Blaxell <zblaxell@faye.furryterror.org>
Tue, 16 Jul 2013 15:07:35 +0000 (11:07 -0400)
committerZygo Blaxell <zblaxell@faye.furryterror.org>
Tue, 16 Jul 2013 15:07:49 +0000 (11:07 -0400)
-rw-r--r-- 1 zblaxell zblaxell 7411666 Jul 16 05:35 xscreensaver-5.22.tar.gz
b1d7f97d9b60d9c68c0f3e019cad885f5c7bd6ec  xscreensaver-5.22.tar.gz

174 files changed:
Makefile.in
OSX/InvertedSlider.h
OSX/InvertedSlider.m
OSX/Makefile
OSX/README
OSX/SaverListController.m
OSX/SaverRunner.h
OSX/SaverRunner.m
OSX/SaverRunner.plist
OSX/XScreenSaver.plist
OSX/XScreenSaverConfigSheet.m
OSX/XScreenSaverGLView.m
OSX/XScreenSaverView.h
OSX/XScreenSaverView.m
OSX/apple2-app.xml [new file with mode: 0644]
OSX/bindist.rtf
OSX/build-fntable.pl
OSX/iSaverRunner.plist
OSX/ios-function-table.m [new file with mode: 0644]
OSX/ios_function_tables.h [deleted file]
OSX/phosphor-app.xml [new file with mode: 0644]
OSX/update-info-plist.pl
OSX/update-thumbnail.pl
README
driver/XScreenSaver.ad.in
driver/XScreenSaver_ad.h
driver/exec.c
driver/xscreensaver-getimage-file
driver/xscreensaver-getimage.c
driver/xscreensaver.c
hacks/Makefile.in
hacks/abstractile.c
hacks/anemone.c
hacks/anemotaxis.c
hacks/apple2-main.c
hacks/attraction.c
hacks/attraction.man
hacks/blaster.c
hacks/blitspin.c
hacks/bouboule.c
hacks/boxfit.c
hacks/braid.c
hacks/bumps.c
hacks/ccurve.c
hacks/celtic.c
hacks/cloudlife.c
hacks/compile_axp.com
hacks/compile_decc.com
hacks/config/README
hacks/config/apple2.xml
hacks/config/fliptext.xml
hacks/config/hexadrop.xml [new file with mode: 0644]
hacks/config/kaleidocycle.xml [new file with mode: 0644]
hacks/config/phosphor.xml
hacks/config/quasicrystal.xml [new file with mode: 0644]
hacks/config/unknownpleasures.xml [new file with mode: 0644]
hacks/coral.c
hacks/critical.c
hacks/crystal.c
hacks/cwaves.c
hacks/cynosure.c
hacks/decayscreen.c
hacks/deco.c
hacks/deluxe.c
hacks/demon.c
hacks/discrete.c
hacks/distort.c
hacks/drift.c
hacks/epicycle.c
hacks/euler2d.c
hacks/fadeplot.c
hacks/fireworkx.c
hacks/flame.c
hacks/fluidballs.c
hacks/galaxy.c
hacks/glx/Makefile.in
hacks/glx/companion.c
hacks/glx/cubenetic.c
hacks/glx/dnalogo.c
hacks/glx/engine.c
hacks/glx/font-ximage.c
hacks/glx/glschool.c
hacks/glx/gltrackball.c
hacks/glx/jwzgles.c
hacks/glx/jwzglesI.h
hacks/glx/kaleidocycle.c [new file with mode: 0644]
hacks/glx/kaleidocycle.man [new file with mode: 0644]
hacks/glx/quasicrystal.c [new file with mode: 0644]
hacks/glx/quasicrystal.man [new file with mode: 0644]
hacks/glx/tangram.c
hacks/glx/texfont.c
hacks/glx/unknownpleasures.c [new file with mode: 0644]
hacks/glx/unknownpleasures.man [new file with mode: 0644]
hacks/glx/xpm-ximage.c
hacks/goop.c
hacks/grav.c
hacks/greynetic.c
hacks/halftone.c
hacks/halo.c
hacks/helix.c
hacks/hexadrop.c [new file with mode: 0644]
hacks/hexadrop.man [new file with mode: 0644]
hacks/hopalong.c
hacks/ifs.c
hacks/imsmap.c
hacks/interaggregate.c
hacks/interference.c
hacks/intermomentary.c
hacks/julia.c
hacks/kaleidescope.c
hacks/kumppa.c
hacks/loop.c
hacks/maze.c
hacks/memscroller.c
hacks/metaballs.c
hacks/moire.c
hacks/moire2.c
hacks/munch.c
hacks/nerverot.c
hacks/pacman.c
hacks/pacman_level.c
hacks/pedal.c
hacks/penrose.c
hacks/petri.c
hacks/phosphor.c
hacks/piecewise.c
hacks/polyominoes.c
hacks/popsquares.c
hacks/qix.c
hacks/rd-bomb.c
hacks/ripples.c
hacks/rocks.c
hacks/rorschach.c
hacks/rotzoomer.c
hacks/screenhack.c
hacks/shadebobs.c
hacks/sierpinski.c
hacks/slidescreen.c
hacks/slip.c
hacks/speedmine.c
hacks/spotlight.c
hacks/squiral.c
hacks/starfish.c
hacks/strange.c
hacks/substrate.c
hacks/swirl.c
hacks/thornbird.c
hacks/triangle.c
hacks/truchet.c
hacks/twang.c
hacks/vermiculate.c
hacks/wander.c
hacks/whirlwindwarp.c
hacks/whirlygig.c
hacks/wormhole.c
hacks/xflame.c
hacks/xjack.c
hacks/xlockmore.c
hacks/xlyap.c
hacks/xml2man.pl
hacks/xrayswarm.c
hacks/xspirograph.c
hacks/zoom.c
po/POTFILES.in
setup.com
utils/colors.c
utils/colors.h
utils/grabclient.c
utils/grabscreen.c
utils/minixpm.c
utils/spline.c
utils/version.h
xscreensaver.spec
xscreensaver.xcodeproj/project.pbxproj

index c905925fffa0a74b4aff69dede985baf0abf8e0c..ccbe5f8bac240442bb73f59cdc74bfd7607afcee 100644 (file)
@@ -334,7 +334,9 @@ www::
   echo '' ;                                                                \
                                                                            \
   for EXT in tar.gz dmg ; do                                               \
-    OLDEST=`ls xscreensaver*.$$EXT | head -n 1` ;                          \
+    OLDEST=`ls xscreensaver*.$$EXT |                                       \
+      fgrep -v 5.14 |                                                      \
+      head -n 1` ;                                                         \
     /bin/echo -n "Delete $$DEST/$$OLDEST? ";                               \
     read line;                                                             \
     if [ "x$$line" = "xyes" -o "x$$line" = "xy" ]; then                            \
index 6e9dece82f1a7253deae2d1ad70f0ea802be1e23..986e8edde0b82104450ded662b120de1056b67b2 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2006-2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2006-2013 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
@@ -30,4 +30,9 @@
 
 - (id) initWithFrame:(NSRect)r inverted:(BOOL)_inv integers:(BOOL)_int;
 
+# ifdef USE_IPHONE
+- (double) transformedValue;
+- (void) setTransformedValue:(double)v;
+# endif
+
 @end
index c4fd5e3740fd3ce28472a35a76dede73a743864c..605d6e2dea70da61c3c1004243a5fa1caca82528 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2006-2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2006-2013 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
   return v2;
 }
 
--(double) doubleValue;
-{
-# ifdef USE_IPHONE
-  return [self transformValue:[self value]];
-# else
-  return [self transformValue:[super doubleValue]];
-# endif
-}
-
--(void) setDoubleValue:(double)v
-{
-# ifdef USE_IPHONE
-  return [super setValue:[self transformValue:v]];
-# else
-  return [super setDoubleValue:[self transformValue:v]];
-# endif
-}
-
-
-#ifdef USE_IPHONE
-
-- (void)setValue:(float)v animated:(BOOL)a
-{
-  return [super setValue:[self transformValue:v] animated:a];
-}
-
+#ifndef USE_IPHONE
 
-/* Draw the thumb in the right place by also inverting its position
-   relative to the track.
+/* On MacOS, we have to transform the value on every entry and exit point
+   to this class.  So, we implement doubleValue and setDoubleValue to
+   transform the value; and we then have to re-implement every getter and
+   setter in terms of those.  There's no way to simply change how the
+   slider is displayed without mucking with the value inside of it.
  */
-- (CGRect)thumbRectForBounds:(CGRect)bounds
-                   trackRect:(CGRect)rect
-                       value:(float)value
-{
-  CGRect thumb = [super thumbRectForBounds:bounds trackRect:rect value:value];
-  if (inverted)
-    thumb.origin.x = rect.size.width - thumb.origin.x - thumb.size.width;
-  return thumb;
-}
-
-#endif // !USE_IPHONE
-
-
 
-/* Implement all accessor methods in terms of "doubleValue" above.
-   (Note that these normally exist only on MacOS, not on iOS.)
- */
-
--(float) floatValue;
+-(double) doubleValue
 {
-  return (float) [self doubleValue];
+  return [self transformValue:[super doubleValue]];
 }
 
--(int) intValue;
+-(void) setDoubleValue:(double)v
 {
-  return (int) [self doubleValue];
+  return [super setDoubleValue:[self transformValue:v]];
 }
 
--(id) objectValue;
-{
-  return [NSNumber numberWithDouble:[self doubleValue]];
-}
+-(float)floatValue       { return (float) [self doubleValue]; }
+-(int)intValue           { return (int) [self doubleValue]; }
+-(NSInteger)integerValue { return (NSInteger) [self doubleValue]; }
+-(id)objectValue { return [NSNumber numberWithDouble:[self doubleValue]]; }
 
--(NSString *) stringValue;
+-(NSString *)stringValue
 {
-  return [NSString stringWithFormat:@"%f", [self floatValue]];
+  if (integers)
+    return [NSString stringWithFormat:@"%d", [self intValue]];
+  else
+    return [NSString stringWithFormat:@"%f", [self doubleValue]];
 }
 
 - (NSAttributedString *)attributedStringValue;
   return [[NSAttributedString alloc] initWithString:[self stringValue]];
 }
 
-
-/* Implment all setter methods in terms of "setDoubleValue", above.
- */
-
--(void) setFloatValue:(float)v
-{
-  [self setDoubleValue:(double)v];
-}
-
--(void) setIntValue:(int)v
-{
-  [self setDoubleValue:(double)v];
+-(void)setFloatValue:(float)v       { [self setDoubleValue: (double) v];      }
+-(void)setIntValue:  (int)v         { [self setDoubleValue: (double) v];      }
+-(void)setIntegerValue:(NSInteger)v { [self setDoubleValue: (double) v];      }
+-(void)setStringValue:(NSString *)v { [self setDoubleValue: [v doubleValue]]; }
+-(void)takeIntValueFrom:(id)f       { [self setIntValue:    [f intValue]];    }
+-(void)takeFloatValueFrom:(id)f     { [self setFloatValue:  [f floatValue]];  }
+-(void)takeDoubleValueFrom:(id)f    { [self setDoubleValue: [f doubleValue]]; }
+-(void)takeStringValueFrom:(id)f    { [self setStringValue: [f stringValue]]; }
+-(void)takeObjectValueFrom:(id)f    { [self setObjectValue: [f objectValue]]; }
+-(void)takeIntegerValueFrom:(id)f   { [self setIntegerValue:[f integerValue]];}
+-(void) setAttributedStringValue:(NSAttributedString *)v {
+  [self setStringValue:[v string]];
 }
 
 -(void) setObjectValue:(id <NSCopying>)v
   [self setDoubleValue:[((NSNumber *) v) doubleValue]];
 }
 
--(void) setStringValue:(NSString *)v
+#else  // USE_IPHONE
+
+/* On iOS, we have control over how the value is displayed, but there's no
+   way to transform the value on input and output: if we wrap 'value' and
+   'setValue' analagously to what we do on MacOS, things fail in weird
+   ways.  Presumably some parts of the system are accessing the value
+   instance variable directly instead of going through the methods.
+
+   So the only way around this is to enforce that all of our calls into
+   this object use a new API: 'transformedValue' and 'setTransformedValue'.
+   The code in XScreenSaverConfigSheet uses that instead.
+ */
+
+- (CGRect)thumbRectForBounds:(CGRect)bounds
+                   trackRect:(CGRect)rect
+                       value:(float)value
+{
+  CGRect thumb = [super thumbRectForBounds: bounds
+                                 trackRect: rect 
+                                     value: [self transformValue:value]];
+  if (inverted)
+    thumb.origin.x = rect.size.width - thumb.origin.x - thumb.size.width;
+  return thumb;
+}
+
+-(double) transformedValue
 {
-  [self setDoubleValue:[v doubleValue]];
+  return [self transformValue: [self value]];
 }
 
--(void) setAttributedStringValue:(NSAttributedString *)v
+-(void) setTransformedValue:(double)v
 {
-  [self setStringValue:[v string]];
+  [self setValue: [self transformValue: v]];
 }
 
+#endif // USE_IPHONE
+
+
 @end
index b2354dfae06aa02bd678650327890dcfb45a85c1..7e99452ec51825fc997e80b333e8aa40a76acdc3 100644 (file)
@@ -1,4 +1,4 @@
-# XScreenSaver for MacOS X, Copyright (c) 2006-2012 by Jamie Zawinski.
+# XScreenSaver for MacOS X, Copyright (c) 2006-2013 by Jamie Zawinski.
 
 XCODEBUILD = /usr/bin/xcodebuild
 TARGETS    = -target "All Savers"
@@ -12,7 +12,7 @@ all: debug release
 
 clean:
        -rm -rf build
-#      cd ..; $(XCODEBUILD) -target $(TARGETS) clean
+#      cd ..; $(XCODEBUILD) $(TARGETS) clean
 
 distclean:
        -rm -f config.status config.cache config.log \
@@ -33,7 +33,8 @@ release:: update_thumbs
 release:: sign
 
 sign:
-       @for f in build/Release/*.{saver,app} ; do \
+       @for f in build/Release/*.app/Contents/*/*.saver \
+                 build/Release/*.{saver,app} ; do \
          codesign -vfs $(CERT) $$f ; \
         done
 
@@ -62,8 +63,8 @@ update_thumbs::
 
 
 # Arrrrgh
-ios_function_tables.h::
-       @./build-fntable.pl build/Debug-iphoneos/XScreenSaver.app $@
+ios-function-table.m::
+       @./build-fntable.pl build/Debug-iphonesimulator/XScreenSaver.app $@
 
 
 echo_tarfiles:
index 551e3bb6814a53c79a85ee20d61caee1add1aca0..f8f7458b03563659d714cda5e3fecc3517d8209a 100644 (file)
@@ -8,3 +8,33 @@ directories.
 
 To build these programs, XCode 2.4 or later is required.
 To run them, MacOS 10.4.0 or later is required.
+
+
+This is how you add a new screen saver to the Xcode project. It's a
+ridiculously long list of steps!
+
+  1: Duplicate a target (Dangerball for GL, or Attraction for X11).
+  2: Rename it, and drag it to the right spot in the list.
+  3: Delete the dangerball.c and dangerball.xml files from the new target.
+  4: Delete the "DangerBall copy-Info.plist" file that got created.
+  5: Delete the "DangerBall copy-Info.plist" from the Build Settings too.
+  6: Change PRODUCT_NAME in Build Settings.
+  7: Manage Schemes, rename "DangerBall Copy".
+  8: Move to the right place in the list.
+  9: Scheme / Run: set SELECTED_SAVER environment variable.
+ 10: Scheme / Run / Info: Executable: SaverTester.app.
+ 11: File / Add Files / the new .c and .xml.
+     Add to targets: the new target, and also "XScreenSaver-iOS".
+ 12: Re-order them in the file list.
+ 13: In target "All Savers (OpenGL)" add the new target as a dependency.
+ 14: In target "XScreenSaver-iOS", reorder new files in "Copy" and "Compile".
+ 15: In target "XScreenSaver-iOS", add "-DUSE_GL" to the new file's options.
+ 16: Put a 200x150 screen shot in ~/www/xscreensaver/screenshots/
+ 17: ln -s ../../src/xscreensaver/OSX/build/Debug/NEW.saver \
+           ~/Library/Screen\ Savers/
+ 18: Build "XScreenSaver-iOS" once. then:
+     cd ~/src/xscreensaver/OSX ; make ios-function-table.m
+     and build it again.
+ 19: cvs add xscreensaver.xcodeproj/xcuserdata/*/xcschemes/*.xcscheme
+ 20: Don't forget to create a man page from the XML with xml2man.pl,
+     and update Makefile.in.
index 484cb1685449bdb50a625d1a7ccfe445c23e27eb..e0abeca61db2eead825090e704b44aad8241ade9 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2012-2013 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
@@ -36,6 +36,7 @@
 {
   // Extract the version number and release date from the version string.
   // Here's an area where I kind of wish I had "Two Problems".
+  // I guess I could add custom key to the Info.plist for this.
 
   NSArray *a = [[NSString stringWithCString: screensaver_id
                           encoding:NSASCIIStringEncoding]
  */
 - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
 {
+  if (motion != UIEventSubtypeMotionShake)
+    return;
   NSMutableArray *a = [NSMutableArray arrayWithCapacity: 200];
   for (NSArray *sec in letter_sections)
     for (NSString *s in sec)
index 0284ccf5065a296ebb7a9b3f9b8aad96d1e6f865..b8716263a4ac0214ebc4967fb1f2e0552aa15775 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2006-2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2006-2013 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
@@ -55,6 +55,8 @@
   GLuint gl_framebuffer, gl_renderbuffer;
   IBOutlet UIView *view;
   UIImage *saved_screenshot;
+  UIView *aboutBox;
+  NSTimer *splashTimer;
 
 # endif // USE_IPHONE
 }
@@ -62,9 +64,9 @@
 - (void) loadSaver: (NSString *)name launch:(BOOL)launch;
 - (void) loadSaver: (NSString *)name;
 - (void) selectedSaverDidChange:(NSDictionary *)change;
+- (void) aboutPanel: (id)sender;
 
 #ifndef USE_IPHONE
-- (void) aboutPanel: (id)sender;
 - (void) openPreferences: (id)sender;
 #else  // USE_IPHONE
 - (void) openPreferences: (NSString *)which;
index 526f62eb0dc4071b3a0a8e19c1282a154cf7f207..c94e6c1473d173929608a6a29b772295536716af 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2006-2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2006-2013 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
@@ -19,7 +19,7 @@
 
    Second, it can be used to transform any screen saver into a standalone
    program.  Just put one (and only one) .saver bundle into the app
-   bundle's Contents/PlugIns/ directory, and it will load and run that
+   bundle's Contents/Resources/ directory, and it will load and run that
    saver at start-up (without the saver-selection menu or other chrome).
    This is how the "Phosphor.app" and "Apple2.app" programs work.
 
                           initWithFrame:rect
                           saverName:module
                           isPreview:YES];
-  if (! instance) return 0;
+  if (! instance) {
+    NSLog(@"Failed to instantiate %@ for \"%@\"", new_class, module);
+    return 0;
+  }
 
 
   /* KLUGE: Inform the underlying program that we're in "standalone"
@@ -211,6 +214,7 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
   }
 
   NSAssert (sv, @"no saver view");
+  if (!sv) return;
   NSWindow *prefs = [sv configureSheet];
 
   [NSApp beginSheet:prefs
@@ -362,8 +366,6 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
 
 - (void)loadSaver:(NSString *)name launch:(BOOL)launch
 {
-  // NSLog (@"selecting saver \"%@\"", name);
-
 # ifndef USE_IPHONE
 
   if (saverName && [saverName isEqualToString: name]) {
@@ -413,6 +415,10 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
 
 # else  // USE_IPHONE
 
+#  if TARGET_IPHONE_SIMULATOR
+  NSLog (@"selecting saver \"%@\"", name);
+#  endif
+
   NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
   [prefs setObject:name forKey:@"selectedSaverName"];
   [prefs synchronize];
@@ -429,7 +435,7 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
   if (! backgroundView) {
     // This view is the parent of the XScreenSaverView, and exists only
     // so that there is a black background behind it.  Without this, when
-    // rotation is in progresss, the scrolling-list window's corners show
+    // rotation is in progress, the scrolling-list window's corners show
     // through in the corners.
     backgroundView = [[[NSView class] alloc] initWithFrame:[window frame]];
     [backgroundView setBackgroundColor:[NSColor blackColor]];
@@ -469,6 +475,7 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
     [backgroundView addSubview: saverView];
     [saverView becomeFirstResponder];
     [saverView startAnimation];
+    [self aboutPanel:nil];
   }
 # endif // USE_IPHONE
 }
@@ -480,10 +487,10 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
 }
 
 
-# ifndef USE_IPHONE
-
 - (void)aboutPanel:(id)sender
 {
+# ifndef USE_IPHONE
+
   NSDictionary *bd = [saverBundle infoDictionary];
   NSMutableDictionary *d = [NSMutableDictionary dictionaryWithCapacity:20];
 
@@ -499,9 +506,168 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
 
   [[NSApplication sharedApplication]
     orderFrontStandardAboutPanelWithOptions:d];
-}
+# else  // USE_IPHONE
+
+  NSString *name = saverName;
+  NSString *year = [self makeDesc:saverName yearOnly:YES];
+
+
+  CGRect frame = [saverView frame];
+  CGFloat rot;
+  CGFloat pt1 = 24;
+  CGFloat pt2 = 14;
+  UIFont *font1 = [UIFont boldSystemFontOfSize:  pt1];
+  UIFont *font2 = [UIFont italicSystemFontOfSize:pt2];
+  CGSize tsize1 = [name sizeWithFont:font1
+                   constrainedToSize:CGSizeMake(frame.size.width,
+                                                frame.size.height)];
+  CGSize tsize2 = [year sizeWithFont:font2
+                   constrainedToSize:CGSizeMake(frame.size.width,
+                                                frame.size.height)];
+  CGSize tsize = CGSizeMake (tsize1.width > tsize2.width ?
+                             tsize1.width : tsize2.width,
+                             tsize1.height + tsize2.height);
+
+  // Don't know how to find inner margin of UITextView.
+  CGFloat margin = 10;
+  tsize.width  += margin * 4;
+  tsize.height += margin * 2;
+
+  if ([saverView frame].size.width >= 768)
+    tsize.height += pt1 * 3;  // extra bottom margin on iPad
+
+  frame = CGRectMake (0, 0, tsize.width, tsize.height);
+
+  UIInterfaceOrientation orient =
+    // Why are both of these wrong when starting up rotated??
+    [[UIDevice currentDevice] orientation];
+    // [rootViewController interfaceOrientation];
+
+  /* Get the text oriented properly, and move it to the bottom of the
+     screen, since many savers have action in the middle.
+   */
+  switch (orient) {
+  case UIDeviceOrientationLandscapeRight:     
+    rot = -M_PI/2;
+    frame.origin.x = ([saverView frame].size.width
+                      - (tsize.width - tsize.height) / 2
+                      - tsize.height);
+    frame.origin.y = ([saverView frame].size.height - tsize.height) / 2;
+    break;
+  case UIDeviceOrientationLandscapeLeft:
+    rot = M_PI/2;
+    frame.origin.x = -(tsize.width - tsize.height) / 2;
+    frame.origin.y = ([saverView frame].size.height - tsize.height) / 2;
+    break;
+  case UIDeviceOrientationPortraitUpsideDown: 
+    rot = M_PI;
+    frame.origin.x = ([saverView frame].size.width  - tsize.width) / 2;
+    frame.origin.y = 0;
+    break;
+  default:
+    rot = 0;
+    frame.origin.x = ([saverView frame].size.width  - tsize.width) / 2;
+    frame.origin.y =  [saverView frame].size.height - tsize.height;
+    break;
+  }
+
+  if (aboutBox)
+    [aboutBox removeFromSuperview];
+
+  aboutBox = [[UIView alloc] initWithFrame:frame];
+
+  aboutBox.transform = CGAffineTransformMakeRotation (rot);
+  aboutBox.backgroundColor = [UIColor clearColor];
 
+  /* There seems to be no easy way to stroke the font, so instead draw
+     it 5 times, 4 in black and 1 in yellow, offset by 1 pixel, and add
+     a black shadow to each.  (You'd think the shadow alone would be
+     enough, but there's no way to make it dark enough to be legible.)
+   */
+  for (int i = 0; i < 5; i++) {
+    UITextView *textview;
+    int off = 1;
+    frame.origin.x = frame.origin.y = 0;
+    switch (i) {
+      case 0: frame.origin.x = -off; break;
+      case 1: frame.origin.x =  off; break;
+      case 2: frame.origin.y = -off; break;
+      case 3: frame.origin.y =  off; break;
+    }
+
+    for (int j = 0; j < 2; j++) {
+
+      frame.origin.y = (j == 0 ? 0 : pt1);
+      textview = [[UITextView alloc] initWithFrame:frame];
+      textview.font = (j == 0 ? font1 : font2);
+      textview.text = (j == 0 ? name  : year);
+      textview.textAlignment = UITextAlignmentCenter;
+      textview.showsHorizontalScrollIndicator = NO;
+      textview.showsVerticalScrollIndicator   = NO;
+      textview.scrollEnabled = NO;
+      textview.editable = NO;
+      textview.userInteractionEnabled = NO;
+      textview.backgroundColor = [UIColor clearColor];
+      textview.textColor = (i == 4 
+                            ? [UIColor yellowColor]
+                            : [UIColor blackColor]);
+
+      CALayer *textLayer = (CALayer *)
+        [textview.layer.sublayers objectAtIndex:0];
+      textLayer.shadowColor   = [UIColor blackColor].CGColor;
+      textLayer.shadowOffset  = CGSizeMake(0, 0);
+      textLayer.shadowOpacity = 1;
+      textLayer.shadowRadius  = 2;
+
+      [aboutBox addSubview:textview];
+    }
+  }
+
+  CABasicAnimation *anim = 
+    [CABasicAnimation animationWithKeyPath:@"opacity"];
+  anim.duration     = 0.3;
+  anim.repeatCount  = 1;
+  anim.autoreverses = NO;
+  anim.fromValue    = [NSNumber numberWithFloat:0.0];
+  anim.toValue      = [NSNumber numberWithFloat:1.0];
+  [aboutBox.layer addAnimation:anim forKey:@"animateOpacity"];
+
+  [backgroundView addSubview:aboutBox];
+
+  if (splashTimer)
+    [splashTimer invalidate];
+
+  splashTimer =
+    [NSTimer scheduledTimerWithTimeInterval: anim.duration + 2
+             target:self
+             selector:@selector(aboutOff)
+             userInfo:nil
+             repeats:NO];
 # endif // USE_IPHONE
+}
+
+
+# ifdef USE_IPHONE
+- (void)aboutOff
+{
+  if (aboutBox) {
+    if (splashTimer) {
+      [splashTimer invalidate];
+      splashTimer = 0;
+    }
+    CABasicAnimation *anim = 
+      [CABasicAnimation animationWithKeyPath:@"opacity"];
+    anim.duration     = 0.3;
+    anim.repeatCount  = 1;
+    anim.autoreverses = NO;
+    anim.fromValue    = [NSNumber numberWithFloat: 1];
+    anim.toValue      = [NSNumber numberWithFloat: 0];
+    anim.delegate     = self;
+    aboutBox.layer.opacity = 0;
+    [aboutBox.layer addAnimation:anim forKey:@"animateOpacity"];
+  }
+}
+#endif // USE_IPHONE
 
 
 
@@ -560,6 +726,9 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
     [result addObject: name];
   }
 
+  if (! [result count])
+    result = 0;
+
   return result;
 }
 
@@ -570,7 +739,11 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
   NSMutableArray *dirs = [NSMutableArray arrayWithCapacity: 10];
 
 # ifndef USE_IPHONE
-  // On MacOS, look in the "Contents/PlugIns/" directory in the bundle.
+  // On MacOS, look in the "Contents/Resources/" and "Contents/PlugIns/"
+  // directories in the bundle.
+  [dirs addObject: [[[[NSBundle mainBundle] bundlePath]
+                      stringByAppendingPathComponent:@"Contents"]
+                     stringByAppendingPathComponent:@"Resources"]];
   [dirs addObject: [[NSBundle mainBundle] builtInPlugInsPath]];
 
   // Also look in the same directory as the executable.
@@ -578,14 +751,16 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
                      stringByDeletingLastPathComponent]];
 
   // Finally, look in standard MacOS screensaver directories.
-  [dirs addObject: @"~/Library/Screen Savers"];
-  [dirs addObject: @"/Library/Screen Savers"];
-  [dirs addObject: @"/System/Library/Screen Savers"];
+//  [dirs addObject: @"~/Library/Screen Savers"];
+//  [dirs addObject: @"/Library/Screen Savers"];
+//  [dirs addObject: @"/System/Library/Screen Savers"];
 
-# else
-  // On iOS, just look in the bundle's root directory.
+# else  // USE_IPHONE
+
+  // On iOS, only look in the bundle's root directory.
   [dirs addObject: [[NSBundle mainBundle] bundlePath]];
-# endif
+
+# endif // USE_IPHONE
 
   int i;
   for (i = 0; i < [dirs count]; i++) {
@@ -656,6 +831,84 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
 
 #else  // USE_IPHONE
 
+- (NSString *) makeDesc:(NSString *)saver
+                  yearOnly:(BOOL) yearp
+{
+  NSString *desc = 0;
+  NSString *path = [saverDir stringByAppendingPathComponent:
+                               [[saver lowercaseString]
+                                 stringByReplacingOccurrencesOfString:@" "
+                                 withString:@""]];
+  NSRange r;
+
+  path = [path stringByAppendingPathExtension:@"xml"];
+  desc = [NSString stringWithContentsOfFile:path
+                   encoding:NSISOLatin1StringEncoding
+                   error:nil];
+  if (! desc) goto FAIL;
+
+  r = [desc rangeOfString:@"<_description>"
+            options:NSCaseInsensitiveSearch];
+  if (r.length == 0) {
+    desc = 0;
+    goto FAIL;
+  }
+  desc = [desc substringFromIndex: r.location + r.length];
+  r = [desc rangeOfString:@"</_description>"
+            options:NSCaseInsensitiveSearch];
+  if (r.length > 0)
+    desc = [desc substringToIndex: r.location];
+
+  // Leading and trailing whitespace.
+  desc = [desc stringByTrimmingCharactersInSet:
+                 [NSCharacterSet whitespaceAndNewlineCharacterSet]];
+
+  // Let's see if we can find a year on the last line.
+  r = [desc rangeOfString:@"\n" options:NSBackwardsSearch];
+  NSString *year = 0;
+  for (NSString *word in
+         [[desc substringFromIndex:r.location + r.length]
+           componentsSeparatedByCharactersInSet:
+             [NSCharacterSet characterSetWithCharactersInString:
+                               @" \t\n-."]]) {
+    int n = [word doubleValue];
+    if (n > 1970 && n < 2100)
+      year = word;
+  }
+
+  // Delete everything after the first blank line.
+  r = [desc rangeOfString:@"\n\n" options:0];
+  if (r.length > 0)
+    desc = [desc substringToIndex: r.location];
+
+  // Truncate really long ones.
+  int max = 140;
+  if ([desc length] > max)
+    desc = [desc substringToIndex: max];
+
+  if (year)
+    desc = [year stringByAppendingString:
+                   [@": " stringByAppendingString: desc]];
+
+  if (yearp)
+    desc = year ? year : @"";
+
+FAIL:
+  if (! desc) {
+    desc = @"Oops, this module appears to be incomplete.";
+    // NSLog(@"broken saver: %@", path);
+  }
+
+  return desc;
+}
+
+- (NSString *) makeDesc:(NSString *)saver
+{
+  return [self makeDesc:saver yearOnly:NO];
+}
+
+
+
 /* Create a dictionary of one-line descriptions of every saver,
    for display on the UITableView.
  */
@@ -663,73 +916,9 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
 {
   NSMutableDictionary *dict = 
     [NSMutableDictionary dictionaryWithCapacity:[saverNames count]];
-
   for (NSString *saver in saverNames) {
-    NSString *desc = 0;
-    NSString *path = [saverDir stringByAppendingPathComponent:
-                                 [[saver lowercaseString]
-                                   stringByReplacingOccurrencesOfString:@" "
-                                   withString:@""]];
-    NSRange r;
-
-    path = [path stringByAppendingPathExtension:@"xml"];
-    desc = [NSString stringWithContentsOfFile:path
-                     encoding:NSISOLatin1StringEncoding
-                     error:nil];
-    if (! desc) goto FAIL;
-
-    r = [desc rangeOfString:@"<_description>"
-              options:NSCaseInsensitiveSearch];
-    if (r.length == 0) {
-      desc = 0;
-      goto FAIL;
-    }
-    desc = [desc substringFromIndex: r.location + r.length];
-    r = [desc rangeOfString:@"</_description>"
-              options:NSCaseInsensitiveSearch];
-    if (r.length > 0)
-      desc = [desc substringToIndex: r.location];
-
-    // Leading and trailing whitespace.
-    desc = [desc stringByTrimmingCharactersInSet:
-                   [NSCharacterSet whitespaceAndNewlineCharacterSet]];
-
-    // Let's see if we can find a year on the last line.
-    r = [desc rangeOfString:@"\n" options:NSBackwardsSearch];
-    NSString *year = 0;
-    for (NSString *word in
-           [[desc substringFromIndex:r.location + r.length]
-             componentsSeparatedByCharactersInSet:
-               [NSCharacterSet characterSetWithCharactersInString:
-                                 @" \t\n-."]]) {
-      int n = [word doubleValue];
-      if (n > 1970 && n < 2100)
-        year = word;
-    }
-
-    // Delete everything after the first blank line.
-    r = [desc rangeOfString:@"\n\n" options:0];
-    if (r.length > 0)
-      desc = [desc substringToIndex: r.location];
-
-    // Truncate really long ones.
-    int max = 140;
-    if ([desc length] > max)
-      desc = [desc substringToIndex: max];
-
-    if (year)
-      desc = [year stringByAppendingString:
-                     [@": " stringByAppendingString: desc]];
-
-  FAIL:
-    if (! desc) {
-      desc = @"Oops, this module appears to be incomplete.";
-      // NSLog(@"broken saver: %@", path);
-    }
-
-    [dict setObject:desc forKey:saver];
+    [dict setObject:[self makeDesc:saver] forKey:saver];
   }
-
   return dict;
 }
 
@@ -969,8 +1158,9 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
 # ifdef USE_IPHONE
   /* Don't auto-launch the saver unless it was running last time.
      XScreenSaverView manages this, on crash_timer.
+     Unless forced.
    */
-  if (! [prefs boolForKey:@"wasRunning"])
+  if (!forced && ![prefs boolForKey:@"wasRunning"])
     return;
 # endif
 
index 0a864dc52fc8ad7f42bf2e9261d93e2d907e2949..28460692ebb046ef0b18e2f7b863208fa6457210 100644 (file)
@@ -12,7 +12,7 @@ http://www.jwz.org/xscreensaver/</string>
        <key>CFBundleIconFile</key>
        <string>SaverRunner</string>
        <key>CFBundleIdentifier</key>
-       <string>org.jwz.xscreensaver.${EXECUTABLE_NAME}</string>
+       <string>${BUNDLE_IDENTIFIER}</string>
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</string>
        <key>CFBundleLongVersionString</key>
@@ -22,11 +22,11 @@ http://www.jwz.org/xscreensaver/</string>
        <key>CFBundlePackageType</key>
        <string>APPL</string>
        <key>CFBundleShortVersionString</key>
-       <string>5.21</string>
+       <string>5.22</string>
        <key>CFBundleSignature</key>
        <string>????</string>
        <key>CFBundleVersion</key>
-       <string>5.21</string>
+       <string>5.22</string>
        <key>LSMinimumSystemVersion</key>
        <string>10.4</string>
        <key>NSHumanReadableCopyright</key>
index 36c8a0efa503f8818621672ae1c2e32c4d482078..b47a5fd318d9aa9cbce76eb0106dd25beb4883df 100644 (file)
@@ -7,7 +7,7 @@
        <key>CFBundleExecutable</key>
        <string>${EXECUTABLE_NAME}</string>
        <key>CFBundleIdentifier</key>
-       <string>org.jwz.xscreensaver.${EXECUTABLE_NAME}</string>
+       <string>${BUNDLE_IDENTIFIER}</string>
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</string>
        <key>CFBundleName</key>
        <key>CFBundlePackageType</key>
        <string>BNDL</string>
        <key>CFBundleShortVersionString</key>
-       <string>5.21</string>
+       <string>5.22</string>
        <key>CFBundleSignature</key>
        <string>????</string>
        <key>CFBundleVersion</key>
-       <string>5.21</string>
+       <string>5.22</string>
        <key>LSMinimumSystemVersion</key>
        <string>10.4</string>
        <key>NSMainNibFile</key>
index b32e47612a15fe7e2ac36867b227044d114c351a..ebf33827ea9747ba397588fbe336cfe45a1bc529 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2006-2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2006-2013 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
@@ -533,7 +533,12 @@ static void layout_group (NSView *group, BOOL horiz_p);
   if ([active_text_field canResignFirstResponder])
     [active_text_field resignFirstResponder];
   NSString *pref_key = [pref_keys objectAtIndex: [sender tag]];
-  double v = [sender value];
+
+  // Hacky API. See comment in InvertedSlider.m.
+  double v = ([sender isKindOfClass: [InvertedSlider class]]
+              ? [(InvertedSlider *) sender transformedValue]
+              : [sender value]);
+
   if (v == (int) v)
     [userDefaultsController setInteger:v forKey:pref_key];
   else
@@ -689,7 +694,11 @@ static void layout_group (NSView *group, BOOL horiz_p);
 
   if ([control isKindOfClass:[UISlider class]]) {
     sel = @selector(sliderAction:);
-    [(UISlider *) control setValue: dval];
+    // Hacky API. See comment in InvertedSlider.m.
+    if ([control isKindOfClass:[InvertedSlider class]])
+      [(InvertedSlider *) control setTransformedValue: dval];
+    else
+      [(UISlider *) control setValue: dval];
   } else if ([control isKindOfClass:[UISwitch class]]) {
     sel = @selector(switchAction:);
     [(UISwitch *) control setOn: ((int) dval != 0)];
index 3d3aeeaba4b438fb84d0b57eeeaac642e4b79533..7ec10090624b18cb61f76bb24c018ffb38c5ab23 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2006-2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2006-2013 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
@@ -207,13 +207,13 @@ extern void check_gl_error (const char *type);
 {
 # ifdef USE_IPHONE
   UIGraphicsPushContext (backbuffer);
-#endif
+# endif
 
   [self render_x11];
 
 # ifdef USE_IPHONE
   UIGraphicsPopContext();
-#endif
+# endif
 }
 
 
@@ -233,6 +233,7 @@ extern void check_gl_error (const char *type);
 # else
   double s = 1;
 # endif
+  // Store a realistic size in backbuffer_size, though the buffer is minimal.
   NSRect f = [self bounds];
   backbuffer_size.width  = (int) (s * f.size.width);
   backbuffer_size.height = (int) (s * f.size.height);
@@ -247,7 +248,7 @@ extern void check_gl_error (const char *type);
     CGColorSpaceRelease (cs);
   }
 }
-# endif // USE_IPHONE
+# endif // USE_BACKBUFFER
 
 
 - (void)dealloc {
@@ -338,6 +339,7 @@ init_GL (ModeInfo *mi)
 
     NSAssert (pixfmt, @"unable to create NSOpenGLPixelFormat");
 
+    // #### Analyze says: "Potential leak of an object stored into pixfmt"
     ctx = [[NSOpenGLContext alloc] 
             initWithFormat:pixfmt
               shareContext:nil];
@@ -349,9 +351,8 @@ init_GL (ModeInfo *mi)
   [ctx setValues:&r forParameter:NSOpenGLCPSwapInterval];
 //  check_gl_error ("NSOpenGLCPSwapInterval");  // SEGV sometimes. Too early?
 
-  // #### "Build and Analyze" says that ctx leaks, because it doesn't
-  //      seem to realize that makeCurrentContext retains it (right?)
-  //      Not sure what to do to make this warning go away.
+  // #### Analyze says: "Potential leak of an object stored into "ctx"
+  // But makeCurrentContext retains it (right?)
 
   [ctx makeCurrentContext];
   check_gl_error ("makeCurrentContext");
@@ -397,9 +398,9 @@ init_GL (ModeInfo *mi)
     eagl_layer.opaque = TRUE;
     eagl_layer.drawableProperties = 
       [NSDictionary dictionaryWithObjectsAndKeys:
-      kEAGLColorFormatRGBA8,             kEAGLDrawablePropertyColorFormat,
-      [NSNumber numberWithBool:!dbuf_p], kEAGLDrawablePropertyRetainedBacking,
-      nil];
+       kEAGLColorFormatRGBA8,             kEAGLDrawablePropertyColorFormat,
+       [NSNumber numberWithBool:!dbuf_p], kEAGLDrawablePropertyRetainedBacking,
+       nil];
 
     // Without this, the GL frame buffer is half the screen resolution!
     eagl_layer.contentsScale = [UIScreen mainScreen].scale;
@@ -410,6 +411,7 @@ init_GL (ModeInfo *mi)
   if (!ogl_ctx)
     return 0;
   [view setOglContext:ogl_ctx];
+  // #### Analyze says "Potential leak of an object stored into ogl_ctx"
 
   check_gl_error ("OES_init");
 
index 0fe2046c0d4de0a3df3cf1b616ee82378b02737a..6902c559ea749aac3708edcd55eb67b748ffee8c 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2006-2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2006-2013 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
   NSSize rot_from, rot_to;     // start size rect, end size rect
   GLfloat angle_from, angle_to;        // start angle, end angle
   double rot_start_time;
+  BOOL ignore_rotation_p;
 
   NSSize rot_current_size;
   GLfloat rot_current_angle;
 
   NSTimer *crash_timer;
 
+  NSDictionary *function_tables;
+
 # endif // USE_IPHONE
 
 # ifdef USE_BACKBUFFER
index a0dc3813200b738f86d24d2c2aea71251d283c9a..d773fc84d048ab6b75c4015befb677e5431867b5 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2006-2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2006-2013 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
 #import "xlockmoreI.h"
 #import "jwxyz-timers.h"
 
-#ifdef USE_IPHONE
-# include "ios_function_tables.h"
-static NSDictionary *function_tables = 0;
-#endif
-
 
 /* Garbage collection only exists if we are being compiled against the 
    10.6 SDK or newer, not if we are building against the 10.4 SDK.
@@ -50,6 +45,8 @@ int mono_p = 0;
 
 # ifdef USE_IPHONE
 
+extern NSDictionary *make_function_table_dict(void);  // ios-function-table.m
+
 /* Stub definition of the superclass, for iPhone.
  */
 @implementation ScreenSaverView
@@ -98,7 +95,6 @@ int mono_p = 0;
 
 
 @interface XScreenSaverView (Private)
-- (void) stopAndClose;
 - (void) stopAndClose:(Bool)relaunch;
 @end
 
@@ -120,6 +116,7 @@ int mono_p = 0;
   CFBundleRef cfb = CFBundleCreate (kCFAllocatorDefault, url);
   CFRelease (url);
   NSAssert1 (cfb, @"no CFBundle for \"%@\"", path);
+  // #### Analyze says "Potential leak of an object stored into cfb"
   
   if (! name)
     name = [[path lastPathComponent] stringByDeletingPathExtension];
@@ -141,9 +138,9 @@ int mono_p = 0;
 
 # else  // USE_IPHONE
   // Remember: any time you add a new saver to the iOS app,
-  // manually run "make ios_function_tables.h"!
+  // manually run "make ios-function-table.m"!
   if (! function_tables)
-    function_tables = [make_function_tables_dict() retain];
+    function_tables = [make_function_table_dict() retain];
   NSValue *v = [function_tables objectForKey: name];
   void *addr = v ? [v pointerValue] : 0;
 # endif // USE_IPHONE
@@ -236,7 +233,7 @@ add_default_options (const XrmOptionDescRec *opts,
 # endif
  // ".textLiteral:        ",
  // ".textFile:           ",
-    ".textURL:            http://twitter.com/statuses/public_timeline.atom",
+    ".textURL:            http://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss",
  // ".textProgram:        ",
     ".grabDesktopImages:  yes",
 # ifndef USE_IPHONE
@@ -474,6 +471,7 @@ double_time (void)
                          selector:@selector(allSystemsGo:)
                          userInfo:nil
                          repeats:NO];
+
 # endif // USE_IPHONE
 
   // Never automatically turn the screen off if we are docked,
@@ -562,6 +560,10 @@ screenhack_do_fps (Display *dpy, Window w, fps_state *fpst, void *closure)
    anyway, since that's a higher resolution than most desktop monitors
    have even today.  (This is only true for X11 programs, not GL 
    programs.  Those are fine at full rez.)
+
+   This method is overridden in XScreenSaverGLView, since this kludge
+   isn't necessary for GL programs, being resolution independent by
+   nature.
  */
 - (CGFloat) hackedContentScaleFactor
 {
@@ -629,9 +631,10 @@ double current_device_rotation (void)
 #   undef CLAMP180
 
   double s = [self hackedContentScaleFactor];
-  if (((int) backbuffer_size.width  != (int) (s * rot_current_size.width) ||
-       (int) backbuffer_size.height != (int) (s * rot_current_size.height))
-/*      && rotation_ratio == -1*/)
+  if (!ignore_rotation_p &&
+      /* rotation_ratio && */
+      ((int) backbuffer_size.width  != (int) (s * rot_current_size.width) ||
+       (int) backbuffer_size.height != (int) (s * rot_current_size.height)))
     [self resize_x11];
 }
 
@@ -639,7 +642,7 @@ double current_device_rotation (void)
 - (void)alertView:(UIAlertView *)av clickedButtonAtIndex:(NSInteger)i
 {
   if (i == 0) exit (-1);       // Cancel
-  [self stopAndClose];         // Keep going
+  [self stopAndClose:NO];      // Keep going
 }
 
 - (void) handleException: (NSException *)e
@@ -784,6 +787,13 @@ double current_device_rotation (void)
     resized_p = NO;
     NSAssert(!xdata, @"xdata already initialized");
     
+# ifdef USE_IPHONE
+  /* Some X11 hacks (fluidballs) want to ignore all rotation events. */
+  ignore_rotation_p =
+    get_boolean_resource (xdpy, "ignoreRotation", "IgnoreRotation");
+# endif // USE_IPHONE
+
+
 # undef ya_rand_init
     ya_rand_init (0);
     
@@ -995,18 +1005,19 @@ double current_device_rotation (void)
 # ifdef USE_IPHONE
   // Then compute the transformations for rotation.
 
-  // The rotation origin for layer.affineTransform is in the center already.
-  CGAffineTransform t =
-    CGAffineTransformMakeRotation (rot_current_angle / (180.0 / M_PI));
+  if (!ignore_rotation_p) {
+    // The rotation origin for layer.affineTransform is in the center already.
+    CGAffineTransform t =
+      CGAffineTransformMakeRotation (rot_current_angle / (180.0 / M_PI));
 
-  // Correct the aspect ratio.
-  CGRect frame = [self bounds];
-  double s = [self hackedContentScaleFactor];
-  t = CGAffineTransformScale(t,
-                             backbuffer_size.width  / (s * frame.size.width),
-                             backbuffer_size.height / (s * frame.size.height));
-
-  self.layer.affineTransform = t;
+    // Correct the aspect ratio.
+    CGRect frame = [self bounds];
+    double s = [self hackedContentScaleFactor];
+    t = CGAffineTransformScale(t,
+                            backbuffer_size.width  / (s * frame.size.width),
+                            backbuffer_size.height / (s * frame.size.height));
+    self.layer.affineTransform = t;
+  }
 # endif // USE_IPHONE
 
   // Then copy that bitmap to the screen, by just stuffing it into
@@ -1081,6 +1092,7 @@ double current_device_rotation (void)
 
   // #### am I expected to retain this, or not? wtf.
   //      I thought not, but if I don't do this, we (sometimes) crash.
+  // #### Analyze says "potential leak of an object stored into sheet"
   [sheet retain];
 
   return sheet;
@@ -1207,7 +1219,7 @@ double current_device_rotation (void)
         break;
       }
     default:
-      NSAssert (0, @"unknown X11 event type: %d", type);
+      NSAssert1 (0, @"unknown X11 event type: %d", type);
       break;
   }
 
@@ -1288,7 +1300,7 @@ double current_device_rotation (void)
 #else  // USE_IPHONE
 
 
-- (void) stopAndClose
+- (void) stopAndClose:(Bool)relaunch_p
 {
   if ([self isAnimating])
     [self stopAnimation];
@@ -1305,26 +1317,23 @@ double current_device_rotation (void)
   }
 
   UIView *fader = [self superview];  // the "backgroundView" view is our parent
-  [UIView animateWithDuration: 0.5
-          animations:^{ fader.alpha = 0.0; }
-          completion:^(BOOL finished) {
-            [fader removeFromSuperview];
-             fader.alpha = 1.0;
-          }];
-}
-
-
-- (void) stopAndClose:(Bool)relaunch_p
-{
-  [self stopAndClose];
 
   if (relaunch_p) {   // Fake a shake on the SaverListController.
-    UIViewController *v = [[self window] rootViewController];
+    // Why is [self window] sometimes null here?
+    UIWindow *w = [[UIApplication sharedApplication] keyWindow];
+    UIViewController *v = [w rootViewController];
     if ([v isKindOfClass: [UINavigationController class]]) {
       UINavigationController *n = (UINavigationController *) v;
       [[n topViewController] motionEnded: UIEventSubtypeMotionShake
                                withEvent: nil];
     }
+  } else {     // Not launching another, animate our return to the list.
+    [UIView animateWithDuration: 0.5
+            animations:^{ fader.alpha = 0.0; }
+            completion:^(BOOL finished) {
+               [fader removeFromSuperview];
+               fader.alpha = 1.0;
+            }];
   }
 }
 
@@ -1505,6 +1514,10 @@ double current_device_rotation (void)
 
 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {
+  // If they are trying to pinch, just do nothing.
+  if ([[event allTouches] count] > 1)
+    return;
+
   tap_time = 0;
 
   if (xsft->event_cb && xwindow) {
@@ -1542,6 +1555,10 @@ double current_device_rotation (void)
 
 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
 {
+  // If they are trying to pinch, just do nothing.
+  if ([[event allTouches] count] > 1)
+    return;
+
   if (xsft->event_cb && xwindow) {
     double s = [self hackedContentScaleFactor];
     XEvent xe;
@@ -1560,7 +1577,7 @@ double current_device_rotation (void)
       double dist = sqrt (((p.x - tap_point.x) * (p.x - tap_point.x)) +
                           ((p.y - tap_point.y) * (p.y - tap_point.y)));
       if (tap_time + 0.5 >= double_time() && dist < 20) {
-        [self stopAndClose];
+        [self stopAndClose:NO];
         return;
       }
 
@@ -1581,6 +1598,10 @@ double current_device_rotation (void)
 
 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
 {
+  // If they are trying to pinch, just do nothing.
+  if ([[event allTouches] count] > 1)
+    return;
+
   if (xsft->event_cb && xwindow) {
     double s = [self hackedContentScaleFactor];
     XEvent xe;
diff --git a/OSX/apple2-app.xml b/OSX/apple2-app.xml
new file mode 100644 (file)
index 0000000..583aeb1
--- /dev/null
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="apple2" _label="Apple2">
+
+ <command arg="-root"/>
+
+  <hgroup>
+   <vgroup>
+    <number id="tvcolor" type="slider" arg="-tv-color %"
+            _label="Color Knob" _low-label="Low" _high-label="High"
+            low="0" high="1000" default="70"/>
+    <number id="tvtint" type="slider" arg="-tv-tint %"
+            _label="Tint Knob" _low-label="Low" _high-label="High"
+            low="0" high="100" default="5"/>
+   </vgroup>
+   <vgroup>
+    <number id="tvbrightness" type="slider" arg="-tv-brightness %"
+            _label="Brightness Knob" _low-label="Low" _high-label="High"
+            low="0" high="200" default="150"/>
+    <number id="tvcontrast" type="slider" arg="-tv-contrast %"
+            _label="Contrast Knob" _low-label="Low" _high-label="High"
+            low="0" high="1500" default="1000"/>
+   </vgroup>
+  </hgroup>
+
+ <_description>
+A fully-functional VT100 terminal emulator simulating an original
+Apple ][ Plus computer in all its 1979 glory.  It also reproduces the
+appearance of display on a color television set of the period.
+
+http://en.wikipedia.org/wiki/Apple_II_series
+
+Written by Trevor Blackwell; 2003.
+  </_description>
+</screensaver>
index 22875fa3adba02b91f25c45fe36026c9a5e55fd8..27d041c6f90843cea16e1bf76f24917fd312a925 100644 (file)
@@ -18,8 +18,8 @@ XScreenSaver\
 by Jamie Zawinski\
 and many others\
 \
-version 5.21\
-04-Feb-2013\
+version 5.22\
+16-Jul-2013\
 \
 {\field{\*\fldinst{HYPERLINK "http://www.jwz.org/xscreensaver/"}}{\fldrslt \cf2 \ul \ulc2 http://www.jwz.org/xscreensaver/}}
 \
index f5e3b1f3dc69fc07c4d49854707b38783ef833d9..ed294aadbab9d8f62d003281f0cb1d865e2acf16 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/perl -w
-# Copyright Â© 2012 Jamie Zawinski <jwz@jwz.org>
+# Copyright Â© 2012-2013 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
@@ -9,7 +9,7 @@
 # software for any purpose.  It is provided "as is" without express or 
 # implied warranty.
 #
-# Generates a .h file that lists all the function tables we use, because
+# Generates a .c file that lists all the function tables we use, because
 # CFBundleGetDataPointerForName doesn't work in "Archive" builds.
 # What a crock of shit.
 #
@@ -23,7 +23,7 @@ require 5;
 use strict;
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.1 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.2 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 
 my $verbose = 1;
 
@@ -42,20 +42,40 @@ sub build_h($$) {
 
   my $suf = 'xscreensaver_function_table';
 
-  my $body = "extern struct $suf";
+  my $body = ("/* Generated file, do not edit.\n" .
+              "   Created: " . localtime() . " by $progname $version.\n" .
+              " */\n" .
+              "\n" .
+              "#import <Foundation/Foundation.h>\n" .
+              "#import <UIKit/UIKit.h>\n" .
+              "\n" .
+              "extern NSDictionary *make_function_table_dict(void);\n" .
+              "\n");
+
+  $body .= "extern struct $suf";
   foreach my $s (@names) {
     $body .= "\n *${s}_${suf},";
   }
   $body =~ s/,\s*$/;/s;
 
-  $body .= ("\n\n" .
-            "static NSDictionary *make_function_tables_dict(void)\n{\n" .
-            "  return\n    [NSDictionary dictionaryWithObjectsAndKeys:\n");
-  foreach my $s (@names) {
-    $body .= "\t[NSValue valueWithPointer:&${s}_${suf}], @\"${s}\",\n";
+  sub line($$) {
+    my ($s, $suf) = @_;
+    return "\t[NSValue valueWithPointer:&${s}_${suf}], @\"${s}\",\n";
   }
-  $body .= ("\tnil];\n" .
-            "}\n");
+
+  $body .= ("\n\n" .
+            "NSDictionary *make_function_table_dict(void)\n{\n" .
+            "  return\n    [NSDictionary dictionaryWithObjectsAndKeys:\n" .
+            "\n" .
+            "#if defined(APPLE2_ONLY)\n" .
+            " " . line('apple2', $suf) .
+            "#elif defined(PHOSPHOR_ONLY)\n" .
+            " " . line('phosphor', $suf) .
+            "#else\n");
+  foreach my $s (@names) { $body .= line($s, $suf); }
+  $body .= ("#endif\n" .
+            "\tnil];\n" .
+            "}\n\n");
 
   my $obody = '';
   if (open (my $in, '<', $outfile)) {
@@ -64,7 +84,11 @@ sub build_h($$) {
     close $in;
   }
 
-  if ($obody eq $body) {
+  # strip comments/date for diff.
+  my ($body2, $obody2) = ($body, $obody);
+  foreach ($body2, $obody2) { s@/\*.*?\*/@@gs; }
+
+  if ($body2 eq $obody2) {
     print STDERR "$progname: $outfile: unchanged\n" if ($verbose > 1);
   } else {
     my $file_tmp = "$outfile.tmp";
@@ -88,7 +112,7 @@ sub error($) {
 }
 
 sub usage() {
-  print STDERR "usage: $progname [--verbose] program.app output.h\n";
+  print STDERR "usage: $progname [--verbose] program.app output.c\n";
   exit 1;
 }
 
index 8a2404a02f54e49e73654ae49d37e7223ab6b9e4..43ce2f4e754931ff574c385fbcc974b12de4badc 100644 (file)
@@ -9,7 +9,7 @@
        <key>CFBundleDevelopmentRegion</key>
        <string>English</string>
        <key>CFBundleVersion</key>
-       <string>5.21</string>
+       <string>5.22</string>
        <key>NSMainNibFile</key>
        <string>iSaverRunner</string>
        <key>CFBundlePackageType</key>
        <key>UIStatusBarHidden</key>
        <true/>
        <key>CFBundleShortVersionString</key>
-       <string>5.21</string>
+       <string>5.22</string>
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</string>
        <key>UIRequiredDeviceCapabilities</key>
-       <array>
-               <string>armv7</string>
-       </array>
+       <dict>
+               <key>opengles-1</key>
+               <true/>
+       </dict>
        <key>CFBundleExecutable</key>
        <string>${EXECUTABLE_NAME}</string>
        <key>UISupportedInterfaceOrientations~ipad</key>
@@ -38,7 +39,7 @@
        <key>CFBundleLongVersionString</key>
        <string>XScreenSaver 5.15, Â© 2001-2012 Jamie Zawinski.</string>
        <key>CFBundleIdentifier</key>
-       <string>org.jwz.xscreensaver</string>
+       <string>${BUNDLE_IDENTIFIER}</string>
        <key>CFBundleSignature</key>
        <string>????</string>
        <key>CFBundleIconFiles</key>
diff --git a/OSX/ios-function-table.m b/OSX/ios-function-table.m
new file mode 100644 (file)
index 0000000..b109fb6
--- /dev/null
@@ -0,0 +1,421 @@
+/* Generated file, do not edit.
+   Created: Mon Jul  8 16:42:29 2013 by build-fntable.pl 1.2.
+ */
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+
+extern NSDictionary *make_function_table_dict(void);
+
+extern struct xscreensaver_function_table
+ *abstractile_xscreensaver_function_table,
+ *anemone_xscreensaver_function_table,
+ *anemotaxis_xscreensaver_function_table,
+ *antinspect_xscreensaver_function_table,
+ *antmaze_xscreensaver_function_table,
+ *antspotlight_xscreensaver_function_table,
+ *apollonian_xscreensaver_function_table,
+ *apple2_xscreensaver_function_table,
+ *atlantis_xscreensaver_function_table,
+ *attraction_xscreensaver_function_table,
+ *atunnel_xscreensaver_function_table,
+ *barcode_xscreensaver_function_table,
+ *blaster_xscreensaver_function_table,
+ *blinkbox_xscreensaver_function_table,
+ *blitspin_xscreensaver_function_table,
+ *blocktube_xscreensaver_function_table,
+ *boing_xscreensaver_function_table,
+ *bouboule_xscreensaver_function_table,
+ *bouncingcow_xscreensaver_function_table,
+ *boxed_xscreensaver_function_table,
+ *boxfit_xscreensaver_function_table,
+ *braid_xscreensaver_function_table,
+ *bsod_xscreensaver_function_table,
+ *bubble3d_xscreensaver_function_table,
+ *bumps_xscreensaver_function_table,
+ *cage_xscreensaver_function_table,
+ *carousel_xscreensaver_function_table,
+ *ccurve_xscreensaver_function_table,
+ *celtic_xscreensaver_function_table,
+ *circuit_xscreensaver_function_table,
+ *cloudlife_xscreensaver_function_table,
+ *companioncube_xscreensaver_function_table,
+ *compass_xscreensaver_function_table,
+ *coral_xscreensaver_function_table,
+ *crackberg_xscreensaver_function_table,
+ *crystal_xscreensaver_function_table,
+ *cube21_xscreensaver_function_table,
+ *cubenetic_xscreensaver_function_table,
+ *cubestorm_xscreensaver_function_table,
+ *cubicgrid_xscreensaver_function_table,
+ *cwaves_xscreensaver_function_table,
+ *cynosure_xscreensaver_function_table,
+ *dangerball_xscreensaver_function_table,
+ *decayscreen_xscreensaver_function_table,
+ *deco_xscreensaver_function_table,
+ *deluxe_xscreensaver_function_table,
+ *demon_xscreensaver_function_table,
+ *discrete_xscreensaver_function_table,
+ *distort_xscreensaver_function_table,
+ *dnalogo_xscreensaver_function_table,
+ *drift_xscreensaver_function_table,
+ *endgame_xscreensaver_function_table,
+ *engine_xscreensaver_function_table,
+ *epicycle_xscreensaver_function_table,
+ *eruption_xscreensaver_function_table,
+ *euler2d_xscreensaver_function_table,
+ *fadeplot_xscreensaver_function_table,
+ *fiberlamp_xscreensaver_function_table,
+ *fireworkx_xscreensaver_function_table,
+ *flame_xscreensaver_function_table,
+ *flipflop_xscreensaver_function_table,
+ *flipscreen3d_xscreensaver_function_table,
+ *fliptext_xscreensaver_function_table,
+ *flow_xscreensaver_function_table,
+ *fluidballs_xscreensaver_function_table,
+ *flyingtoasters_xscreensaver_function_table,
+ *fontglide_xscreensaver_function_table,
+ *fuzzyflakes_xscreensaver_function_table,
+ *galaxy_xscreensaver_function_table,
+ *gears_xscreensaver_function_table,
+ *gflux_xscreensaver_function_table,
+ *glblur_xscreensaver_function_table,
+ *glcells_xscreensaver_function_table,
+ *gleidescope_xscreensaver_function_table,
+ *glhanoi_xscreensaver_function_table,
+ *glknots_xscreensaver_function_table,
+ *glmatrix_xscreensaver_function_table,
+ *glplanet_xscreensaver_function_table,
+ *glschool_xscreensaver_function_table,
+ *glslideshow_xscreensaver_function_table,
+ *glsnake_xscreensaver_function_table,
+ *gltext_xscreensaver_function_table,
+ *goop_xscreensaver_function_table,
+ *grav_xscreensaver_function_table,
+ *greynetic_xscreensaver_function_table,
+ *halftone_xscreensaver_function_table,
+ *halo_xscreensaver_function_table,
+ *helix_xscreensaver_function_table,
+ *hexadrop_xscreensaver_function_table,
+ *hilbert_xscreensaver_function_table,
+ *hopalong_xscreensaver_function_table,
+ *hypertorus_xscreensaver_function_table,
+ *hypnowheel_xscreensaver_function_table,
+ *ifs_xscreensaver_function_table,
+ *imsmap_xscreensaver_function_table,
+ *interaggregate_xscreensaver_function_table,
+ *interference_xscreensaver_function_table,
+ *intermomentary_xscreensaver_function_table,
+ *jigglypuff_xscreensaver_function_table,
+ *jigsaw_xscreensaver_function_table,
+ *juggler3d_xscreensaver_function_table,
+ *julia_xscreensaver_function_table,
+ *kaleidescope_xscreensaver_function_table,
+ *kaleidocycle_xscreensaver_function_table,
+ *klein_xscreensaver_function_table,
+ *kumppa_xscreensaver_function_table,
+ *lament_xscreensaver_function_table,
+ *lavalite_xscreensaver_function_table,
+ *loop_xscreensaver_function_table,
+ *m6502_xscreensaver_function_table,
+ *maze_xscreensaver_function_table,
+ *memscroller_xscreensaver_function_table,
+ *menger_xscreensaver_function_table,
+ *metaballs_xscreensaver_function_table,
+ *mirrorblob_xscreensaver_function_table,
+ *moebius_xscreensaver_function_table,
+ *moebiusgears_xscreensaver_function_table,
+ *moire_xscreensaver_function_table,
+ *moire2_xscreensaver_function_table,
+ *molecule_xscreensaver_function_table,
+ *morph3d_xscreensaver_function_table,
+ *mountain_xscreensaver_function_table,
+ *munch_xscreensaver_function_table,
+ *nerverot_xscreensaver_function_table,
+ *noof_xscreensaver_function_table,
+ *noseguy_xscreensaver_function_table,
+ *pacman_xscreensaver_function_table,
+ *pedal_xscreensaver_function_table,
+ *penetrate_xscreensaver_function_table,
+ *penrose_xscreensaver_function_table,
+ *petri_xscreensaver_function_table,
+ *phosphor_xscreensaver_function_table,
+ *photopile_xscreensaver_function_table,
+ *piecewise_xscreensaver_function_table,
+ *pinion_xscreensaver_function_table,
+ *pipes_xscreensaver_function_table,
+ *polyhedra_xscreensaver_function_table,
+ *polyominoes_xscreensaver_function_table,
+ *polytopes_xscreensaver_function_table,
+ *pong_xscreensaver_function_table,
+ *popsquares_xscreensaver_function_table,
+ *providence_xscreensaver_function_table,
+ *pulsar_xscreensaver_function_table,
+ *pyro_xscreensaver_function_table,
+ *qix_xscreensaver_function_table,
+ *quasicrystal_xscreensaver_function_table,
+ *queens_xscreensaver_function_table,
+ *rdbomb_xscreensaver_function_table,
+ *ripples_xscreensaver_function_table,
+ *rocks_xscreensaver_function_table,
+ *rorschach_xscreensaver_function_table,
+ *rotzoomer_xscreensaver_function_table,
+ *rubik_xscreensaver_function_table,
+ *rubikblocks_xscreensaver_function_table,
+ *sballs_xscreensaver_function_table,
+ *shadebobs_xscreensaver_function_table,
+ *sierpinski_xscreensaver_function_table,
+ *sierpinski3d_xscreensaver_function_table,
+ *skytentacles_xscreensaver_function_table,
+ *slidescreen_xscreensaver_function_table,
+ *slip_xscreensaver_function_table,
+ *sonar_xscreensaver_function_table,
+ *speedmine_xscreensaver_function_table,
+ *spheremonics_xscreensaver_function_table,
+ *spotlight_xscreensaver_function_table,
+ *sproingies_xscreensaver_function_table,
+ *squiral_xscreensaver_function_table,
+ *stairs_xscreensaver_function_table,
+ *starfish_xscreensaver_function_table,
+ *starwars_xscreensaver_function_table,
+ *stonerview_xscreensaver_function_table,
+ *strange_xscreensaver_function_table,
+ *substrate_xscreensaver_function_table,
+ *superquadrics_xscreensaver_function_table,
+ *surfaces_xscreensaver_function_table,
+ *swirl_xscreensaver_function_table,
+ *tangram_xscreensaver_function_table,
+ *thornbird_xscreensaver_function_table,
+ *timetunnel_xscreensaver_function_table,
+ *topblock_xscreensaver_function_table,
+ *triangle_xscreensaver_function_table,
+ *tronbit_xscreensaver_function_table,
+ *truchet_xscreensaver_function_table,
+ *twang_xscreensaver_function_table,
+ *unknownpleasures_xscreensaver_function_table,
+ *vermiculate_xscreensaver_function_table,
+ *voronoi_xscreensaver_function_table,
+ *wander_xscreensaver_function_table,
+ *whirlwindwarp_xscreensaver_function_table,
+ *wormhole_xscreensaver_function_table,
+ *xanalogtv_xscreensaver_function_table,
+ *xflame_xscreensaver_function_table,
+ *xjack_xscreensaver_function_table,
+ *xlyap_xscreensaver_function_table,
+ *xmatrix_xscreensaver_function_table,
+ *xrayswarm_xscreensaver_function_table,
+ *xspirograph_xscreensaver_function_table,
+ *zoom_xscreensaver_function_table;
+
+NSDictionary *make_function_table_dict(void)
+{
+  return
+    [NSDictionary dictionaryWithObjectsAndKeys:
+
+#if defined(APPLE2_ONLY)
+       [NSValue valueWithPointer:&apple2_xscreensaver_function_table], @"apple2",
+#elif defined(PHOSPHOR_ONLY)
+       [NSValue valueWithPointer:&phosphor_xscreensaver_function_table], @"phosphor",
+#else
+       [NSValue valueWithPointer:&abstractile_xscreensaver_function_table], @"abstractile",
+       [NSValue valueWithPointer:&anemone_xscreensaver_function_table], @"anemone",
+       [NSValue valueWithPointer:&anemotaxis_xscreensaver_function_table], @"anemotaxis",
+       [NSValue valueWithPointer:&antinspect_xscreensaver_function_table], @"antinspect",
+       [NSValue valueWithPointer:&antmaze_xscreensaver_function_table], @"antmaze",
+       [NSValue valueWithPointer:&antspotlight_xscreensaver_function_table], @"antspotlight",
+       [NSValue valueWithPointer:&apollonian_xscreensaver_function_table], @"apollonian",
+       [NSValue valueWithPointer:&apple2_xscreensaver_function_table], @"apple2",
+       [NSValue valueWithPointer:&atlantis_xscreensaver_function_table], @"atlantis",
+       [NSValue valueWithPointer:&attraction_xscreensaver_function_table], @"attraction",
+       [NSValue valueWithPointer:&atunnel_xscreensaver_function_table], @"atunnel",
+       [NSValue valueWithPointer:&barcode_xscreensaver_function_table], @"barcode",
+       [NSValue valueWithPointer:&blaster_xscreensaver_function_table], @"blaster",
+       [NSValue valueWithPointer:&blinkbox_xscreensaver_function_table], @"blinkbox",
+       [NSValue valueWithPointer:&blitspin_xscreensaver_function_table], @"blitspin",
+       [NSValue valueWithPointer:&blocktube_xscreensaver_function_table], @"blocktube",
+       [NSValue valueWithPointer:&boing_xscreensaver_function_table], @"boing",
+       [NSValue valueWithPointer:&bouboule_xscreensaver_function_table], @"bouboule",
+       [NSValue valueWithPointer:&bouncingcow_xscreensaver_function_table], @"bouncingcow",
+       [NSValue valueWithPointer:&boxed_xscreensaver_function_table], @"boxed",
+       [NSValue valueWithPointer:&boxfit_xscreensaver_function_table], @"boxfit",
+       [NSValue valueWithPointer:&braid_xscreensaver_function_table], @"braid",
+       [NSValue valueWithPointer:&bsod_xscreensaver_function_table], @"bsod",
+       [NSValue valueWithPointer:&bubble3d_xscreensaver_function_table], @"bubble3d",
+       [NSValue valueWithPointer:&bumps_xscreensaver_function_table], @"bumps",
+       [NSValue valueWithPointer:&cage_xscreensaver_function_table], @"cage",
+       [NSValue valueWithPointer:&carousel_xscreensaver_function_table], @"carousel",
+       [NSValue valueWithPointer:&ccurve_xscreensaver_function_table], @"ccurve",
+       [NSValue valueWithPointer:&celtic_xscreensaver_function_table], @"celtic",
+       [NSValue valueWithPointer:&circuit_xscreensaver_function_table], @"circuit",
+       [NSValue valueWithPointer:&cloudlife_xscreensaver_function_table], @"cloudlife",
+       [NSValue valueWithPointer:&companioncube_xscreensaver_function_table], @"companioncube",
+       [NSValue valueWithPointer:&compass_xscreensaver_function_table], @"compass",
+       [NSValue valueWithPointer:&coral_xscreensaver_function_table], @"coral",
+       [NSValue valueWithPointer:&crackberg_xscreensaver_function_table], @"crackberg",
+       [NSValue valueWithPointer:&crystal_xscreensaver_function_table], @"crystal",
+       [NSValue valueWithPointer:&cube21_xscreensaver_function_table], @"cube21",
+       [NSValue valueWithPointer:&cubenetic_xscreensaver_function_table], @"cubenetic",
+       [NSValue valueWithPointer:&cubestorm_xscreensaver_function_table], @"cubestorm",
+       [NSValue valueWithPointer:&cubicgrid_xscreensaver_function_table], @"cubicgrid",
+       [NSValue valueWithPointer:&cwaves_xscreensaver_function_table], @"cwaves",
+       [NSValue valueWithPointer:&cynosure_xscreensaver_function_table], @"cynosure",
+       [NSValue valueWithPointer:&dangerball_xscreensaver_function_table], @"dangerball",
+       [NSValue valueWithPointer:&decayscreen_xscreensaver_function_table], @"decayscreen",
+       [NSValue valueWithPointer:&deco_xscreensaver_function_table], @"deco",
+       [NSValue valueWithPointer:&deluxe_xscreensaver_function_table], @"deluxe",
+       [NSValue valueWithPointer:&demon_xscreensaver_function_table], @"demon",
+       [NSValue valueWithPointer:&discrete_xscreensaver_function_table], @"discrete",
+       [NSValue valueWithPointer:&distort_xscreensaver_function_table], @"distort",
+       [NSValue valueWithPointer:&dnalogo_xscreensaver_function_table], @"dnalogo",
+       [NSValue valueWithPointer:&drift_xscreensaver_function_table], @"drift",
+       [NSValue valueWithPointer:&endgame_xscreensaver_function_table], @"endgame",
+       [NSValue valueWithPointer:&engine_xscreensaver_function_table], @"engine",
+       [NSValue valueWithPointer:&epicycle_xscreensaver_function_table], @"epicycle",
+       [NSValue valueWithPointer:&eruption_xscreensaver_function_table], @"eruption",
+       [NSValue valueWithPointer:&euler2d_xscreensaver_function_table], @"euler2d",
+       [NSValue valueWithPointer:&fadeplot_xscreensaver_function_table], @"fadeplot",
+       [NSValue valueWithPointer:&fiberlamp_xscreensaver_function_table], @"fiberlamp",
+       [NSValue valueWithPointer:&fireworkx_xscreensaver_function_table], @"fireworkx",
+       [NSValue valueWithPointer:&flame_xscreensaver_function_table], @"flame",
+       [NSValue valueWithPointer:&flipflop_xscreensaver_function_table], @"flipflop",
+       [NSValue valueWithPointer:&flipscreen3d_xscreensaver_function_table], @"flipscreen3d",
+       [NSValue valueWithPointer:&fliptext_xscreensaver_function_table], @"fliptext",
+       [NSValue valueWithPointer:&flow_xscreensaver_function_table], @"flow",
+       [NSValue valueWithPointer:&fluidballs_xscreensaver_function_table], @"fluidballs",
+       [NSValue valueWithPointer:&flyingtoasters_xscreensaver_function_table], @"flyingtoasters",
+       [NSValue valueWithPointer:&fontglide_xscreensaver_function_table], @"fontglide",
+       [NSValue valueWithPointer:&fuzzyflakes_xscreensaver_function_table], @"fuzzyflakes",
+       [NSValue valueWithPointer:&galaxy_xscreensaver_function_table], @"galaxy",
+       [NSValue valueWithPointer:&gears_xscreensaver_function_table], @"gears",
+       [NSValue valueWithPointer:&gflux_xscreensaver_function_table], @"gflux",
+       [NSValue valueWithPointer:&glblur_xscreensaver_function_table], @"glblur",
+       [NSValue valueWithPointer:&glcells_xscreensaver_function_table], @"glcells",
+       [NSValue valueWithPointer:&gleidescope_xscreensaver_function_table], @"gleidescope",
+       [NSValue valueWithPointer:&glhanoi_xscreensaver_function_table], @"glhanoi",
+       [NSValue valueWithPointer:&glknots_xscreensaver_function_table], @"glknots",
+       [NSValue valueWithPointer:&glmatrix_xscreensaver_function_table], @"glmatrix",
+       [NSValue valueWithPointer:&glplanet_xscreensaver_function_table], @"glplanet",
+       [NSValue valueWithPointer:&glschool_xscreensaver_function_table], @"glschool",
+       [NSValue valueWithPointer:&glslideshow_xscreensaver_function_table], @"glslideshow",
+       [NSValue valueWithPointer:&glsnake_xscreensaver_function_table], @"glsnake",
+       [NSValue valueWithPointer:&gltext_xscreensaver_function_table], @"gltext",
+       [NSValue valueWithPointer:&goop_xscreensaver_function_table], @"goop",
+       [NSValue valueWithPointer:&grav_xscreensaver_function_table], @"grav",
+       [NSValue valueWithPointer:&greynetic_xscreensaver_function_table], @"greynetic",
+       [NSValue valueWithPointer:&halftone_xscreensaver_function_table], @"halftone",
+       [NSValue valueWithPointer:&halo_xscreensaver_function_table], @"halo",
+       [NSValue valueWithPointer:&helix_xscreensaver_function_table], @"helix",
+       [NSValue valueWithPointer:&hexadrop_xscreensaver_function_table], @"hexadrop",
+       [NSValue valueWithPointer:&hilbert_xscreensaver_function_table], @"hilbert",
+       [NSValue valueWithPointer:&hopalong_xscreensaver_function_table], @"hopalong",
+       [NSValue valueWithPointer:&hypertorus_xscreensaver_function_table], @"hypertorus",
+       [NSValue valueWithPointer:&hypnowheel_xscreensaver_function_table], @"hypnowheel",
+       [NSValue valueWithPointer:&ifs_xscreensaver_function_table], @"ifs",
+       [NSValue valueWithPointer:&imsmap_xscreensaver_function_table], @"imsmap",
+       [NSValue valueWithPointer:&interaggregate_xscreensaver_function_table], @"interaggregate",
+       [NSValue valueWithPointer:&interference_xscreensaver_function_table], @"interference",
+       [NSValue valueWithPointer:&intermomentary_xscreensaver_function_table], @"intermomentary",
+       [NSValue valueWithPointer:&jigglypuff_xscreensaver_function_table], @"jigglypuff",
+       [NSValue valueWithPointer:&jigsaw_xscreensaver_function_table], @"jigsaw",
+       [NSValue valueWithPointer:&juggler3d_xscreensaver_function_table], @"juggler3d",
+       [NSValue valueWithPointer:&julia_xscreensaver_function_table], @"julia",
+       [NSValue valueWithPointer:&kaleidescope_xscreensaver_function_table], @"kaleidescope",
+       [NSValue valueWithPointer:&kaleidocycle_xscreensaver_function_table], @"kaleidocycle",
+       [NSValue valueWithPointer:&klein_xscreensaver_function_table], @"klein",
+       [NSValue valueWithPointer:&kumppa_xscreensaver_function_table], @"kumppa",
+       [NSValue valueWithPointer:&lament_xscreensaver_function_table], @"lament",
+       [NSValue valueWithPointer:&lavalite_xscreensaver_function_table], @"lavalite",
+       [NSValue valueWithPointer:&loop_xscreensaver_function_table], @"loop",
+       [NSValue valueWithPointer:&m6502_xscreensaver_function_table], @"m6502",
+       [NSValue valueWithPointer:&maze_xscreensaver_function_table], @"maze",
+       [NSValue valueWithPointer:&memscroller_xscreensaver_function_table], @"memscroller",
+       [NSValue valueWithPointer:&menger_xscreensaver_function_table], @"menger",
+       [NSValue valueWithPointer:&metaballs_xscreensaver_function_table], @"metaballs",
+       [NSValue valueWithPointer:&mirrorblob_xscreensaver_function_table], @"mirrorblob",
+       [NSValue valueWithPointer:&moebius_xscreensaver_function_table], @"moebius",
+       [NSValue valueWithPointer:&moebiusgears_xscreensaver_function_table], @"moebiusgears",
+       [NSValue valueWithPointer:&moire_xscreensaver_function_table], @"moire",
+       [NSValue valueWithPointer:&moire2_xscreensaver_function_table], @"moire2",
+       [NSValue valueWithPointer:&molecule_xscreensaver_function_table], @"molecule",
+       [NSValue valueWithPointer:&morph3d_xscreensaver_function_table], @"morph3d",
+       [NSValue valueWithPointer:&mountain_xscreensaver_function_table], @"mountain",
+       [NSValue valueWithPointer:&munch_xscreensaver_function_table], @"munch",
+       [NSValue valueWithPointer:&nerverot_xscreensaver_function_table], @"nerverot",
+       [NSValue valueWithPointer:&noof_xscreensaver_function_table], @"noof",
+       [NSValue valueWithPointer:&noseguy_xscreensaver_function_table], @"noseguy",
+       [NSValue valueWithPointer:&pacman_xscreensaver_function_table], @"pacman",
+       [NSValue valueWithPointer:&pedal_xscreensaver_function_table], @"pedal",
+       [NSValue valueWithPointer:&penetrate_xscreensaver_function_table], @"penetrate",
+       [NSValue valueWithPointer:&penrose_xscreensaver_function_table], @"penrose",
+       [NSValue valueWithPointer:&petri_xscreensaver_function_table], @"petri",
+       [NSValue valueWithPointer:&phosphor_xscreensaver_function_table], @"phosphor",
+       [NSValue valueWithPointer:&photopile_xscreensaver_function_table], @"photopile",
+       [NSValue valueWithPointer:&piecewise_xscreensaver_function_table], @"piecewise",
+       [NSValue valueWithPointer:&pinion_xscreensaver_function_table], @"pinion",
+       [NSValue valueWithPointer:&pipes_xscreensaver_function_table], @"pipes",
+       [NSValue valueWithPointer:&polyhedra_xscreensaver_function_table], @"polyhedra",
+       [NSValue valueWithPointer:&polyominoes_xscreensaver_function_table], @"polyominoes",
+       [NSValue valueWithPointer:&polytopes_xscreensaver_function_table], @"polytopes",
+       [NSValue valueWithPointer:&pong_xscreensaver_function_table], @"pong",
+       [NSValue valueWithPointer:&popsquares_xscreensaver_function_table], @"popsquares",
+       [NSValue valueWithPointer:&providence_xscreensaver_function_table], @"providence",
+       [NSValue valueWithPointer:&pulsar_xscreensaver_function_table], @"pulsar",
+       [NSValue valueWithPointer:&pyro_xscreensaver_function_table], @"pyro",
+       [NSValue valueWithPointer:&qix_xscreensaver_function_table], @"qix",
+       [NSValue valueWithPointer:&quasicrystal_xscreensaver_function_table], @"quasicrystal",
+       [NSValue valueWithPointer:&queens_xscreensaver_function_table], @"queens",
+       [NSValue valueWithPointer:&rdbomb_xscreensaver_function_table], @"rdbomb",
+       [NSValue valueWithPointer:&ripples_xscreensaver_function_table], @"ripples",
+       [NSValue valueWithPointer:&rocks_xscreensaver_function_table], @"rocks",
+       [NSValue valueWithPointer:&rorschach_xscreensaver_function_table], @"rorschach",
+       [NSValue valueWithPointer:&rotzoomer_xscreensaver_function_table], @"rotzoomer",
+       [NSValue valueWithPointer:&rubik_xscreensaver_function_table], @"rubik",
+       [NSValue valueWithPointer:&rubikblocks_xscreensaver_function_table], @"rubikblocks",
+       [NSValue valueWithPointer:&sballs_xscreensaver_function_table], @"sballs",
+       [NSValue valueWithPointer:&shadebobs_xscreensaver_function_table], @"shadebobs",
+       [NSValue valueWithPointer:&sierpinski_xscreensaver_function_table], @"sierpinski",
+       [NSValue valueWithPointer:&sierpinski3d_xscreensaver_function_table], @"sierpinski3d",
+       [NSValue valueWithPointer:&skytentacles_xscreensaver_function_table], @"skytentacles",
+       [NSValue valueWithPointer:&slidescreen_xscreensaver_function_table], @"slidescreen",
+       [NSValue valueWithPointer:&slip_xscreensaver_function_table], @"slip",
+       [NSValue valueWithPointer:&sonar_xscreensaver_function_table], @"sonar",
+       [NSValue valueWithPointer:&speedmine_xscreensaver_function_table], @"speedmine",
+       [NSValue valueWithPointer:&spheremonics_xscreensaver_function_table], @"spheremonics",
+       [NSValue valueWithPointer:&spotlight_xscreensaver_function_table], @"spotlight",
+       [NSValue valueWithPointer:&sproingies_xscreensaver_function_table], @"sproingies",
+       [NSValue valueWithPointer:&squiral_xscreensaver_function_table], @"squiral",
+       [NSValue valueWithPointer:&stairs_xscreensaver_function_table], @"stairs",
+       [NSValue valueWithPointer:&starfish_xscreensaver_function_table], @"starfish",
+       [NSValue valueWithPointer:&starwars_xscreensaver_function_table], @"starwars",
+       [NSValue valueWithPointer:&stonerview_xscreensaver_function_table], @"stonerview",
+       [NSValue valueWithPointer:&strange_xscreensaver_function_table], @"strange",
+       [NSValue valueWithPointer:&substrate_xscreensaver_function_table], @"substrate",
+       [NSValue valueWithPointer:&superquadrics_xscreensaver_function_table], @"superquadrics",
+       [NSValue valueWithPointer:&surfaces_xscreensaver_function_table], @"surfaces",
+       [NSValue valueWithPointer:&swirl_xscreensaver_function_table], @"swirl",
+       [NSValue valueWithPointer:&tangram_xscreensaver_function_table], @"tangram",
+       [NSValue valueWithPointer:&thornbird_xscreensaver_function_table], @"thornbird",
+       [NSValue valueWithPointer:&timetunnel_xscreensaver_function_table], @"timetunnel",
+       [NSValue valueWithPointer:&topblock_xscreensaver_function_table], @"topblock",
+       [NSValue valueWithPointer:&triangle_xscreensaver_function_table], @"triangle",
+       [NSValue valueWithPointer:&tronbit_xscreensaver_function_table], @"tronbit",
+       [NSValue valueWithPointer:&truchet_xscreensaver_function_table], @"truchet",
+       [NSValue valueWithPointer:&twang_xscreensaver_function_table], @"twang",
+       [NSValue valueWithPointer:&unknownpleasures_xscreensaver_function_table], @"unknownpleasures",
+       [NSValue valueWithPointer:&vermiculate_xscreensaver_function_table], @"vermiculate",
+       [NSValue valueWithPointer:&voronoi_xscreensaver_function_table], @"voronoi",
+       [NSValue valueWithPointer:&wander_xscreensaver_function_table], @"wander",
+       [NSValue valueWithPointer:&whirlwindwarp_xscreensaver_function_table], @"whirlwindwarp",
+       [NSValue valueWithPointer:&wormhole_xscreensaver_function_table], @"wormhole",
+       [NSValue valueWithPointer:&xanalogtv_xscreensaver_function_table], @"xanalogtv",
+       [NSValue valueWithPointer:&xflame_xscreensaver_function_table], @"xflame",
+       [NSValue valueWithPointer:&xjack_xscreensaver_function_table], @"xjack",
+       [NSValue valueWithPointer:&xlyap_xscreensaver_function_table], @"xlyap",
+       [NSValue valueWithPointer:&xmatrix_xscreensaver_function_table], @"xmatrix",
+       [NSValue valueWithPointer:&xrayswarm_xscreensaver_function_table], @"xrayswarm",
+       [NSValue valueWithPointer:&xspirograph_xscreensaver_function_table], @"xspirograph",
+       [NSValue valueWithPointer:&zoom_xscreensaver_function_table], @"zoom",
+#endif
+       nil];
+}
+
diff --git a/OSX/ios_function_tables.h b/OSX/ios_function_tables.h
deleted file mode 100644 (file)
index 5854587..0000000
+++ /dev/null
@@ -1,396 +0,0 @@
-extern struct xscreensaver_function_table
- *abstractile_xscreensaver_function_table,
- *anemone_xscreensaver_function_table,
- *anemotaxis_xscreensaver_function_table,
- *antinspect_xscreensaver_function_table,
- *antmaze_xscreensaver_function_table,
- *antspotlight_xscreensaver_function_table,
- *apollonian_xscreensaver_function_table,
- *apple2_xscreensaver_function_table,
- *atlantis_xscreensaver_function_table,
- *attraction_xscreensaver_function_table,
- *atunnel_xscreensaver_function_table,
- *barcode_xscreensaver_function_table,
- *blaster_xscreensaver_function_table,
- *blinkbox_xscreensaver_function_table,
- *blitspin_xscreensaver_function_table,
- *blocktube_xscreensaver_function_table,
- *boing_xscreensaver_function_table,
- *bouboule_xscreensaver_function_table,
- *bouncingcow_xscreensaver_function_table,
- *boxed_xscreensaver_function_table,
- *boxfit_xscreensaver_function_table,
- *braid_xscreensaver_function_table,
- *bsod_xscreensaver_function_table,
- *bubble3d_xscreensaver_function_table,
- *bumps_xscreensaver_function_table,
- *cage_xscreensaver_function_table,
- *carousel_xscreensaver_function_table,
- *ccurve_xscreensaver_function_table,
- *celtic_xscreensaver_function_table,
- *circuit_xscreensaver_function_table,
- *cloudlife_xscreensaver_function_table,
- *companioncube_xscreensaver_function_table,
- *compass_xscreensaver_function_table,
- *coral_xscreensaver_function_table,
- *crackberg_xscreensaver_function_table,
- *crystal_xscreensaver_function_table,
- *cube21_xscreensaver_function_table,
- *cubenetic_xscreensaver_function_table,
- *cubestorm_xscreensaver_function_table,
- *cubicgrid_xscreensaver_function_table,
- *cwaves_xscreensaver_function_table,
- *cynosure_xscreensaver_function_table,
- *dangerball_xscreensaver_function_table,
- *decayscreen_xscreensaver_function_table,
- *deco_xscreensaver_function_table,
- *deluxe_xscreensaver_function_table,
- *demon_xscreensaver_function_table,
- *discrete_xscreensaver_function_table,
- *distort_xscreensaver_function_table,
- *dnalogo_xscreensaver_function_table,
- *drift_xscreensaver_function_table,
- *endgame_xscreensaver_function_table,
- *engine_xscreensaver_function_table,
- *epicycle_xscreensaver_function_table,
- *eruption_xscreensaver_function_table,
- *euler2d_xscreensaver_function_table,
- *fadeplot_xscreensaver_function_table,
- *fiberlamp_xscreensaver_function_table,
- *fireworkx_xscreensaver_function_table,
- *flame_xscreensaver_function_table,
- *flipflop_xscreensaver_function_table,
- *flipscreen3d_xscreensaver_function_table,
- *fliptext_xscreensaver_function_table,
- *flow_xscreensaver_function_table,
- *fluidballs_xscreensaver_function_table,
- *flyingtoasters_xscreensaver_function_table,
- *fontglide_xscreensaver_function_table,
- *fuzzyflakes_xscreensaver_function_table,
- *galaxy_xscreensaver_function_table,
- *gears_xscreensaver_function_table,
- *gflux_xscreensaver_function_table,
- *glblur_xscreensaver_function_table,
- *glcells_xscreensaver_function_table,
- *gleidescope_xscreensaver_function_table,
- *glhanoi_xscreensaver_function_table,
- *glknots_xscreensaver_function_table,
- *glmatrix_xscreensaver_function_table,
- *glplanet_xscreensaver_function_table,
- *glschool_xscreensaver_function_table,
- *glslideshow_xscreensaver_function_table,
- *glsnake_xscreensaver_function_table,
- *gltext_xscreensaver_function_table,
- *goop_xscreensaver_function_table,
- *grav_xscreensaver_function_table,
- *greynetic_xscreensaver_function_table,
- *halftone_xscreensaver_function_table,
- *halo_xscreensaver_function_table,
- *helix_xscreensaver_function_table,
- *hilbert_xscreensaver_function_table,
- *hopalong_xscreensaver_function_table,
- *hypertorus_xscreensaver_function_table,
- *hypnowheel_xscreensaver_function_table,
- *ifs_xscreensaver_function_table,
- *imsmap_xscreensaver_function_table,
- *interaggregate_xscreensaver_function_table,
- *interference_xscreensaver_function_table,
- *intermomentary_xscreensaver_function_table,
- *jigglypuff_xscreensaver_function_table,
- *jigsaw_xscreensaver_function_table,
- *juggler3d_xscreensaver_function_table,
- *julia_xscreensaver_function_table,
- *kaleidescope_xscreensaver_function_table,
- *klein_xscreensaver_function_table,
- *kumppa_xscreensaver_function_table,
- *lament_xscreensaver_function_table,
- *lavalite_xscreensaver_function_table,
- *loop_xscreensaver_function_table,
- *m6502_xscreensaver_function_table,
- *maze_xscreensaver_function_table,
- *memscroller_xscreensaver_function_table,
- *menger_xscreensaver_function_table,
- *metaballs_xscreensaver_function_table,
- *mirrorblob_xscreensaver_function_table,
- *moebius_xscreensaver_function_table,
- *moebiusgears_xscreensaver_function_table,
- *moire_xscreensaver_function_table,
- *moire2_xscreensaver_function_table,
- *molecule_xscreensaver_function_table,
- *morph3d_xscreensaver_function_table,
- *mountain_xscreensaver_function_table,
- *munch_xscreensaver_function_table,
- *nerverot_xscreensaver_function_table,
- *noof_xscreensaver_function_table,
- *noseguy_xscreensaver_function_table,
- *pacman_xscreensaver_function_table,
- *pedal_xscreensaver_function_table,
- *penetrate_xscreensaver_function_table,
- *penrose_xscreensaver_function_table,
- *petri_xscreensaver_function_table,
- *phosphor_xscreensaver_function_table,
- *photopile_xscreensaver_function_table,
- *piecewise_xscreensaver_function_table,
- *pinion_xscreensaver_function_table,
- *pipes_xscreensaver_function_table,
- *polyhedra_xscreensaver_function_table,
- *polyominoes_xscreensaver_function_table,
- *polytopes_xscreensaver_function_table,
- *pong_xscreensaver_function_table,
- *popsquares_xscreensaver_function_table,
- *providence_xscreensaver_function_table,
- *pulsar_xscreensaver_function_table,
- *pyro_xscreensaver_function_table,
- *qix_xscreensaver_function_table,
- *queens_xscreensaver_function_table,
- *rdbomb_xscreensaver_function_table,
- *ripples_xscreensaver_function_table,
- *rocks_xscreensaver_function_table,
- *rorschach_xscreensaver_function_table,
- *rotzoomer_xscreensaver_function_table,
- *rubik_xscreensaver_function_table,
- *rubikblocks_xscreensaver_function_table,
- *sballs_xscreensaver_function_table,
- *shadebobs_xscreensaver_function_table,
- *sierpinski_xscreensaver_function_table,
- *sierpinski3d_xscreensaver_function_table,
- *skytentacles_xscreensaver_function_table,
- *slidescreen_xscreensaver_function_table,
- *slip_xscreensaver_function_table,
- *sonar_xscreensaver_function_table,
- *speedmine_xscreensaver_function_table,
- *spheremonics_xscreensaver_function_table,
- *spotlight_xscreensaver_function_table,
- *sproingies_xscreensaver_function_table,
- *squiral_xscreensaver_function_table,
- *stairs_xscreensaver_function_table,
- *starfish_xscreensaver_function_table,
- *starwars_xscreensaver_function_table,
- *stonerview_xscreensaver_function_table,
- *strange_xscreensaver_function_table,
- *substrate_xscreensaver_function_table,
- *superquadrics_xscreensaver_function_table,
- *surfaces_xscreensaver_function_table,
- *swirl_xscreensaver_function_table,
- *tangram_xscreensaver_function_table,
- *thornbird_xscreensaver_function_table,
- *timetunnel_xscreensaver_function_table,
- *topblock_xscreensaver_function_table,
- *triangle_xscreensaver_function_table,
- *tronbit_xscreensaver_function_table,
- *truchet_xscreensaver_function_table,
- *twang_xscreensaver_function_table,
- *vermiculate_xscreensaver_function_table,
- *voronoi_xscreensaver_function_table,
- *wander_xscreensaver_function_table,
- *whirlwindwarp_xscreensaver_function_table,
- *wormhole_xscreensaver_function_table,
- *xanalogtv_xscreensaver_function_table,
- *xflame_xscreensaver_function_table,
- *xjack_xscreensaver_function_table,
- *xlyap_xscreensaver_function_table,
- *xmatrix_xscreensaver_function_table,
- *xrayswarm_xscreensaver_function_table,
- *xspirograph_xscreensaver_function_table,
- *zoom_xscreensaver_function_table;
-
-static NSDictionary *make_function_tables_dict(void)
-{
-  return
-    [NSDictionary dictionaryWithObjectsAndKeys:
-       [NSValue valueWithPointer:&abstractile_xscreensaver_function_table], @"abstractile",
-       [NSValue valueWithPointer:&anemone_xscreensaver_function_table], @"anemone",
-       [NSValue valueWithPointer:&anemotaxis_xscreensaver_function_table], @"anemotaxis",
-       [NSValue valueWithPointer:&antinspect_xscreensaver_function_table], @"antinspect",
-       [NSValue valueWithPointer:&antmaze_xscreensaver_function_table], @"antmaze",
-       [NSValue valueWithPointer:&antspotlight_xscreensaver_function_table], @"antspotlight",
-       [NSValue valueWithPointer:&apollonian_xscreensaver_function_table], @"apollonian",
-       [NSValue valueWithPointer:&apple2_xscreensaver_function_table], @"apple2",
-       [NSValue valueWithPointer:&atlantis_xscreensaver_function_table], @"atlantis",
-       [NSValue valueWithPointer:&attraction_xscreensaver_function_table], @"attraction",
-       [NSValue valueWithPointer:&atunnel_xscreensaver_function_table], @"atunnel",
-       [NSValue valueWithPointer:&barcode_xscreensaver_function_table], @"barcode",
-       [NSValue valueWithPointer:&blaster_xscreensaver_function_table], @"blaster",
-       [NSValue valueWithPointer:&blinkbox_xscreensaver_function_table], @"blinkbox",
-       [NSValue valueWithPointer:&blitspin_xscreensaver_function_table], @"blitspin",
-       [NSValue valueWithPointer:&blocktube_xscreensaver_function_table], @"blocktube",
-       [NSValue valueWithPointer:&boing_xscreensaver_function_table], @"boing",
-       [NSValue valueWithPointer:&bouboule_xscreensaver_function_table], @"bouboule",
-       [NSValue valueWithPointer:&bouncingcow_xscreensaver_function_table], @"bouncingcow",
-       [NSValue valueWithPointer:&boxed_xscreensaver_function_table], @"boxed",
-       [NSValue valueWithPointer:&boxfit_xscreensaver_function_table], @"boxfit",
-       [NSValue valueWithPointer:&braid_xscreensaver_function_table], @"braid",
-       [NSValue valueWithPointer:&bsod_xscreensaver_function_table], @"bsod",
-       [NSValue valueWithPointer:&bubble3d_xscreensaver_function_table], @"bubble3d",
-       [NSValue valueWithPointer:&bumps_xscreensaver_function_table], @"bumps",
-       [NSValue valueWithPointer:&cage_xscreensaver_function_table], @"cage",
-       [NSValue valueWithPointer:&carousel_xscreensaver_function_table], @"carousel",
-       [NSValue valueWithPointer:&ccurve_xscreensaver_function_table], @"ccurve",
-       [NSValue valueWithPointer:&celtic_xscreensaver_function_table], @"celtic",
-       [NSValue valueWithPointer:&circuit_xscreensaver_function_table], @"circuit",
-       [NSValue valueWithPointer:&cloudlife_xscreensaver_function_table], @"cloudlife",
-       [NSValue valueWithPointer:&companioncube_xscreensaver_function_table], @"companioncube",
-       [NSValue valueWithPointer:&compass_xscreensaver_function_table], @"compass",
-       [NSValue valueWithPointer:&coral_xscreensaver_function_table], @"coral",
-       [NSValue valueWithPointer:&crackberg_xscreensaver_function_table], @"crackberg",
-       [NSValue valueWithPointer:&crystal_xscreensaver_function_table], @"crystal",
-       [NSValue valueWithPointer:&cube21_xscreensaver_function_table], @"cube21",
-       [NSValue valueWithPointer:&cubenetic_xscreensaver_function_table], @"cubenetic",
-       [NSValue valueWithPointer:&cubestorm_xscreensaver_function_table], @"cubestorm",
-       [NSValue valueWithPointer:&cubicgrid_xscreensaver_function_table], @"cubicgrid",
-       [NSValue valueWithPointer:&cwaves_xscreensaver_function_table], @"cwaves",
-       [NSValue valueWithPointer:&cynosure_xscreensaver_function_table], @"cynosure",
-       [NSValue valueWithPointer:&dangerball_xscreensaver_function_table], @"dangerball",
-       [NSValue valueWithPointer:&decayscreen_xscreensaver_function_table], @"decayscreen",
-       [NSValue valueWithPointer:&deco_xscreensaver_function_table], @"deco",
-       [NSValue valueWithPointer:&deluxe_xscreensaver_function_table], @"deluxe",
-       [NSValue valueWithPointer:&demon_xscreensaver_function_table], @"demon",
-       [NSValue valueWithPointer:&discrete_xscreensaver_function_table], @"discrete",
-       [NSValue valueWithPointer:&distort_xscreensaver_function_table], @"distort",
-       [NSValue valueWithPointer:&dnalogo_xscreensaver_function_table], @"dnalogo",
-       [NSValue valueWithPointer:&drift_xscreensaver_function_table], @"drift",
-       [NSValue valueWithPointer:&endgame_xscreensaver_function_table], @"endgame",
-       [NSValue valueWithPointer:&engine_xscreensaver_function_table], @"engine",
-       [NSValue valueWithPointer:&epicycle_xscreensaver_function_table], @"epicycle",
-       [NSValue valueWithPointer:&eruption_xscreensaver_function_table], @"eruption",
-       [NSValue valueWithPointer:&euler2d_xscreensaver_function_table], @"euler2d",
-       [NSValue valueWithPointer:&fadeplot_xscreensaver_function_table], @"fadeplot",
-       [NSValue valueWithPointer:&fiberlamp_xscreensaver_function_table], @"fiberlamp",
-       [NSValue valueWithPointer:&fireworkx_xscreensaver_function_table], @"fireworkx",
-       [NSValue valueWithPointer:&flame_xscreensaver_function_table], @"flame",
-       [NSValue valueWithPointer:&flipflop_xscreensaver_function_table], @"flipflop",
-       [NSValue valueWithPointer:&flipscreen3d_xscreensaver_function_table], @"flipscreen3d",
-       [NSValue valueWithPointer:&fliptext_xscreensaver_function_table], @"fliptext",
-       [NSValue valueWithPointer:&flow_xscreensaver_function_table], @"flow",
-       [NSValue valueWithPointer:&fluidballs_xscreensaver_function_table], @"fluidballs",
-       [NSValue valueWithPointer:&flyingtoasters_xscreensaver_function_table], @"flyingtoasters",
-       [NSValue valueWithPointer:&fontglide_xscreensaver_function_table], @"fontglide",
-       [NSValue valueWithPointer:&fuzzyflakes_xscreensaver_function_table], @"fuzzyflakes",
-       [NSValue valueWithPointer:&galaxy_xscreensaver_function_table], @"galaxy",
-       [NSValue valueWithPointer:&gears_xscreensaver_function_table], @"gears",
-       [NSValue valueWithPointer:&gflux_xscreensaver_function_table], @"gflux",
-       [NSValue valueWithPointer:&glblur_xscreensaver_function_table], @"glblur",
-       [NSValue valueWithPointer:&glcells_xscreensaver_function_table], @"glcells",
-       [NSValue valueWithPointer:&gleidescope_xscreensaver_function_table], @"gleidescope",
-       [NSValue valueWithPointer:&glhanoi_xscreensaver_function_table], @"glhanoi",
-       [NSValue valueWithPointer:&glknots_xscreensaver_function_table], @"glknots",
-       [NSValue valueWithPointer:&glmatrix_xscreensaver_function_table], @"glmatrix",
-       [NSValue valueWithPointer:&glplanet_xscreensaver_function_table], @"glplanet",
-       [NSValue valueWithPointer:&glschool_xscreensaver_function_table], @"glschool",
-       [NSValue valueWithPointer:&glslideshow_xscreensaver_function_table], @"glslideshow",
-       [NSValue valueWithPointer:&glsnake_xscreensaver_function_table], @"glsnake",
-       [NSValue valueWithPointer:&gltext_xscreensaver_function_table], @"gltext",
-       [NSValue valueWithPointer:&goop_xscreensaver_function_table], @"goop",
-       [NSValue valueWithPointer:&grav_xscreensaver_function_table], @"grav",
-       [NSValue valueWithPointer:&greynetic_xscreensaver_function_table], @"greynetic",
-       [NSValue valueWithPointer:&halftone_xscreensaver_function_table], @"halftone",
-       [NSValue valueWithPointer:&halo_xscreensaver_function_table], @"halo",
-       [NSValue valueWithPointer:&helix_xscreensaver_function_table], @"helix",
-       [NSValue valueWithPointer:&hilbert_xscreensaver_function_table], @"hilbert",
-       [NSValue valueWithPointer:&hopalong_xscreensaver_function_table], @"hopalong",
-       [NSValue valueWithPointer:&hypertorus_xscreensaver_function_table], @"hypertorus",
-       [NSValue valueWithPointer:&hypnowheel_xscreensaver_function_table], @"hypnowheel",
-       [NSValue valueWithPointer:&ifs_xscreensaver_function_table], @"ifs",
-       [NSValue valueWithPointer:&imsmap_xscreensaver_function_table], @"imsmap",
-       [NSValue valueWithPointer:&interaggregate_xscreensaver_function_table], @"interaggregate",
-       [NSValue valueWithPointer:&interference_xscreensaver_function_table], @"interference",
-       [NSValue valueWithPointer:&intermomentary_xscreensaver_function_table], @"intermomentary",
-       [NSValue valueWithPointer:&jigglypuff_xscreensaver_function_table], @"jigglypuff",
-       [NSValue valueWithPointer:&jigsaw_xscreensaver_function_table], @"jigsaw",
-       [NSValue valueWithPointer:&juggler3d_xscreensaver_function_table], @"juggler3d",
-       [NSValue valueWithPointer:&julia_xscreensaver_function_table], @"julia",
-       [NSValue valueWithPointer:&kaleidescope_xscreensaver_function_table], @"kaleidescope",
-       [NSValue valueWithPointer:&klein_xscreensaver_function_table], @"klein",
-       [NSValue valueWithPointer:&kumppa_xscreensaver_function_table], @"kumppa",
-       [NSValue valueWithPointer:&lament_xscreensaver_function_table], @"lament",
-       [NSValue valueWithPointer:&lavalite_xscreensaver_function_table], @"lavalite",
-       [NSValue valueWithPointer:&loop_xscreensaver_function_table], @"loop",
-       [NSValue valueWithPointer:&m6502_xscreensaver_function_table], @"m6502",
-       [NSValue valueWithPointer:&maze_xscreensaver_function_table], @"maze",
-       [NSValue valueWithPointer:&memscroller_xscreensaver_function_table], @"memscroller",
-       [NSValue valueWithPointer:&menger_xscreensaver_function_table], @"menger",
-       [NSValue valueWithPointer:&metaballs_xscreensaver_function_table], @"metaballs",
-       [NSValue valueWithPointer:&mirrorblob_xscreensaver_function_table], @"mirrorblob",
-       [NSValue valueWithPointer:&moebius_xscreensaver_function_table], @"moebius",
-       [NSValue valueWithPointer:&moebiusgears_xscreensaver_function_table], @"moebiusgears",
-       [NSValue valueWithPointer:&moire_xscreensaver_function_table], @"moire",
-       [NSValue valueWithPointer:&moire2_xscreensaver_function_table], @"moire2",
-       [NSValue valueWithPointer:&molecule_xscreensaver_function_table], @"molecule",
-       [NSValue valueWithPointer:&morph3d_xscreensaver_function_table], @"morph3d",
-       [NSValue valueWithPointer:&mountain_xscreensaver_function_table], @"mountain",
-       [NSValue valueWithPointer:&munch_xscreensaver_function_table], @"munch",
-       [NSValue valueWithPointer:&nerverot_xscreensaver_function_table], @"nerverot",
-       [NSValue valueWithPointer:&noof_xscreensaver_function_table], @"noof",
-       [NSValue valueWithPointer:&noseguy_xscreensaver_function_table], @"noseguy",
-       [NSValue valueWithPointer:&pacman_xscreensaver_function_table], @"pacman",
-       [NSValue valueWithPointer:&pedal_xscreensaver_function_table], @"pedal",
-       [NSValue valueWithPointer:&penetrate_xscreensaver_function_table], @"penetrate",
-       [NSValue valueWithPointer:&penrose_xscreensaver_function_table], @"penrose",
-       [NSValue valueWithPointer:&petri_xscreensaver_function_table], @"petri",
-       [NSValue valueWithPointer:&phosphor_xscreensaver_function_table], @"phosphor",
-       [NSValue valueWithPointer:&photopile_xscreensaver_function_table], @"photopile",
-       [NSValue valueWithPointer:&piecewise_xscreensaver_function_table], @"piecewise",
-       [NSValue valueWithPointer:&pinion_xscreensaver_function_table], @"pinion",
-       [NSValue valueWithPointer:&pipes_xscreensaver_function_table], @"pipes",
-       [NSValue valueWithPointer:&polyhedra_xscreensaver_function_table], @"polyhedra",
-       [NSValue valueWithPointer:&polyominoes_xscreensaver_function_table], @"polyominoes",
-       [NSValue valueWithPointer:&polytopes_xscreensaver_function_table], @"polytopes",
-       [NSValue valueWithPointer:&pong_xscreensaver_function_table], @"pong",
-       [NSValue valueWithPointer:&popsquares_xscreensaver_function_table], @"popsquares",
-       [NSValue valueWithPointer:&providence_xscreensaver_function_table], @"providence",
-       [NSValue valueWithPointer:&pulsar_xscreensaver_function_table], @"pulsar",
-       [NSValue valueWithPointer:&pyro_xscreensaver_function_table], @"pyro",
-       [NSValue valueWithPointer:&qix_xscreensaver_function_table], @"qix",
-       [NSValue valueWithPointer:&queens_xscreensaver_function_table], @"queens",
-       [NSValue valueWithPointer:&rdbomb_xscreensaver_function_table], @"rdbomb",
-       [NSValue valueWithPointer:&ripples_xscreensaver_function_table], @"ripples",
-       [NSValue valueWithPointer:&rocks_xscreensaver_function_table], @"rocks",
-       [NSValue valueWithPointer:&rorschach_xscreensaver_function_table], @"rorschach",
-       [NSValue valueWithPointer:&rotzoomer_xscreensaver_function_table], @"rotzoomer",
-       [NSValue valueWithPointer:&rubik_xscreensaver_function_table], @"rubik",
-       [NSValue valueWithPointer:&rubikblocks_xscreensaver_function_table], @"rubikblocks",
-       [NSValue valueWithPointer:&sballs_xscreensaver_function_table], @"sballs",
-       [NSValue valueWithPointer:&shadebobs_xscreensaver_function_table], @"shadebobs",
-       [NSValue valueWithPointer:&sierpinski_xscreensaver_function_table], @"sierpinski",
-       [NSValue valueWithPointer:&sierpinski3d_xscreensaver_function_table], @"sierpinski3d",
-       [NSValue valueWithPointer:&skytentacles_xscreensaver_function_table], @"skytentacles",
-       [NSValue valueWithPointer:&slidescreen_xscreensaver_function_table], @"slidescreen",
-       [NSValue valueWithPointer:&slip_xscreensaver_function_table], @"slip",
-       [NSValue valueWithPointer:&sonar_xscreensaver_function_table], @"sonar",
-       [NSValue valueWithPointer:&speedmine_xscreensaver_function_table], @"speedmine",
-       [NSValue valueWithPointer:&spheremonics_xscreensaver_function_table], @"spheremonics",
-       [NSValue valueWithPointer:&spotlight_xscreensaver_function_table], @"spotlight",
-       [NSValue valueWithPointer:&sproingies_xscreensaver_function_table], @"sproingies",
-       [NSValue valueWithPointer:&squiral_xscreensaver_function_table], @"squiral",
-       [NSValue valueWithPointer:&stairs_xscreensaver_function_table], @"stairs",
-       [NSValue valueWithPointer:&starfish_xscreensaver_function_table], @"starfish",
-       [NSValue valueWithPointer:&starwars_xscreensaver_function_table], @"starwars",
-       [NSValue valueWithPointer:&stonerview_xscreensaver_function_table], @"stonerview",
-       [NSValue valueWithPointer:&strange_xscreensaver_function_table], @"strange",
-       [NSValue valueWithPointer:&substrate_xscreensaver_function_table], @"substrate",
-       [NSValue valueWithPointer:&superquadrics_xscreensaver_function_table], @"superquadrics",
-       [NSValue valueWithPointer:&surfaces_xscreensaver_function_table], @"surfaces",
-       [NSValue valueWithPointer:&swirl_xscreensaver_function_table], @"swirl",
-       [NSValue valueWithPointer:&tangram_xscreensaver_function_table], @"tangram",
-       [NSValue valueWithPointer:&thornbird_xscreensaver_function_table], @"thornbird",
-       [NSValue valueWithPointer:&timetunnel_xscreensaver_function_table], @"timetunnel",
-       [NSValue valueWithPointer:&topblock_xscreensaver_function_table], @"topblock",
-       [NSValue valueWithPointer:&triangle_xscreensaver_function_table], @"triangle",
-       [NSValue valueWithPointer:&tronbit_xscreensaver_function_table], @"tronbit",
-       [NSValue valueWithPointer:&truchet_xscreensaver_function_table], @"truchet",
-       [NSValue valueWithPointer:&twang_xscreensaver_function_table], @"twang",
-       [NSValue valueWithPointer:&vermiculate_xscreensaver_function_table], @"vermiculate",
-       [NSValue valueWithPointer:&voronoi_xscreensaver_function_table], @"voronoi",
-       [NSValue valueWithPointer:&wander_xscreensaver_function_table], @"wander",
-       [NSValue valueWithPointer:&whirlwindwarp_xscreensaver_function_table], @"whirlwindwarp",
-       [NSValue valueWithPointer:&wormhole_xscreensaver_function_table], @"wormhole",
-       [NSValue valueWithPointer:&xanalogtv_xscreensaver_function_table], @"xanalogtv",
-       [NSValue valueWithPointer:&xflame_xscreensaver_function_table], @"xflame",
-       [NSValue valueWithPointer:&xjack_xscreensaver_function_table], @"xjack",
-       [NSValue valueWithPointer:&xlyap_xscreensaver_function_table], @"xlyap",
-       [NSValue valueWithPointer:&xmatrix_xscreensaver_function_table], @"xmatrix",
-       [NSValue valueWithPointer:&xrayswarm_xscreensaver_function_table], @"xrayswarm",
-       [NSValue valueWithPointer:&xspirograph_xscreensaver_function_table], @"xspirograph",
-       [NSValue valueWithPointer:&zoom_xscreensaver_function_table], @"zoom",
-       nil];
-}
diff --git a/OSX/phosphor-app.xml b/OSX/phosphor-app.xml
new file mode 100644 (file)
index 0000000..7f10d5a
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="phosphor" _label="Phosphor">
+
+ <command arg="-root"/>
+
+ <hgroup>
+  <vgroup>
+   <number id="delay" type="slider" arg="-delay %"
+           _label="Frame rate" _low-label="Low" _high-label="High"
+           low="0" high="100000" default="50000"
+           convert="invert"/>
+
+   <number id="scale" type="spinbutton" arg="-scale %"
+           _label="Font scale" low="1" high="20" default="6"/>
+
+   <number id="fade" type="slider" arg="-ticks %"
+           _label="Fade" _low-label="Slow" _high-label="Fast"
+           low="1" high="100" default="20"
+           convert="invert"/>
+  </vgroup>
+ </hgroup>
+
+  <_description>
+A fully-functional VT100 terminal emulator simulating an old terminal,
+with large pixels and long-sustain phosphor.
+
+Written by Jamie Zawinski; 1999.
+  </_description>
+</screensaver>
index ce17e1cdbb4edaf1a03e5de273dc638c08b49faa..ec8981a1ac759d3b578f044a6d6e579d3b7e53ae 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/perl -w
-# Copyright Â© 2006-2013 Jamie Zawinski <jwz@jwz.org>
+# Copyright Ã‚© 2006-2013 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
@@ -24,7 +24,7 @@ use strict;
 
 my ($exec_dir, $progname) = ($0 =~ m@^(.*?)/([^/]+)$@);
 
-my $version = q{ $Revision: 1.23 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.24 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 
 $ENV{PATH} = "/usr/local/bin:$ENV{PATH}";   # for seticon
 
@@ -47,6 +47,7 @@ sub read_info_plist($) {
   } else {
     error ("$file: $!");
   }
+  print STDERR "$progname: read $file\n" if ($verbose > 2);
   local $/ = undef;  # read entire file
   my $body = <$in>;
   close $in;
@@ -82,6 +83,7 @@ sub read_saver_xml($) {
   } else {
     error ("$file: $!");
   }
+  print STDERR "$progname: read $file\n" if ($verbose > 2);
   local $/ = undef;  # read entire file
   my $body = <$in>;
   close $in;
index 407cc8f2fe351ac283f71c725c52177612b6a516..0df5d1f72ac7eea19fb0ebdf47a6878eb6d3d34f 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/perl -w
-# Copyright Â© 2006-2012 Jamie Zawinski <jwz@jwz.org>
+# Copyright Â© 2006-2013 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
@@ -18,10 +18,12 @@ require 5;
 use strict;
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.1 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.2 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 
 my $verbose = 1;
 
+$ENV{PATH} = "/opt/local/bin:$ENV{PATH}";   # MacPorts, for ImageMagick
+
 
 sub safe_system(@) {
   my @cmd = @_;
diff --git a/README b/README
index 0b7de8bcadd449348cfe60eb05789454bbb5283e..1e98c0a8e11c08fd56726f7a7862c069ae1d4c03 100644 (file)
--- a/README
+++ b/README
@@ -38,6 +38,20 @@ XScreenSaver has an extensive manual -- please read it!
 
 ===============================================================================
 
+Changes since 5.21:   * New hacks, `kaleidocycle', `quasicrystal',
+                        `unknownpleasures' and `hexadrop'.
+                      * Performance improvements for `interference'.
+                      * Fixed possible crashes in `apple2', `maze', `pacman',
+                        `polyominoes', `fireworkx', `engine'.
+                      * Fix for `bumps' in 64 bit.
+                      * Fixed preferences crash on old iOS 5 devices.
+                      * Fixed "Shake to Randomize"; display name of saver.
+                      * Fixed weirdness with "Frame Rate" sliders on iOS.
+                      * Fixed rotation problems with `pacman', `decayscreen'.
+                      * Better dragging in `fluidballs'.
+                      * Ignore rotation in hacks that don't benefit from it.
+                      * Ignore DEACTIVATE messages when locked, instead of
+                        popping up the password dialog box.
 Changes since 5.20:   * Changed default text source from Twitter to Wikipedia,
                         since Twitter now requires a login to get any feeds.
                       * New version of `fireworkx'.
index 12d49d2392fa1fe0d807b3b2183b059503adf3ab..9ab4425d3ba9ea9e7288e75bd5071741a29725c2 100644 (file)
@@ -4,8 +4,8 @@
 !            a screen saver and locker for the X window system
 !                            by Jamie Zawinski
 !
-!                              version 5.21
-!                              04-Feb-2013
+!                              version 5.22
+!                              16-Jul-2013
 !
 ! See "man xscreensaver" for more info.  The latest version is always
 ! available at http://www.jwz.org/xscreensaver/
@@ -355,7 +355,11 @@ GetViewPortIsFullOfLies: False
 @GL_KLUDGE@ GL:                                rubikblocks -root                           \n\
 @GL_KLUDGE@ GL:                                companioncube -root                         \n\
 @GL_KLUDGE@ GL:                                hilbert -root                               \n\
-@GL_KLUDGE@ GL:                                tronbit -root                               \n
+@GL_KLUDGE@ GL:                                tronbit -root                               \n\
+                               hexadrop -root                              \n\
+@GL_KLUDGE@ GL:                                kaleidocycle -root                          \n\
+@GL_KLUDGE@ GL:                                quasicrystal -root                          \n\
+@GL_KLUDGE@ GL:                                unknownpleasures -root                      \n
 
 
 
@@ -474,6 +478,7 @@ XScreenSaver.bourneShell:           /bin/sh
 *hacks.nerverot.name:       NerveRot
 *hacks.noseguy.name:        NoseGuy
 *hacks.popsquares.name:     PopSquares
+*hacks.quasicrystal.name:   QuasiCrystal
 *hacks.rd-bomb.name:        RDbomb
 *hacks.rdbomb.name:         RDbomb
 *hacks.rotzoomer.name:      RotZoomer
@@ -490,6 +495,7 @@ XScreenSaver.bourneShell:           /bin/sh
 *hacks.timetunnel.name:     TimeTunnel
 *hacks.topblock.name:       TopBlock
 *hacks.tronbit.name:        TronBit
+*hacks.unknownpleasures.name:UnknownPleasures
 *hacks.vidwhacker.name:     VidWhacker
 *hacks.webcollage.name:     WebCollage
 *hacks.whirlwindwarp.name:  WhirlWindWarp
index 3b6b133b66032394f07e49da3538727fece4bdc3..4c9d55f27c7256d1d0585befcc53ce6cb4d92a4e 100644 (file)
   GL:                          rubikblocks -root                           \\n\
   GL:                          companioncube -root                         \\n\
   GL:                          hilbert -root                               \\n\
-  GL:                          tronbit -root                               \\n",
+  GL:                          tronbit -root                               \\n\
+                               hexadrop -root                              \\n\
+  GL:                          kaleidocycle -root                          \\n\
+  GL:                          quasicrystal -root                          \\n\
+  GL:                          unknownpleasures -root                      \\n",
 "XScreenSaver.pointerPollTime:         0:00:05",
 "XScreenSaver.pointerHysteresis:               10",
 "XScreenSaver.initialDelay:            0:00:00",
 "*hacks.nerverot.name:       NerveRot",
 "*hacks.noseguy.name:        NoseGuy",
 "*hacks.popsquares.name:     PopSquares",
+"*hacks.quasicrystal.name:   QuasiCrystal",
 "*hacks.rd-bomb.name:        RDbomb",
 "*hacks.rdbomb.name:         RDbomb",
 "*hacks.rotzoomer.name:      RotZoomer",
 "*hacks.timetunnel.name:     TimeTunnel",
 "*hacks.topblock.name:       TopBlock",
 "*hacks.tronbit.name:        TronBit",
+"*hacks.unknownpleasures.name:UnknownPleasures",
 "*hacks.vidwhacker.name:     VidWhacker",
 "*hacks.webcollage.name:     WebCollage",
 "*hacks.whirlwindwarp.name:  WhirlWindWarp",
index 5da53a01831a406d07f947edd08a6399c4ce06fc..38ca88a0f26c687b5c55ba63b9515f8750e5fae9 100644 (file)
@@ -1,5 +1,5 @@
 /* exec.c --- executes a program in *this* pid, without an intervening process.
- * xscreensaver, Copyright (c) 1991-2008 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1991-2013 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
@@ -286,6 +286,7 @@ on_path_p (const char *program)
       strcat (p2, "/");
       strcat (p2, cmd);
       result = (0 == stat (p2, &st));
+      free (p2);
       if (result)
         goto DONE;
       token = strtok (0, ":");
index cc61a08d86f69ae796b52d8542bc734f1b6f10ba..7b45988de5f0e49eb97261b4c002416c570ac9c2 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/perl -w
-# Copyright Â© 2001-2012 Jamie Zawinski <jwz@jwz.org>.
+# Copyright Â© 2001-2013 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
@@ -57,7 +57,7 @@ BEGIN { eval 'use LWP::Simple;' }
 
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.34 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.35 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 
 my $verbose = 0;
 
@@ -330,6 +330,8 @@ sub write_cache($) {
 
 sub html_unquote($) {
   my ($h) = @_;
+
+  # This only needs to handle entities that occur in RSS, not full HTML.
   my %ent = ( 'amp' => '&', 'lt' => '<', 'gt' => '>', 
               'quot' => '"', 'apos' => "'" );
   $h =~ s/(&(\#)?([[:alpha:]\d]+);?)/
index 8eac38de09cf304d4b90d6f87c2c63bdb74e651c..7123265cfdbbb911c594ac8032cdb6c1c3d6a8dd 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2001-2012 by Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2001-2013 by 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
@@ -1666,6 +1666,8 @@ get_image (Screen *screen,
         draw_colorbars (screen, xgwa.visual, drawable, xgwa.colormap,
                         0, 0, 0, 0);
         XSync (dpy, False);
+        if (! file_prop) file_prop = "";
+
       }
       break;
 
@@ -1706,8 +1708,23 @@ get_image (Screen *screen,
   {
     Atom a = XInternAtom (dpy, XA_XSCREENSAVER_IMAGE_FILENAME, False);
     if (file_prop && *file_prop)
-      XChangeProperty (dpy, window, a, XA_STRING, 8, PropModeReplace, 
-                       (unsigned char *) file_prop, strlen(file_prop));
+      {
+        char *f2 = strdup (file_prop);
+
+        /* Take the extension off of the file name. */
+        /* Duplicated in utils/grabclient.c. */
+        char *slash = strrchr (f2, '/');
+        char *dot = strrchr ((slash ? slash : f2), '.');
+        if (dot) *dot = 0;
+        /* Replace slashes with newlines */
+        /* while ((dot = strchr(f2, '/'))) *dot = '\n'; */
+        /* Replace slashes with spaces */
+        while ((dot = strchr(f2, '/'))) *dot = ' ';
+
+        XChangeProperty (dpy, window, a, XA_STRING, 8, PropModeReplace, 
+                         (unsigned char *) f2, strlen(f2));
+        free (f2);
+      }
     else
       XDeleteProperty (dpy, window, a);
 
index daacb41051e2361c05b8a9308163c08029bdfd82..e9ed44e31d5dbf0955a8c7487fe194eb5a28708b 100644 (file)
@@ -1802,29 +1802,40 @@ handle_clientmessage (saver_info *si, XEvent *event, Bool until_idle_p)
     }
   else if (type == XA_DEACTIVATE)
     {
-      if (! until_idle_p)
-       {
-          if (si->throttled_p && p->verbose_p)
-            fprintf (stderr, "%s: unthrottled.\n", blurb());
-         si->throttled_p = False;
+      if (si->locked_p) 
+        {
+          clientmessage_response(si, window, False,
+              "DEACTIVATE ClientMessage received while locked: ignored.",
+              "screen is locked.");
+        }
+      else
+        {
+          if (! until_idle_p)
+            {
+              if (si->throttled_p && p->verbose_p)
+                fprintf (stderr, "%s: unthrottled.\n", blurb());
+              si->throttled_p = False;
 
-         clientmessage_response(si, window, False,
-                                "DEACTIVATE ClientMessage received.",
-                                "deactivating.");
-         if (si->using_mit_saver_extension || si->using_sgi_saver_extension)
-           {
-             XForceScreenSaver (si->dpy, ScreenSaverReset);
-             return False;
-           }
-         else
-           {
-             return True;
-           }
-       }
-      clientmessage_response(si, window, False,
-     "ClientMessage DEACTIVATE received while inactive: resetting idle timer.",
-                            "not active: idle timer reset.");
-      reset_timers (si);
+              clientmessage_response(si, window, False,
+                                     "DEACTIVATE ClientMessage received.",
+                                     "deactivating.");
+              if (si->using_mit_saver_extension ||
+                  si->using_sgi_saver_extension)
+                {
+                  XForceScreenSaver (si->dpy, ScreenSaverReset);
+                  return False;
+                }
+              else
+                {
+                  return True;
+                }
+            }
+          clientmessage_response(si, window, False,
+                          "ClientMessage DEACTIVATE received while inactive: "
+                          "resetting idle timer.",
+                                 "not active: idle timer reset.");
+          reset_timers (si);
+        }
     }
   else if (type == XA_CYCLE)
     {
index 92c67dfb0cca3f084c63b8f39cce8e989bd5efc2..25bc2b0ac3e413b0c0e68007edc6719b80a6c11e 100644 (file)
@@ -113,7 +113,7 @@ SRCS                = attraction.c blitspin.c bouboule.c braid.c bubbles.c \
                  fuzzyflakes.c anemotaxis.c memscroller.c substrate.c \
                  intermomentary.c fireworkx.c fiberlamp.c \
                  boxfit.c interaggregate.c celtic.c cwaves.c m6502.c \
-                 asm6502.c abstractile.c lcdscrub.c \
+                 asm6502.c abstractile.c lcdscrub.c hexadrop.c \
                  webcollage-cocoa.m webcollage-helper-cocoa.m
 SCRIPTS                = vidwhacker webcollage ljlatest
 
@@ -153,7 +153,7 @@ OBJS                = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
                  intermomentary.o fireworkx.o fiberlamp.o boxfit.o \
                  interaggregate.o celtic.o cwaves.o webcollage-cocoa.o \
                  webcollage-helper-cocoa.o m6502.o asm6502.o abstractile.o \
-                 lcdscrub.o
+                 lcdscrub.o hexadrop.o
 
 EXES           = attraction blitspin bouboule braid decayscreen deco \
                  drift flame galaxy grav greynetic halo \
@@ -174,7 +174,7 @@ EXES                = attraction blitspin bouboule braid decayscreen deco \
                  fontglide apple2 xanalogtv pong  wormhole \
                  pacman fuzzyflakes anemotaxis memscroller substrate \
                  intermomentary fireworkx fiberlamp boxfit interaggregate \
-                 celtic cwaves m6502 abstractile lcdscrub \
+                 celtic cwaves m6502 abstractile lcdscrub hexadrop \
                  @JPEG_EXES@
 JPEG_EXES      = webcollage-helper
 
@@ -226,7 +226,7 @@ MEN         = anemone.man apollonian.man attraction.man \
                  anemotaxis.man memscroller.man substrate.man \
                  intermomentary.man fireworkx.man fiberlamp.man boxfit.man \
                  interaggregate.man celtic.man cwaves.man abstractile.man \
-                 lcdscrub.man
+                 lcdscrub.man hexadrop.man
 
 RETIRED_MEN    = ant.man bubbles.man critical.man flag.man forest.man \
                  laser.man lightning.man lisa.man lissie.man lmorph.man \
@@ -841,6 +841,9 @@ abstractile:        abstractile.o   $(HACK_OBJS) $(COL)
 lcdscrub:      lcdscrub.o      $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
+hexadrop:      hexadrop.o      $(HACK_OBJS) $(COL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
 # The rules for those hacks which follow the `xlockmore' API.
 #
 
@@ -1709,6 +1712,17 @@ helix.o: $(UTILS_SRC)/resources.h
 helix.o: $(UTILS_SRC)/usleep.h
 helix.o: $(UTILS_SRC)/visual.h
 helix.o: $(UTILS_SRC)/yarandom.h
+hexadrop.o: ../config.h
+hexadrop.o: $(srcdir)/fps.h
+hexadrop.o: $(srcdir)/screenhackI.h
+hexadrop.o: $(srcdir)/screenhack.h
+hexadrop.o: $(UTILS_SRC)/colors.h
+hexadrop.o: $(UTILS_SRC)/grabscreen.h
+hexadrop.o: $(UTILS_SRC)/hsv.h
+hexadrop.o: $(UTILS_SRC)/resources.h
+hexadrop.o: $(UTILS_SRC)/usleep.h
+hexadrop.o: $(UTILS_SRC)/visual.h
+hexadrop.o: $(UTILS_SRC)/yarandom.h
 hopalong.o: ../config.h
 hopalong.o: $(srcdir)/fps.h
 hopalong.o: $(srcdir)/screenhackI.h
index 647b7aab93180c8e8db6294e1e511fdaf4d252ef..aaac029e8b098c82b7cd0c042148f4200284788e 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright (c) 2004-2009 Steve Sundstrom
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -6,7 +6,7 @@
  * the above copyright notice appear in all copies and that both that
  * copyright notice and this permission notice appear in supporting
  * documentation.  No representations are made about the suitability of this
- * software for any purpose.  It is provided "as is" without express or 
+ * software for any purpose.  It is provided "as is" without express or
  * implied warranty.
  */
 
@@ -41,7 +41,7 @@
 #define PT_NL                  3
 
 #define D3D_NONE               0
-#define D3D_BLOCK              1 
+#define D3D_BLOCK              1
 #define D3D_NEON               2
 #define D3D_TILED              3
 
@@ -74,7 +74,7 @@ struct gridStruct {
     unsigned int line, hl, hr, vu, vd, dhl, dhr, dvu, dvd;
 };
 
-/* basically the same as global variables, but used to keep them in a bucket 
+/* basically the same as global variables, but used to keep them in a bucket
    and pass them around easier like the original C++ implementation */
 struct state {
   /* window values */
@@ -118,10 +118,10 @@ struct state {
   int round;
   int outline;
   /* layered draw variables */
-  int pattern[LAYERS], shape[LAYERS], mix[LAYERS]; 
-  int csw[LAYERS], wsx[LAYERS], wsy[LAYERS], sec[LAYERS]; 
-  int cs1[LAYERS], cs2[LAYERS], cs3[LAYERS]; int cs4[LAYERS]; 
-  int wave[LAYERS], waveh[LAYERS], wavel[LAYERS]; 
+  int pattern[LAYERS], shape[LAYERS], mix[LAYERS];
+  int csw[LAYERS], wsx[LAYERS], wsy[LAYERS], sec[LAYERS];
+  int cs1[LAYERS], cs2[LAYERS], cs3[LAYERS]; int cs4[LAYERS];
+  int wave[LAYERS], waveh[LAYERS], wavel[LAYERS];
   int rx1[LAYERS], rx2[LAYERS], rx3[LAYERS];
   int ry1[LAYERS], ry2[LAYERS], ry3[LAYERS];
   /* misc variables */
@@ -130,24 +130,24 @@ struct state {
   struct timeval time;
 };
 
-static int 
-_min(int a, int b) 
+static int
+_min(int a, int b)
 {
   if (a<=b)
     return(a);
   return(b);
 }
 
-static int 
-_max(int a, int b) 
+static int
+_max(int a, int b)
 {
   if (a>=b)
     return(a);
   return(b);
 }
 
-static int 
-_dist(struct state *st, int x1, int x2, int y1, int y2, int s) 
+static int
+_dist(struct state *st, int x1, int x2, int y1, int y2, int s)
 {
   double xd=x1-x2;
   double yd=y1-y2;
@@ -163,10 +163,10 @@ _dist(struct state *st, int x1, int x2, int y1, int y2, int s)
   }
 }
 
-static int 
-_wave(struct state *st, int x, int h, int l, int wave) 
+static int
+_wave(struct state *st, int x, int h, int l, int wave)
 {
-  l+=1; 
+  l+=1;
   switch(wave) {
     case 0:                                         /* cos wave*/
       return((int)(cos((double)x*M_PI/l)*h));
@@ -178,30 +178,30 @@ _wave(struct state *st, int x, int h, int l, int wave)
     case 4:                                   /* giant zig zag */
       return(abs((x%(l*4)-l*2))*h*3/l);
     case 5:                                        /* sawtooth */
-      return((x%(l))*h/l); 
+      return((x%(l))*h/l);
     default:                                       /* no wave */
       return(0);
-  } 
+  }
 }
 
-static int 
-_triangle(struct state *st, int x, int y, int rx, int ry, int t) 
+static int
+_triangle(struct state *st, int x, int y, int rx, int ry, int t)
 {
   switch(t) {
     case 1:
       return(_min(_min(x+y+rx-(st->gridx/2),st->gridx-x+y),(st->gridy-y+(ry/2))*3/2));
     case 2:
-      return(_min(_min(x-rx,y-ry),(rx+ry-x-y)*2/3)); 
+      return(_min(_min(x-rx,y-ry),(rx+ry-x-y)*2/3));
     case 3:
       return(_min(_min(st->gridx-x-rx,y-ry),(rx+ry-st->gridx+x-y)*2/3));
     case 4:
       return(_min(_min(x-rx,st->gridy-y-ry),(rx+ry-x-st->gridy+y)*2/3));
-  } 
+  }
   return(_min(_min(st->gridx-x-rx,st->gridy-y-ry),(rx+ry-st->gridx+x-st->gridy+y)*2/3));
 }
 
-static void 
-_init_zlist(struct state *st) 
+static void
+_init_zlist(struct state *st)
 {
   unsigned int tmp, y, z;
 
@@ -213,7 +213,7 @@ _init_zlist(struct state *st)
     st->grid[z].line=st->grid[z].hl=st->grid[z].hr=st->grid[z].vu=st->grid[z].vd=st->grid[z].dhl=st->grid[z].dhr=st->grid[z].dvu=st->grid[z].dvd=0;
     st->zlist[z]=z;
   }
-  /* rather than pull x,y points randomly and wait to hit final empy cells a 
+  /* rather than pull x,y points randomly and wait to hit final empy cells a
      list of all points is created and mixed so empty cells do get hit last */
   for (z=0; z<st->gridn; z++) {
     y=random()%st->gridn;
@@ -224,25 +224,24 @@ _init_zlist(struct state *st)
 }
 
 static void
-make_color_ramp_rgb (Display *dpy, Colormap cmap,
+make_color_ramp_rgb (Screen *screen, Visual *visual, Colormap cmap,
     int r1, int g1, int b1,  int r2, int g2, int b2,
-    XColor *colors, int *ncolorsP,
-    Bool closed_p, Bool allocate_p, Bool writable_p)
+    XColor *colors, int *ncolorsP, Bool closed_p)
 {
     int h1, h2;
     double s1, s2, v1, v2;
     rgb_to_hsv(r1, g1, b1, &h1, &s1, &v1);
     rgb_to_hsv(r2, g2, b2, &h2, &s2, &v2);
-    make_color_ramp(dpy, cmap, h1, s1, v1, h2, s2, v2,
-        colors, ncolorsP, False, allocate_p, writable_p);
+    make_color_ramp(screen, visual, cmap, h1, s1, v1, h2, s2, v2,
+        colors, ncolorsP, False, True, 0);
 }
 
 
-static void 
+static void
 _init_colors(struct state *st)
 {
   int col[BASECOLORS];
-  int c1, c2, c3, h1, h2, h3; 
+  int c1, c2, c3, h1, h2, h3;
   int r1, g1, b1, r2, g2, b2, r3, g3, b3;
   double s1, s2, s3, v1, v2, v3;
   XColor tmp_col1[16], tmp_col2[16], tmp_col3[16];
@@ -281,7 +280,7 @@ _init_colors(struct state *st)
     /* 29 pink */     {0xFFFF,0x9999,0xFFFF}};
 
   if (st->d3d) {
-    st->shades = (st->d3d==D3D_TILED) ? 5 : st->lwid/2+1;      
+    st->shades = (st->d3d==D3D_TILED) ? 5 : st->lwid/2+1;
     st->ncolors=4+random()%4;
     if (st->cmap>0) {                      /* tint the basecolors a bit */
       for (c1=0; c1<BASECOLORS; c1++)
@@ -297,44 +296,44 @@ _init_colors(struct state *st)
     }
     switch(st->cmap%4) {
       case 0:                                            /* all */
-        for (c1=0; c1<st->ncolors; c1++) 
+        for (c1=0; c1<st->ncolors; c1++)
           col[c1]=random()%BASECOLORS;
         break;
       case 1:                                          /* darks */
-        for (c1=0; c1<st->ncolors; c1++) 
+        for (c1=0; c1<st->ncolors; c1++)
           col[c1]=random()%15;
         break;
       case 2:                                   /* semi consecutive darks */
         col[0]=random()%15;
-        for (c1=1; c1<st->ncolors; c1++) 
+        for (c1=1; c1<st->ncolors; c1++)
           col[c1]=(col[c1-1]+1+random()%2)%15;
         break;
       case 3:                                   /* consecutive darks */
         col[0]=random()%(15-st->ncolors);
-        for (c1=1; c1<st->ncolors; c1++) 
+        for (c1=1; c1<st->ncolors; c1++)
           col[c1]=col[c1-1]+1;
         break;
     }
     for (c1=0; c1<st->ncolors; c1++) {
       /* adjust colors already set */
-      for (h1=c1*st->shades-1; h1>=0; h1--) 
+      for (h1=c1*st->shades-1; h1>=0; h1--)
         st->colors[h1+st->shades]=st->colors[h1];
-      make_color_ramp_rgb(st->display, st->xgwa.colormap,
-        basecol[col[c1]][0], basecol[col[c1]][1], basecol[col[c1]][2], 
-        0xFFFF, 0xFFFF, 0xFFFF, st->colors, &st->shades, 
-        False, True, False);
+      make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+        basecol[col[c1]][0], basecol[col[c1]][1], basecol[col[c1]][2],
+        0xFFFF, 0xFFFF, 0xFFFF, st->colors, &st->shades,
+        False);
     }
     return;
   }
   /* not 3d */
   st->shades=1;
   if (st->cmap%2) {                                  /* basecolors */
-    if (random()%3) {           
-      c1=random()%15;                
+    if (random()%3) {
+      c1=random()%15;
       c2=(c1+3+(random()%5))%15;
       c3=(c2+3+(random()%5))%15;
     } else {
-      c1=random()%BASECOLORS;                
+      c1=random()%BASECOLORS;
       c2=(c1+5+(random()%10))%BASECOLORS;
       c3=(c2+5+(random()%10))%BASECOLORS;
     }
@@ -366,9 +365,9 @@ _init_colors(struct state *st)
       st->ncolors=5+random()%5;
       if (st->cmap>1)
         r2=g2=b2=0xFFFF;
-      make_color_ramp_rgb(st->display, st->xgwa.colormap,
-        r1, g1, b1, r2, g2, b2, 
-        st->colors, &st->ncolors, random()%2, True, False);
+      make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+        r1, g1, b1, r2, g2, b2,
+        st->colors, &st->ncolors, random()%2);
       break;
     case 4:                                /* 3 color make_color_loop */
     case 5:
@@ -379,21 +378,21 @@ _init_colors(struct state *st)
       rgb_to_hsv(r2, g2, b2, &h2, &s2, &v2);
       rgb_to_hsv(r3, g3, b3, &h3, &s3, &v3);
 
-      make_color_loop(st->display, st->xgwa.colormap,
+      make_color_loop(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
         h1, s1, v1, h2, s2, v2, h3, s3, v3,
         st->colors, &st->ncolors, True, False);
       break;
     case 8:                                            /* random smooth */
     case 9:
       st->ncolors=(random()%4)*6+12;
-      make_smooth_colormap (st->display, st->xgwa.visual, 
-        st->xgwa.colormap, st->colors, &st->ncolors, 
+      make_smooth_colormap (st->xgwa.screen, st->xgwa.visual,
+        st->xgwa.colormap, st->colors, &st->ncolors,
         True, False, True);
       break;
     case 10:                                                 /* rainbow */
       st->ncolors=(random()%4)*6+12;
-      make_uniform_colormap (st->display, st->xgwa.visual, 
-        st->xgwa.colormap, st->colors, &st->ncolors, 
+      make_uniform_colormap (st->xgwa.screen, st->xgwa.visual,
+        st->xgwa.colormap, st->colors, &st->ncolors,
         True, False, True);
       break;
     case 11:                                     /* dark to light blend */
@@ -401,12 +400,12 @@ _init_colors(struct state *st)
     case 13:
     case 14:
       st->ncolors=7;
-      make_color_ramp_rgb(st->display, st->xgwa.colormap,
-        r1, g1, b1, 0xFFFF, 0xFFFF, 0xFFFF, 
-        tmp_col1, &st->ncolors, False, True, False);
-      make_color_ramp_rgb(st->display, st->xgwa.colormap,
-        r2, g2, b2, 0xFFFF, 0xFFFF, 0xFFFF, 
-        tmp_col2, &st->ncolors, False, True, False);
+      make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual,  st->xgwa.colormap,
+        r1, g1, b1, 0xFFFF, 0xFFFF, 0xFFFF,
+        tmp_col1, &st->ncolors, False);
+      make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual,  st->xgwa.colormap,
+        r2, g2, b2, 0xFFFF, 0xFFFF, 0xFFFF,
+        tmp_col2, &st->ncolors, False);
       if (st->cmap<13) {
         for(c1=0; c1<=4; c1++) {
            st->colors[c1*2]=tmp_col1[c1];
@@ -414,9 +413,9 @@ _init_colors(struct state *st)
         }
         st->ncolors=10;
       } else {
-        make_color_ramp_rgb(st->display, st->xgwa.colormap,
-          r3, g3, b3, 0xFFFF, 0xFFFF, 0xFFFF, 
-          tmp_col3, &st->ncolors, False, True, False);
+        make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual,  st->xgwa.colormap,
+          r3, g3, b3, 0xFFFF, 0xFFFF, 0xFFFF,
+          tmp_col3, &st->ncolors, False);
         for(c1=0; c1<=4; c1++) {
            st->colors[c1*3]=tmp_col1[c1];
            st->colors[c1*3+1]=tmp_col2[c1];
@@ -427,8 +426,8 @@ _init_colors(struct state *st)
       break;
     default:                                                  /* random */
       st->ncolors=(random()%4)*6+12;
-      make_random_colormap (st->display, st->xgwa.visual, 
-        st->xgwa.colormap, st->colors, &st->ncolors, 
+      make_random_colormap (st->xgwa.screen, st->xgwa.visual,
+        st->xgwa.colormap, st->colors, &st->ncolors,
         False, True, False, True);
       break;
   }
@@ -447,7 +446,7 @@ _init_colors(struct state *st)
 static int _comparedeo(const void *i, const void *j)
 {
         struct lineStruct *h1, *h2;
-                                                                                
+
         h1=(struct lineStruct *)i;
         h2=(struct lineStruct *)j;
         if (h1->deo > h2->deo)
@@ -457,7 +456,7 @@ static int _comparedeo(const void *i, const void *j)
         return(0);
 }
 
-static int 
+static int
 _hv(struct state *st, int x, int y, int d1, int d2, int pn, Bool de)
 {
   int v1, v2, r;
@@ -495,7 +494,7 @@ _hv(struct state *st, int x, int y, int d1, int d2, int pn, Bool de)
   return(r);
 }
        
-static int 
+static int
 _getdeo(struct state *st, int x, int y, int map, int de)
 {
   int cr;
@@ -505,39 +504,39 @@ _getdeo(struct state *st, int x, int y, int map, int de)
     case 1:                                          /* vertical one side */
       return(y);
     case 2:                                        /* horizontal two side */
-      return(_min(x,st->gridx-x)+1); 
+      return(_min(x,st->gridx-x)+1);
     case 3:                                          /* vertical two side */
-      return(_min(y,st->gridy-y)+1); 
+      return(_min(y,st->gridy-y)+1);
     case 4:                                                     /* square */
       return(_max(abs(x-st->rx3[de]),abs(y-st->ry3[de]))+1);
     case 5:                                                /* two squares */
-      return(_min(_max(abs(x-(st->rx3[de]/2)),abs(y-st->ry3[de])),_max(abs(x-(st->gridx-(st->rx2[de]/2))),abs(y-st->ry2[de])))+1); 
+      return(_min(_max(abs(x-(st->rx3[de]/2)),abs(y-st->ry3[de])),_max(abs(x-(st->gridx-(st->rx2[de]/2))),abs(y-st->ry2[de])))+1);
     case 6:                                       /* horizontal rectangle */
-      return(_max(abs(x-st->rx3[de]),abs(y-(st->ry3[de]))*st->cs1[de])+1); 
+      return(_max(abs(x-st->rx3[de]),abs(y-(st->ry3[de]))*st->cs1[de])+1);
     case 7:                                         /* vertical rectangle */
-      return(_max(abs(x-st->rx3[de])*st->cs1[de],abs(y-(st->ry3[de])))+1); 
+      return(_max(abs(x-st->rx3[de])*st->cs1[de],abs(y-(st->ry3[de])))+1);
     case 8:                                                    /* + cross */
-      return(_min(abs(x-st->rx3[de]),abs(y-(st->ry3[de])))+1); 
+      return(_min(abs(x-st->rx3[de]),abs(y-(st->ry3[de])))+1);
     case 9:                                                   /* diagonal */
       return((x*3/4+y)+1);
     case 10:                                         /* opposite diagonal */
-      return((x*3/4+st->gridy-y)+1); 
+      return((x*3/4+st->gridy-y)+1);
     case 11:                                                   /* diamond */
-      return((abs(x-st->rx3[de])+abs(y-st->ry3[de]))/2+1); 
+      return((abs(x-st->rx3[de])+abs(y-st->ry3[de]))/2+1);
     case 12:                                              /* two diamonds */
       return(_min(abs(x-(st->rx3[de]/2))+abs(y-st->ry3[de]),abs(x-(st->gridx-(st->rx2[de]/2)))+abs(y-st->ry2[de]))/2+1);
     case 13:                                                    /* circle */
-      return(_dist(st,x,st->rx3[de],y,st->ry3[de],0)+1); 
+      return(_dist(st,x,st->rx3[de],y,st->ry3[de],0)+1);
     case 14:                                        /* horizontal ellipse */
-      return(_dist(st,x,st->rx3[de],y,st->ry3[de],1)+1); 
+      return(_dist(st,x,st->rx3[de],y,st->ry3[de],1)+1);
     case 15:                                          /* vertical ellipse */
-      return(_dist(st,x,st->rx3[de],y,st->ry3[de],2)+1); 
+      return(_dist(st,x,st->rx3[de],y,st->ry3[de],2)+1);
     case 16:                                               /* two circles */
-      return(_min(_dist(st,x,st->rx3[de]/2,y,st->ry3[de],0),_dist(st,x,st->gridx-(st->rx2[de]/2),y,st->ry2[de],0))+1); 
+      return(_min(_dist(st,x,st->rx3[de]/2,y,st->ry3[de],0),_dist(st,x,st->gridx-(st->rx2[de]/2),y,st->ry2[de],0))+1);
     case 17:                                  /* horizontal straight wave */
       return(x+_wave(st,st->gridy+y,st->csw[0]*st->cs1[0],st->csw[0]*st->cs2[0],st->wave[de]));
     case 18:                                    /* vertical straight wave */
-      return(y+_wave(st,st->gridx+x,st->csw[0]*st->cs1[0],st->csw[0]*st->cs2[0],st->wave[de])); 
+      return(y+_wave(st,st->gridx+x,st->csw[0]*st->cs1[0],st->csw[0]*st->cs2[0],st->wave[de]));
     case 19:                                     /* horizontal wavey wave */
       return(x+_wave(st,st->gridy+y+((x/5)*st->edir),st->csw[de]*st->cs1[de],st->csw[de]*st->cs2[de],st->wave[de])+1);
     case 20:                                       /* vertical wavey wave */
@@ -546,19 +545,19 @@ _getdeo(struct state *st, int x, int y, int map, int de)
     case 21:                                  /* simultaneous directional */
       return(_hv(st,x,y,st->cs1[0]%2,st->cs2[0]%2,1,de));
     case 22:                                       /* reverse directional */
-      return(_hv(st,x,y,st->cs1[0]%2,st->cs2[0]%2,-1,de)); 
+      return(_hv(st,x,y,st->cs1[0]%2,st->cs2[0]%2,-1,de));
     case 23:                                                    /* length */
-      if (de) 
-        return(st->dline[st->li].len*1000+random()%5000); 
-      else 
+      if (de)
+        return(st->dline[st->li].len*1000+random()%5000);
+      else
         return(st->eline[st->li].len*1000+random()%5000);
     case 24:                                                    /* object */
-    case 25:                                                    
-    case 26:                                                    
-    case 27:                                                    
-      if (de) 
-        return(st->dline[st->li].obj*100); 
-      else 
+    case 25:
+    case 26:
+    case 27:
+      if (de)
+        return(st->dline[st->li].obj*100);
+      else
         return(st->eline[st->li].obj*100);
     default:                                                     /* color */
       cr = (de) ? st->dline[st->li].color : st->eline[st->li].color;
@@ -578,7 +577,7 @@ _getdeo(struct state *st, int x, int y, int map, int de)
   return(1);
 }
 
-static void 
+static void
 _init_screen(struct state *st)
 {
   int nstr, x;
@@ -606,7 +605,7 @@ _init_screen(struct state *st)
     st->zlist = calloc(st->narray, sizeof(unsigned int));
     st->fdol = calloc(st->narray, sizeof(unsigned int));
     st->odi = calloc(st->narray, sizeof(Bool));
-    if ((st->dline == NULL) || (st->eline == NULL) || 
+    if ((st->dline == NULL) || (st->eline == NULL) ||
       (st->grid == NULL) || (st->zlist == NULL) ||
       (st->fdol == NULL) || (st->odi == NULL)) {
       fprintf(stderr, "not enough memory\n");
@@ -627,7 +626,7 @@ _init_screen(struct state *st)
     st->egridy=st->gridy;
 
     /* create new erase order */
-    for (st->li=1; st->li<=st->eli; st->li++) 
+    for (st->li=1; st->li<=st->eli; st->li++)
       st->eline[st->li].deo=(_getdeo(st,st->eline[st->li].x,st->eline[st->li].y,st->emap,0) + (random()%st->evar) + (random()%st->evar))*st->edir;
     qsort(st->eline, st->eli+1, sizeof(struct lineStruct), _comparedeo);
   }
@@ -637,9 +636,9 @@ _init_screen(struct state *st)
   st->di=st->ei=st->fi=st->li=st->oi=st->zi=0;
   st->grid_full=False;
   /* li starts from 1 */
-  st->dline[0].x=st->dline[0].y=st->dline[0].len=0; 
+  st->dline[0].x=st->dline[0].y=st->dline[0].len=0;
   /* to keep it first after sorting so di is never null */
-  st->dline[0].deo=-999999999; 
+  st->dline[0].deo=-999999999;
 
   /* set random screen variables */
   st->lwid = (st->ii==1) ? 3 : 2+((random()%6)%4);
@@ -647,13 +646,13 @@ _init_screen(struct state *st)
     (st->tile==TILE_OUTLINE)) ? D3D_NONE :
     (st->tile==TILE_BLOCK) ? D3D_BLOCK :
     (st->tile==TILE_NEON) ? D3D_NEON :
-    (st->tile==TILE_TILED) ? D3D_TILED : 
+    (st->tile==TILE_TILED) ? D3D_TILED :
     /* force TILE_D3D on first screen to properly load all shades */
-    ((st->ii==1) && (!st->newcols)) ? D3D_TILED : (random()%5)%4; 
+    ((st->ii==1) && (!st->newcols)) ? D3D_TILED : (random()%5)%4;
 /* st->d3d=D3D_BLOCK; st->lwid=2; */
   st->outline = (st->tile==TILE_OUTLINE) ? 1 :
-     ((st->tile!=TILE_RANDOM) || (random()%5)) ? 0 : 1; 
-  st->round = (st->d3d==D3D_NEON) ? 1 : 
+     ((st->tile!=TILE_RANDOM) || (random()%5)) ? 0 : 1;
+  st->round = (st->d3d==D3D_NEON) ? 1 :
     ((st->d3d==D3D_BLOCK) || (st->outline) || (random()%6)) ? 0 : 1;
   if ((st->d3d) || (st->outline) || (st->round))
     st->lwid+=2;
@@ -663,7 +662,7 @@ _init_screen(struct state *st)
     st->lwid++;
   if (st->tile==TILE_THIN)
     st->lwid=2;
+
   _init_zlist(st);
 
   st->maxlen=(st->lwid>6) ? 2+(random()%4) :
@@ -678,10 +677,10 @@ _init_screen(struct state *st)
   st->dmap = (st->emap+5+(random()%5))%DRAWORDERS;
 
   st->dmap=20+random()%20;
-  
+
   st->dvar = (st->dmap>22) ? 100 : 10+(st->csw[0]*(random()%5));
   st->ddir= (random()%2) ? 1 : -1;
-  
+
   st->emap = (st->dmap+10+(random()%10))%20;
   st->evar = (st->emap>22) ? 100 : 10+(st->csw[0]*(random()%5));
   st->edir= (random()%2) ? 1 : -1;
@@ -694,10 +693,10 @@ _init_screen(struct state *st)
     st->shape[x]=random()%SHAPES;
     st->mix[x]=random()%20;
     nstr = (st->lwid==2) ? 20+random()%12 :
-      (st->lwid==3) ? 16+random()%8 : 
-      (st->lwid==4) ? 12+random()%6 : 
-      (st->lwid==5) ? 10+random()%5 : 
-      (st->lwid==6) ? 8+random()%4 : 
+      (st->lwid==3) ? 16+random()%8 :
+      (st->lwid==4) ? 12+random()%6 :
+      (st->lwid==5) ? 10+random()%5 :
+      (st->lwid==6) ? 8+random()%4 :
         5+random()%5;
     st->csw[x] = _max(5,st->gridy/nstr);
     st->wsx[x] = (st->wsx[x]+3+(random()%3))%STRETCHES;
@@ -709,7 +708,7 @@ _init_screen(struct state *st)
     st->cs3[x] = (st->dialog) ? 1+random()%3 : 2+random()%5;
     st->cs4[x] = (st->dialog) ? 1+random()%3 : 2+random()%5;
     st->wave[x]=random()%WAVES;
-    st->wavel[x]=st->csw[x]*(2+random()%6); 
+    st->wavel[x]=st->csw[x]*(2+random()%6);
     st->waveh[x]=st->csw[x]*(1+random()%3);
     st->rx1[x]=(st->gridx/10+random()%(st->gridx*8/10));
     st->ry1[x]=(st->gridy/10+random()%(st->gridy*8/10));
@@ -720,7 +719,7 @@ _init_screen(struct state *st)
   }
 }
 
-static int 
+static int
 _shape(struct state *st, int x, int y, int rx, int ry, int n)
 {
   switch(st->shape[n]) {
@@ -738,22 +737,22 @@ _shape(struct state *st, int x, int y, int rx, int ry, int n)
     case 8:
       return(1+_dist(st,x,rx,y,ry,st->cs1[n]));
     case 9:                                      /* black hole circle */
-      return(1+(st->gridx*st->gridy/(1+(_dist(st,x,rx,y,ry,st->cs2[n]))))); 
+      return(1+(st->gridx*st->gridy/(1+(_dist(st,x,rx,y,ry,st->cs2[n])))));
     case 10:                                                   /* sun */
       return(1+_min(abs(x-rx)*st->gridx/(abs(y-ry)+1),abs(y-ry)*st->gridx/(abs(x-rx)+1)));
     case 11:                             /* 2 circles+inverted circle */
-      return(1+(_dist(st,x,rx,y,ry,st->cs1[n])*_dist(st,x,(rx*3)%st->gridx,y,(ry*5)%st->gridy,st->cs1[n])/(1+_dist(st,x,(rx*4)%st->gridx,y,(ry*7)%st->gridy,st->cs1[n])))); 
+      return(1+(_dist(st,x,rx,y,ry,st->cs1[n])*_dist(st,x,(rx*3)%st->gridx,y,(ry*5)%st->gridy,st->cs1[n])/(1+_dist(st,x,(rx*4)%st->gridx,y,(ry*7)%st->gridy,st->cs1[n]))));
     case 12:                                                   /* star */
       return(1+(int)sqrt(abs((x-rx)*(y-ry))));
     case 13:                                       /* centered ellipse */
       return(1+_dist(st,x,rx,y,ry,0)+_dist(st,x,st->gridx-rx,y,st->gridy-ry,0));
     default:                                               /* triangle */
       return(1+_triangle(st,x,y,rx,ry,st->cs4[n]));
-  } 
+  }
   return(1+_triangle(st,x,y,rx,ry,st->cs4[n]));
 }
 
-static int 
+static int
 _pattern(struct state *st, int x, int y, int n)
 {
   int v=0, ox;
@@ -857,7 +856,7 @@ _pattern(struct state *st, int x, int y, int n)
       v=y+(y+st->csw[n]*st->cs3[n])+_wave(st,x,st->csw[n]/3*st->cs3[n],st->csw[n]/3*st->cs2[n],st->wave[n])+_wave(st,x,st->csw[n]/3*st->cs4[n],st->csw[n]/3*st->cs1[n]*3/2,st->wave[n]);
       break;
     case 19:                                          /* double vwave */
-      v=x+(x+st->csw[n]*st->cs1[n])+_wave(st,y,st->csw[n]/3*st->cs1[n],st->csw[n]/3*st->cs3[n],st->wave[n])+_wave(st,y,st->csw[n]/3*st->cs2[n],st->csw[n]/3*st->cs4[n]*3/2,st->wave[n]); 
+      v=x+(x+st->csw[n]*st->cs1[n])+_wave(st,y,st->csw[n]/3*st->cs1[n],st->csw[n]/3*st->cs3[n],st->wave[n])+_wave(st,y,st->csw[n]/3*st->cs2[n],st->csw[n]/3*st->cs4[n]*3/2,st->wave[n]);
       break;
     case 20:                                                 /* one shape */
     case 21:
@@ -897,7 +896,7 @@ _pattern(struct state *st, int x, int y, int n)
       v=(_min(_shape(st,x, y, st->rx2[n], st->ry2[n], n),_shape(st,x, y, st->gridx-st->rx2[n], st->gridy-st->ry2[n], n)),_min(_shape(st,x, y, st->gridx-st->rx2[n], st->ry2[n], n),_shape(st,x, y, st->rx2[n], st->gridy-st->ry2[n], n)));
       break;
     case 39:                                           /* four rainbows */
-      v=(_min(_shape(st,x, y, st->gridx-st->rx2[n]/2, st->csw[n], n),_shape(st,x, y, st->csw[n], st->ry2[n]/2, n)),_min(_shape(st,x, y, st->rx2[n]/2, st->gridy-st->csw[n], n),_shape(st,x, y, st->gridx-st->csw[n], st->gridy-(st->ry2[n]/2), n))); 
+      v=(_min(_shape(st,x, y, st->gridx-st->rx2[n]/2, st->csw[n], n),_shape(st,x, y, st->csw[n], st->ry2[n]/2, n)),_min(_shape(st,x, y, st->rx2[n]/2, st->gridy-st->csw[n], n),_shape(st,x, y, st->gridx-st->csw[n], st->gridy-(st->ry2[n]/2), n)));
       break;
   }
   /* stretch or contract stripe */
@@ -912,27 +911,27 @@ _pattern(struct state *st, int x, int y, int n)
   return (abs(v));
 }
 
-static int 
+static int
 _getcolor(struct state *st, int x, int y)
 {
   int n, cv[LAYERS];
-  
+
   for (n=0; n<st->layers; n++) {
     cv[n]=_pattern(st,x,y,n);
                   /* first wave/shape */
-    cv[0] = (!n) ? cv[0]/st->csw[0] : 
+    cv[0] = (!n) ? cv[0]/st->csw[0] :
                     /* checkerboard+1 */
-      (st->mix[n]<5) ? (cv[0]*st->csw[0]+cv[n])/st->csw[n] : 
+      (st->mix[n]<5) ? (cv[0]*st->csw[0]+cv[n])/st->csw[n] :
                /* checkerboard+ncol/2 */
-      (st->mix[n]<12) ? cv[0]+(cv[n]/st->csw[n]*st->ncolors/2) : 
+      (st->mix[n]<12) ? cv[0]+(cv[n]/st->csw[n]*st->ncolors/2) :
                            /* add mix */
-      (st->mix[n]<16) ? cv[0]+(cv[n]/st->csw[n]) : 
+      (st->mix[n]<16) ? cv[0]+(cv[n]/st->csw[n]) :
                       /* subtract mix */
-      (st->mix[n]<18) ? cv[0]-(cv[n]/st->csw[n]) : 
+      (st->mix[n]<18) ? cv[0]-(cv[n]/st->csw[n]) :
                   /* r to l morph mix */
-      (st->mix[n]==18) ? ((cv[0]*x)+(cv[n]*(st->gridx-x)/st->csw[n]))/st->gridx : 
+      (st->mix[n]==18) ? ((cv[0]*x)+(cv[n]*(st->gridx-x)/st->csw[n]))/st->gridx :
                   /* u to d morph mix */
-      ((cv[0]*y)+(cv[n]*(st->gridy-y)/st->csw[n]))/st->gridy; 
+      ((cv[0]*y)+(cv[n]*(st->gridy-y)/st->csw[n]))/st->gridy;
   }
   return(cv[0]);
 }
@@ -940,58 +939,58 @@ _getcolor(struct state *st, int x, int y)
 /* return value=line direction
    st->olen=open space to edge or next blocking line
    st->bln=blocking line number or -1 if edge blocks */
-static int 
+static int
 _findopen(struct state *st, int x, int y, int z)
 {
   int dir, od[4], no=0;
 
-  if (((st->grid[z].hl) || (st->grid[z].hr)) && 
-    ((st->grid[z].vu) || (st->grid[z].vd))) 
+  if (((st->grid[z].hl) || (st->grid[z].hr)) &&
+    ((st->grid[z].vu) || (st->grid[z].vd)))
     return(DIR_NONE);
-  if ((z>st->gridx) && (!st->grid[z].hl) && (!st->grid[z].hr) && 
-    (!st->grid[z-st->gridx].line)) { 
-    od[no]=DIR_UP; 
-    no++; 
+  if ((z>st->gridx) && (!st->grid[z].hl) && (!st->grid[z].hr) &&
+    (!st->grid[z-st->gridx].line)) {
+    od[no]=DIR_UP;
+    no++;
   }
-  if ((z<st->gridn-st->gridx) && (!st->grid[z].hl) && 
-    (!st->grid[z].hr) && (!st->grid[z+st->gridx].line)) { 
-    od[no]=DIR_DOWN; 
-    no++; 
+  if ((z<st->gridn-st->gridx) && (!st->grid[z].hl) &&
+    (!st->grid[z].hr) && (!st->grid[z+st->gridx].line)) {
+    od[no]=DIR_DOWN;
+    no++;
   }
-  if ((x) && (!st->grid[z].hl) && (!st->grid[z].hr) && 
+  if ((x) && (!st->grid[z].hl) && (!st->grid[z].hr) &&
     (!st->grid[z-1].line)) {
-    od[no]=DIR_LEFT; 
-    no++; 
+    od[no]=DIR_LEFT;
+    no++;
   }
-  if (((z+1)%st->gridx) && (!st->grid[z].hl) && (!st->grid[z].hr) && 
-    (!st->grid[z+1].line)) { 
-    od[no]=DIR_RIGHT; 
-    no++; 
+  if (((z+1)%st->gridx) && (!st->grid[z].hl) && (!st->grid[z].hr) &&
+    (!st->grid[z+1].line)) {
+    od[no]=DIR_RIGHT;
+    no++;
   }
-  if (!no) 
+  if (!no)
     return(DIR_NONE);
   dir=od[random()%no];
   st->olen=st->bln=0;
   while ((st->olen<=st->maxlen) && (!st->bln)) {
     st->olen++;
-    if (dir==DIR_UP) 
-      st->bln = (y-st->olen<0) ? -1 : 
+    if (dir==DIR_UP)
+      st->bln = (y-st->olen<0) ? -1 :
         st->grid[z-(st->olen*st->gridx)].line;
-    if (dir==DIR_DOWN) 
-      st->bln = (y+st->olen>=st->gridy) ? -1 : 
+    if (dir==DIR_DOWN)
+      st->bln = (y+st->olen>=st->gridy) ? -1 :
         st->grid[z+(st->olen*st->gridx)].line;
-    if (dir==DIR_LEFT) 
-      st->bln = (x-st->olen<0) ? -1 : 
+    if (dir==DIR_LEFT)
+      st->bln = (x-st->olen<0) ? -1 :
         st->grid[z-st->olen].line;
-    if (dir==DIR_RIGHT) 
-      st->bln = (x+st->olen>=st->gridx) ? -1 : 
+    if (dir==DIR_RIGHT)
+      st->bln = (x+st->olen>=st->gridx) ? -1 :
         st->grid[z+st->olen].line;
   }
-  st->olen--; 
+  st->olen--;
   return(dir);
 }
 
-static void 
+static void
 _fillgrid(struct state *st)
 {
   unsigned int gridc, n, add;
@@ -1006,14 +1005,14 @@ _fillgrid(struct state *st)
       st->grid[gridc].line=st->li;
     }
     if (st->dline[st->li].hv) {
-      if (n) 
+      if (n)
         st->grid[gridc].hr=st->li;
       if (n<st->dline[st->li].len)
         st->grid[gridc].hl=st->li;
     } else {
-      if (n) 
+      if (n)
         st->grid[gridc].vd=st->li;
-      if (n<st->dline[st->li].len) 
+      if (n<st->dline[st->li].len)
         st->grid[gridc].vu=st->li;
     }
     if (st->fi>=st->gridn) {
@@ -1023,7 +1022,7 @@ _fillgrid(struct state *st)
   }
 }
 
-static void 
+static void
 _newline(struct state *st)
 {
   int bl, bz, dir, lt, x, y, z;
@@ -1035,60 +1034,60 @@ _newline(struct state *st)
   st->zi++;
   dir=_findopen(st,x,y,z);
 
-  if (!st->grid[z].line) { 
+  if (!st->grid[z].line) {
   /* this is an empty space, make a new line unless nothing is open around it */
     if (dir==DIR_NONE) {
       /* nothing is open, force a len 1 branch in any direction */
-      lt=LINE_FORCE; 
-      while ((dir==DIR_NONE) || 
-        ((dir==DIR_UP) && (!y)) || 
+      lt=LINE_FORCE;
+      while ((dir==DIR_NONE) ||
+        ((dir==DIR_UP) && (!y)) ||
         ((dir==DIR_DOWN) && (y+1==st->gridy)) ||
-        ((dir==DIR_LEFT) && (!x)) || 
+        ((dir==DIR_LEFT) && (!x)) ||
         ((dir==DIR_RIGHT) && (x+1==st->gridx))) {
           dir=random()%4;
       }
       bz = (dir==DIR_UP) ? z-st->gridx : (dir==DIR_DOWN) ? z+st->gridx : (dir==DIR_LEFT) ? z-1 : z+1;
       bl = st->grid[bz].line;
-    } else if ((st->bnratio>1) && (st->bln>0) && 
-      (st->olen<st->maxlen) && (random()%st->bnratio)) { 
+    } else if ((st->bnratio>1) && (st->bln>0) &&
+      (st->olen<st->maxlen) && (random()%st->bnratio)) {
       /* branch into blocking line */
-      lt=LINE_BRIN; 
+      lt=LINE_BRIN;
       bl = st->bln;
-    } else { 
+    } else {
       /* make a new line and new object */
-      lt=LINE_NEW; 
+      lt=LINE_NEW;
       st->oi++;
-    }  
-  } else { 
+    }
+  } else {
     /* this is a filled space, make a branch unless nothing is open around it */
-    if (dir==DIR_NONE) 
+    if (dir==DIR_NONE)
       return;
     /* make a branch out of this line */
-    lt=LINE_BROUT; 
+    lt=LINE_BROUT;
     bl=st->grid[z].line;
   }
   st->li++;
-  st->dline[st->li].len = (lt==LINE_FORCE) ? 1 :  (lt==LINE_BRIN) ? 
+  st->dline[st->li].len = (lt==LINE_FORCE) ? 1 :  (lt==LINE_BRIN) ?
     st->olen+1 : (!st->forcemax) ? st->olen : 1+random()%st->olen;
   st->dline[st->li].x=x;
-  if (dir==DIR_LEFT) 
+  if (dir==DIR_LEFT)
     st->dline[st->li].x-=st->dline[st->li].len;
   st->dline[st->li].y=y;
-  if (dir==DIR_UP) 
+  if (dir==DIR_UP)
     st->dline[st->li].y-=st->dline[st->li].len;
-  st->dline[st->li].hv = ((dir==DIR_LEFT) || (dir==DIR_RIGHT)) ? 
+  st->dline[st->li].hv = ((dir==DIR_LEFT) || (dir==DIR_RIGHT)) ?
     True : False;
-  st->dline[st->li].obj = (lt==LINE_NEW) ? st->oi : 
+  st->dline[st->li].obj = (lt==LINE_NEW) ? st->oi :
     st->dline[bl].obj;
-  st->dline[st->li].color = (lt==LINE_NEW) ? 
+  st->dline[st->li].color = (lt==LINE_NEW) ?
     (_getcolor(st,x,y))%st->ncolors : st->dline[bl].color;
-  st->dline[st->li].deo=(_getdeo(st,x,y,st->dmap,1) + 
+  st->dline[st->li].deo=(_getdeo(st,x,y,st->dmap,1) +
     (random()%st->dvar) + (random()%st->dvar))*st->ddir;
   st->dline[st->li].ndol=0;
   _fillgrid(st);
 }
 
-static void 
+static void
 _create_screen(struct state *st)
 {
   while(!st->grid_full)
@@ -1096,18 +1095,18 @@ _create_screen(struct state *st)
   qsort(st->dline, st->li+1, sizeof(struct lineStruct), _comparedeo);
 /*st->lpu=st->li/20/((6-st->speed)*3);
   Used to use a computed lpu, lines per update to control draw speed
-  draw 1/lpu of the lines before each XSync which takes a split second 
+  draw 1/lpu of the lines before each XSync which takes a split second
   the higher the lpu, the quicker the screen draws.  This worked somewhat
   after the 4->5 update, however with the Mac updating so much more slowly,
   values tuned for it draw the screen in a blink on Linux.  Therefore we
   draw 1/200th of the screen with each update and sleep, if necessary */
-  st->lpu = (st->dialog) ? st->li/50 : st->li/200;   
+  st->lpu = (st->dialog) ? st->li/50 : st->li/200;
   if (!st->lpu) st->lpu = 1;
   st->bi=1;
   st->mode=MODE_ERASE;
 }
 
-static void 
+static void
 _fill_outline(struct state *st, int di)
 {
   int x, y, h, w;
@@ -1120,13 +1119,13 @@ _fill_outline(struct state *st, int di)
     w=(st->dline[di].len+1)*st->lwid-3;
     h=st->lwid-3;
   } else {
-    w=st->lwid-3; 
+    w=st->lwid-3;
     h=(st->dline[di].len+1)*st->lwid-3;
   }
   XFillRectangle (st->display, st->window, st->bgc, x, y, w, h);
 }
 
-static void 
+static void
 _XFillRectangle(struct state *st, int di, int adj)
 {
   int a, b, x, y, w, h;
@@ -1137,7 +1136,7 @@ _XFillRectangle(struct state *st, int di, int adj)
     w=(st->dline[di].len+1)*st->lwid-1;
     h=st->lwid-1;
   } else {
-    w=st->lwid-1; 
+    w=st->lwid-1;
     h=(st->dline[di].len+1)*st->lwid-1;
   }
   switch (st->d3d) {
@@ -1154,25 +1153,25 @@ _XFillRectangle(struct state *st, int di, int adj)
       h-=st->lwid/2-1;
     break;
   }
-  if (!st->round) { 
+  if (!st->round) {
     XFillRectangle(st->display, st->window, st->fgc, x, y, w, h);
   } else {
     if (h<st->lwid) {                                   /* horizontal */
       a=(h-1)/2;
       for (b=0; b<=a; b++)
-        XFillRectangle(st->display, st->window, st->fgc, 
+        XFillRectangle(st->display, st->window, st->fgc,
           x+b, y+a-b, w-b*2, h-((a-b)*2));
     } else {                                               /* vertical */
       a=(w-1)/2;
       for (b=0; b<=a; b++)
-        XFillRectangle(st->display, st->window, st->fgc, 
+        XFillRectangle(st->display, st->window, st->fgc,
           x+a-b, y+b, w-((a-b)*2), h-b*2);
     }
   }
 }
 
-static void 
-_XFillTriangle(struct state *st, int color, int x1, int y1, int x2, int y2, 
+static void
+_XFillTriangle(struct state *st, int color, int x1, int y1, int x2, int y2,
   int x3, int y3)
 {
   XPoint points[3];
@@ -1184,12 +1183,12 @@ _XFillTriangle(struct state *st, int color, int x1, int y1, int x2, int y2,
   points[2].x=x3;
   points[2].y=y3;
   XSetForeground(st->display, st->fgc, st->colors[color].pixel);
-  XFillPolygon (st->display, st->window, st->fgc, points, 3, Convex, 
+  XFillPolygon (st->display, st->window, st->fgc, points, 3, Convex,
       CoordModeOrigin);
 }
 
-static void 
-_XFillPolygon4(struct state *st, int color, int x1, int y1, int x2, int y2, 
+static void
+_XFillPolygon4(struct state *st, int color, int x1, int y1, int x2, int y2,
   int x3, int y3, int x4, int y4)
 {
   XPoint points[4];
@@ -1203,11 +1202,11 @@ _XFillPolygon4(struct state *st, int color, int x1, int y1, int x2, int y2,
   points[3].x=x4;
   points[3].y=y4;
   XSetForeground(st->display, st->fgc, st->colors[color].pixel);
-  XFillPolygon (st->display, st->window, st->fgc, points, 4, Convex, 
+  XFillPolygon (st->display, st->window, st->fgc, points, 4, Convex,
       CoordModeOrigin);
 }
 
-static void 
+static void
 _draw_tiled(struct state *st, int color)
 {
   int a, c, d, x, y, z, m1, m2, lr, nl, w, h;
@@ -1223,26 +1222,26 @@ _draw_tiled(struct state *st, int color)
     if (st->dline[st->di].hv) {
       x = (st->dline[st->di].x+c)*st->lwid;
       y = st->dline[st->di].y*st->lwid;
-      if (c) 
+      if (c)
         st->grid[z].dhr=st->di;
-      if (c<st->dline[st->di].len) 
+      if (c<st->dline[st->di].len)
         st->grid[z].dhl=st->di;
     } else {
       x = st->dline[st->di].x*st->lwid;
       y = (st->dline[st->di].y+c)*st->lwid;
-      if (c) 
+      if (c)
         st->grid[z].dvd=st->di;
-      if (c<st->dline[st->di].len) 
+      if (c<st->dline[st->di].len)
         st->grid[z].dvu=st->di;
     }
     d=0;
-    if (st->grid[z].dhl) 
+    if (st->grid[z].dhl)
       d+=8;
-    if (st->grid[z].dhr) 
+    if (st->grid[z].dhr)
       d+=4;
-    if (st->grid[z].dvu) 
+    if (st->grid[z].dvu)
       d+=2;
-    if (st->grid[z].dvd) 
+    if (st->grid[z].dvd)
       d++;
     /* draw line base */
     switch (d) {
@@ -1255,13 +1254,13 @@ _draw_tiled(struct state *st, int color)
       case 11:
       case 15:
         h = ((d==1) || (d==5)) ? lr : nl;
-        XSetForeground(st->display, st->fgc, 
+        XSetForeground(st->display, st->fgc,
           st->colors[color].pixel);
-        XFillRectangle (st->display, st->window, st->fgc, 
+        XFillRectangle (st->display, st->window, st->fgc,
           x, y, m2, h);
-        XSetForeground(st->display, st->fgc, 
+        XSetForeground(st->display, st->fgc,
            st->colors[color+3].pixel);
-        XFillRectangle (st->display, st->window, st->fgc, 
+        XFillRectangle (st->display, st->window, st->fgc,
           x+m2, y, m1, h);
         break;
       case 4:
@@ -1272,13 +1271,13 @@ _draw_tiled(struct state *st, int color)
       case 13:
       case 14:
         w = (d==4) ? lr : nl;
-        XSetForeground(st->display, st->fgc, 
+        XSetForeground(st->display, st->fgc,
           st->colors[color+1].pixel);
-        XFillRectangle (st->display, st->window, st->fgc, 
+        XFillRectangle (st->display, st->window, st->fgc,
           x, y, w, m2);
-        XSetForeground(st->display, st->fgc, 
+        XSetForeground(st->display, st->fgc,
            st->colors[color+2].pixel);
-        XFillRectangle (st->display, st->window, st->fgc, 
+        XFillRectangle (st->display, st->window, st->fgc,
           x, y+m2, w, m1);
         break;
     }
@@ -1339,7 +1338,7 @@ _draw_tiled(struct state *st, int color)
   }
 }
 
-static long 
+static long
 _mselapsed(struct state *st)
 {
   struct timeval t;
@@ -1349,7 +1348,7 @@ _mselapsed(struct state *st)
   return ((long)t.tv_sec*1000000+t.tv_usec);
 }
 
-static void 
+static void
 _draw_lines(struct state *st)
 {
   int n, z, a, color, sh, di;
@@ -1366,7 +1365,7 @@ _draw_lines(struct state *st)
         st->dline[st->di].ndol=st->fdol[st->dline[st->di].obj];
         st->fdol[st->dline[st->di].obj]=st->di;
         for (sh=0; sh<st->lwid/2; sh++) {
-          XSetForeground(st->display, st->fgc, 
+          XSetForeground(st->display, st->fgc,
             st->colors[color+sh].pixel);
           di=st->di;
           while(di>0) {
@@ -1379,7 +1378,7 @@ _draw_lines(struct state *st)
         st->dline[st->di].ndol=st->fdol[st->dline[st->di].obj];
         st->fdol[st->dline[st->di].obj]=st->di;
         for (sh=0; sh<st->lwid/2; sh++) {
-          XSetForeground(st->display, st->fgc, 
+          XSetForeground(st->display, st->fgc,
             st->colors[color+(st->lwid/2)-sh-1].pixel);
           di=st->di;
           while(di>0) {
@@ -1403,14 +1402,14 @@ _draw_lines(struct state *st)
             _fill_outline(st, st->grid[z].dvu);
             _fill_outline(st, st->grid[z].dvd);
             if (st->dline[st->di].hv) {
-              if (n) 
+              if (n)
                 st->grid[z].dhr=st->di;
-              if (n<st->dline[st->di].len) 
+              if (n<st->dline[st->di].len)
                 st->grid[z].dhl=st->di;
             } else {
-              if (n) 
+              if (n)
                 st->grid[z].dvd=st->di;
-              if (n<st->dline[st->di].len) 
+              if (n<st->dline[st->di].len)
                 st->grid[z].dvu=st->di;
             }
             z+=a;
@@ -1427,25 +1426,25 @@ _draw_lines(struct state *st)
   }
 }
 
-static void 
+static void
 _erase_lines(struct state *st)
 {
   if (!st->ii)
     return;
   for (st->di=st->bi; st->di<_min(st->eli+1,st->bi+st->elpu); st->di++) {
     if (st->eline[st->di].hv) {
-      XFillRectangle (st->display, st->window, st->bgc, 
-      st->eline[st->di].x*st->elwid, 
+      XFillRectangle (st->display, st->window, st->bgc,
+      st->eline[st->di].x*st->elwid,
       st->eline[st->di].y*st->elwid,
       (st->eline[st->di].len+1)*st->elwid, st->elwid);
     } else {
-      XFillRectangle (st->display, st->window, st->bgc, 
-      st->eline[st->di].x*st->elwid, 
+      XFillRectangle (st->display, st->window, st->bgc,
+      st->eline[st->di].x*st->elwid,
       st->eline[st->di].y*st->elwid,
       st->elwid, (st->eline[st->di].len+1)*st->elwid);
     }
     if (st->di==st->eli) /* clear just in case */
-      XFillRectangle(st->display, st->window, st->bgc, 0, 0, 
+      XFillRectangle(st->display, st->window, st->bgc, 0, 0,
         st->xgwa.width, st->xgwa.height);
   }
   if (st->di>st->eli) {
@@ -1493,7 +1492,7 @@ abstractile_init(Display *display, Window window)
 
   /* get screen size and create Graphics Contexts */
   XGetWindowAttributes (display, window, &st->xgwa);
-  gcv.foreground = get_pixel_resource(display, st->xgwa.colormap, 
+  gcv.foreground = get_pixel_resource(display, st->xgwa.colormap,
       "foreground", "Foreground");
   st->fgc = XCreateGC (display, window, GCForeground, &gcv);
   gcv.foreground = get_pixel_resource(display, st->xgwa.colormap,
@@ -1513,12 +1512,12 @@ abstractile_init(Display *display, Window window)
   return st;
 }
 
-static unsigned long 
+static unsigned long
 abstractile_draw (Display *dpy, Window window, void *closure)
 {
   struct state *st = (struct state *) closure;
   int mse, usleep;
+
   gettimeofday(&st->time, NULL);
 
   /* If the window is too small, do nothing, sorry! */
@@ -1538,9 +1537,9 @@ abstractile_draw (Display *dpy, Window window, void *closure)
   }
   mse=_mselapsed(st);
   usleep = ((!st->ii) && (st->mode==MODE_CREATE)) ?  0 :
-      (st->mode==MODE_CREATE) ?  st->sleep*1000000-mse : 
+      (st->mode==MODE_CREATE) ?  st->sleep*1000000-mse :
       /* speed=0-5, goal is 10,8,6,4,2,0 sec normal and 5,4,3,2,1,0 dialog */
-      (5-st->speed)*(2-st->dialog)*100000/st->lpu-mse; 
+      (5-st->speed)*(2-st->dialog)*100000/st->lpu-mse;
   if (usleep>=0)
       return usleep;
   return 0;
index f69e0967f1354a29cb592eae9b2f16c4651f7e11..27af01303fec8266c7cafaf95f4cabac39a8d3f0 100644 (file)
@@ -211,7 +211,8 @@ anemone_init (Display *disp, Window window)
   st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");
   st->ncolors += 3;
   st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
-  make_smooth_colormap (st->dpy, wa.visual, st->cmap, st->colors, &st->ncolors,
+  make_smooth_colormap (wa.screen, wa.visual, st->cmap,
+                        st->colors, &st->ncolors,
                         True, 0, True);
 
   st->gcDraw = XCreateGC(st->dpy, window, 0, &st->gcv);
index 1f3a859d84de052d4f33ba0f78a911665e177625..50f35348566189649de37857af8a438fd25ddfda 100644 (file)
@@ -379,7 +379,8 @@ anemotaxis_init (Display *disp, Window win)
   st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");
   st->ncolors++;
   st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
-  make_random_colormap (st->dpy, wa.visual, wa.colormap, st->colors, &st->ncolors,
+  make_random_colormap (wa.screen, wa.visual, wa.colormap,
+                        st->colors, &st->ncolors,
                         True, True, 0, True);
 
   st->delay = get_integer_resource(st->dpy, "delay", "Integer");
index 0e1508ff1ad514e1a0ca064ab9f58df78634df81..ef21995b2ce9cf85db2ab808f8a0aa9fff79cddf 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1998-2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1998-2013 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
@@ -1778,7 +1778,8 @@ apple2_reshape (Display *dpy, Window window, void *closure,
                  unsigned int w, unsigned int h)
 {
   struct state *st = (struct state *) closure;
-  analogtv_reconfigure (st->sim->dec);
+  if (st->sim)
+    analogtv_reconfigure (st->sim->dec);
 }
 
 static Bool
@@ -1786,7 +1787,8 @@ apple2_event (Display *dpy, Window window, void *closure, XEvent *event)
 {
   struct state *st = (struct state *) closure;
 
-  if (st->controller == terminal_controller &&
+  if (st->sim &&
+      st->controller == terminal_controller &&
       event->xany.type == KeyPress) {
     terminal_keypress_handler (dpy, event, st->sim->controller_data);
     return True;
index ea85f9ad15066faa8f282cbfd7ae1bfc8187eaf9..c841b001bc28e4db4c8064aeac25d7ccd736bb73 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992-2008 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2013 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
@@ -11,8 +11,8 @@
 
 /* Simulation of a pair of quasi-gravitational fields, maybe sorta kinda
    a little like the strong and weak electromagnetic forces.  Derived from
-   a Lispm screensaver by John Pezaris <pz@mit.edu>.  Mouse control and
-   viscosity added by "Philip Edward Cutone, III" <pc2d+@andrew.cmu.edu>.
+   a Lispm screensaver by John Pezaris <pz@mit.edu>.  Viscosity added by
+   Philip Edward Cutone, III <pc2d+@andrew.cmu.edu>.
 
    John sez:
 
@@ -135,12 +135,11 @@ struct state {
   int color_shift;
   int xlim, ylim;
   Bool no_erase_yet; /* for tail mode fix */
-
-  /*flip mods for mouse interaction*/
-  Bool mouse_p;
-  int mouse_x, mouse_y, mouse_mass, root_x, root_y;
   double viscosity;
 
+  int mouse_ball;      /* index of ball being dragged, or 0 if none. */
+  unsigned long mouse_pixel;
+
   enum object_mode mode;
   enum graph_mode graph_mode;
 
@@ -210,11 +209,6 @@ attraction_init (Display *dpy, Window window)
   st->color_shift = get_integer_resource (dpy, "colorShift", "Integer");
   if (st->color_shift <= 0) st->color_shift = 5;
 
-  /*flip mods for mouse interaction*/
-  st->mouse_p = get_boolean_resource (dpy, "mouse", "Boolean");
-  st->mouse_mass = get_integer_resource (dpy, "mouseSize", "Integer");
-  st->mouse_mass =  st->mouse_mass *  st->mouse_mass *10;
-
   st->viscosity = get_float_resource (dpy, "viscosity", "Float");
 
   mode_str = get_string_resource (dpy, "mode", "Mode");
@@ -281,14 +275,16 @@ attraction_init (Display *dpy, Window window)
              double S2 = 1.00;
              double V = frand(0.25) + 0.75;
              st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
-             make_color_ramp (dpy, cmap, H, S1, V, H, S2, V, st->colors, &st->ncolors,
+             make_color_ramp (xgwa.screen, xgwa.visual, cmap,
+                               H, S1, V, H, S2, V, st->colors, &st->ncolors,
                               False, True, False);
            }
          else
            {
              st->ncolors = st->npoints;
              st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
-             make_random_colormap (dpy, xgwa.visual, cmap, st->colors, &st->ncolors,
+             make_random_colormap (xgwa.screen, xgwa.visual, cmap, 
+                                    st->colors, &st->ncolors,
                                    True, True, False, True);
            }
          break;
@@ -298,7 +294,8 @@ attraction_init (Display *dpy, Window window)
        case spline_filled_mode:
        case tail_mode:
          st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
-         make_smooth_colormap (dpy, xgwa.visual, cmap, st->colors, &st->ncolors,
+         make_smooth_colormap (xgwa.screen, xgwa.visual, cmap,
+                                st->colors, &st->ncolors,
                                True, False, True);
          break;
        default:
@@ -313,6 +310,10 @@ attraction_init (Display *dpy, Window window)
       mono_p = True;
     }
 
+  st->mouse_pixel =
+    get_pixel_resource (dpy, cmap, "mouseForeground", "MouseForeground");
+  st->mouse_ball = -1;
+
   if (st->mode != ball_mode)
     {
       int size = (st->segments ? st->segments : 1);
@@ -459,28 +460,6 @@ compute_force (struct state *st, int i, double *dx_ret, double *dy_ret)
          *dy_ret += (frand (10.0) - 5.0);
        }
     }
-
-  if (st->mouse_p)
-    {
-      x_dist = st->mouse_x - st->balls [i].x;
-      y_dist = st->mouse_y - st->balls [i].y;
-      dist2 = (x_dist * x_dist) + (y_dist * y_dist);
-      dist = sqrt (dist2);
-       
-      if (dist > 0.1) /* the balls are not overlapping */
-       {
-         double new_acc = ((st->mouse_mass / dist2) *
-                           ((dist < st->threshold) ? -1.0 : 1.0));
-         double new_acc_dist = new_acc / dist;
-         *dx_ret += new_acc_dist * x_dist;
-         *dy_ret += new_acc_dist * y_dist;
-       }
-      else
-       {               /* the balls are overlapping; move randomly */
-         *dx_ret += (frand (10.0) - 5.0);
-         *dy_ret += (frand (10.0) - 5.0);
-       }
-    }
 }
 
 
@@ -621,15 +600,33 @@ draw_meter_speed (Display *dpy, Window window, struct state *st, int i)
   XDrawRectangle(dpy,window,st->draw_gc, x2,y,w2,h);
 }
 
+/* Returns the position of the mouse relative to the root window.
+ */
+static void
+query_mouse (Display *dpy, Window win, int *x, int *y)
+{
+  Window root1, child1;
+  int mouse_x, mouse_y, root_x, root_y;
+  unsigned int mask;
+  if (XQueryPointer (dpy, win, &root1, &child1,
+                     &root_x, &root_y, &mouse_x, &mouse_y, &mask))
+    {
+      *x = mouse_x;
+      *y = mouse_y;
+    }
+  else
+    {
+      *x = -9999;
+      *y = -9999;
+    }
+}
+
 static unsigned long
 attraction_draw (Display *dpy, Window window, void *closure)
 {
   struct state *st = (struct state *) closure;
   int last_point_stack_fp = st->point_stack_fp;
   
-  Window root1, child1;  /*flip mods for mouse interaction*/
-  unsigned int mask;
-
   int i, radius = st->global_size/2;
 
   st->total_ticks++;
@@ -671,12 +668,6 @@ attraction_draw (Display *dpy, Window window, void *closure)
 
     }
 
-  if (st->mouse_p)
-    {
-      XQueryPointer(dpy, window, &root1, &child1,
-                   &st->root_x, &st->root_y, &st->mouse_x, &st->mouse_y, &mask);
-    }
-
   /* compute the force of attraction/repulsion among all balls */
   for (i = 0; i < st->npoints; i++)
     compute_force (st, i, &st->balls[i].dx, &st->balls[i].dy);
@@ -688,6 +679,7 @@ attraction_draw (Display *dpy, Window window, void *closure)
       double old_y = st->balls[i].y;
       double new_x, new_y;
       int size = st->balls[i].size;
+
       st->balls[i].vx += st->balls[i].dx;
       st->balls[i].vy += st->balls[i].dy;
 
@@ -789,6 +781,21 @@ attraction_draw (Display *dpy, Window window, void *closure)
                 }
             }
         }
+
+      if (i == st->mouse_ball)
+        {
+          int x, y;
+          query_mouse (dpy, window, &x, &y);
+         if (st->mode == ball_mode)
+            {
+              x -= st->balls[i].size / 2;
+              y -= st->balls[i].size / 2;
+            }
+
+          st->balls[i].x = x;
+          st->balls[i].y = y;
+        }
+
       new_x = st->balls[i].x;
       new_y = st->balls[i].y;
 
@@ -813,7 +820,9 @@ attraction_draw (Display *dpy, Window window, void *closure)
                  st->balls[i].pixel_index = (st->ncolors * s);
                }
              XSetForeground (dpy, st->draw_gc,
-                             st->colors[st->balls[i].pixel_index].pixel);
+                              (i == st->mouse_ball
+                               ? st->mouse_pixel
+                               : st->colors[st->balls[i].pixel_index].pixel));
            }
        }
 
@@ -967,6 +976,53 @@ attraction_reshape (Display *dpy, Window window, void *closure,
 static Bool
 attraction_event (Display *dpy, Window window, void *closure, XEvent *event)
 {
+  struct state *st = (struct state *) closure;
+
+  if (event->xany.type == ButtonPress)
+    {
+      int i;
+      if (st->mouse_ball != -1)  /* second down-click?  drop the ball. */
+        {
+          st->mouse_ball = -1;
+          return True;
+        }
+      else
+        {
+          /* When trying to pick up a ball, first look for a click directly
+             inside the ball; but if we don't find it, expand the radius
+             outward until we find something nearby.
+           */
+          int x = event->xbutton.x;
+          int y = event->xbutton.y;
+          float max = 10 * (st->global_size ? st->global_size : MAX_SIZE);
+          float step = max / 100;
+          float r2;
+          for (r2 = step; r2 < max; r2 += step)
+            {
+              for (i = 0; i < st->npoints; i++)
+                {
+                  float d = ((st->balls[i].x - x) * (st->balls[i].x - x) +
+                             (st->balls[i].y - y) * (st->balls[i].y - y));
+                  float r = st->balls[i].size;
+                  if (r2 > r) r = r2;
+                  if (d < r*r)
+                    {
+                      st->mouse_ball = i;
+                      return True;
+                    }
+                }
+            }
+        }
+      return True;
+    }
+  else if (event->xany.type == ButtonRelease)   /* drop the ball */
+    {
+      st->mouse_ball = -1;
+      return True;
+    }
+
+
+
   return False;
 }
 
@@ -999,11 +1055,9 @@ static const char *attraction_defaults [] = {
   "*threshold: 200",
   "*delay:     10000",
   "*glow:      false",
-  "*mouseSize: 10",
   "*walls:     true",
   "*maxspeed:  true",
   "*cbounce:   true",
-  "*mouse:     false",
   "*viscosity: 1.0",
   "*orbit:     false",
   "*colorShift:        3",
@@ -1012,6 +1066,10 @@ static const char *attraction_defaults [] = {
   "*radius:    0",
   "*vx:                0",
   "*vy:                0",
+  "*mouseForeground: white",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
@@ -1029,10 +1087,7 @@ static XrmOptionDescRec attraction_options [] = {
   { "-vx",             ".vx",          XrmoptionSepArg, 0 },
   { "-vy",             ".vy",          XrmoptionSepArg, 0 },
   { "-vmult",          ".vMult",       XrmoptionSepArg, 0 },
-  { "-mouse-size",     ".mouseSize",   XrmoptionSepArg, 0 },
   { "-viscosity",      ".viscosity",   XrmoptionSepArg, 0 },
-  { "-mouse",          ".mouse",       XrmoptionNoArg, "true" },
-  { "-nomouse",                ".mouse",       XrmoptionNoArg, "false" },
   { "-glow",           ".glow",        XrmoptionNoArg, "true" },
   { "-noglow",         ".glow",        XrmoptionNoArg, "false" },
   { "-orbit",          ".orbit",       XrmoptionNoArg, "true" },
index a0a9779a922a516b8ac32abab7043d70c43d3fff..66303553e15be428ac724591f8b2cf4d018a11b6 100644 (file)
@@ -23,7 +23,7 @@ attraction - interactions of opposing forces
 [\-size \fIint\fP] [\-segments \fIint\fP] [\-delay \fIusecs\fP]
 [\-color-shift \fIint\fP] [\-radius \fIint\fP]
 [\-vx \fIint\fP] [\-vy \fIint\fP] [\-glow] [\-noglow]
-[\-orbit] [\-viscosity \fIfloat\fP] [\-mouse] [\-no-mouse] [\-mouse-size]
+[\-orbit] [\-viscosity \fIfloat\fP]
 [\-walls] [\-nowalls] [\-maxspeed] [\-nomaxspeed]
 [\-correct-bounce] [\-fast-bounce]
 [\-fps]
@@ -145,23 +145,10 @@ aren't interesting; lower values cause less motion.
 
 One interesting thing to try is
 .EX
-attraction -viscosity 0.8 -points 75 \\
-  -mouse -geometry =500x500
+attraction -viscosity 0.8 -points 300 -size 10 -geometry =500x500
 .EE
 Give it a few seconds to settle down into a stable clump, and then move
-the mouse through it to make "waves".
-.TP 8
-.B \-mouse
-This will cause the mouse to be considered a control point; it will not be
-drawn, but it will influence the other points, so you can wave the mouse
-and influence the images being created.
-.TP 8
-.B \-no-mouse
-Turns off \fB\-mouse\fP.
-.TP 8
-.B \-mouse-size integer
-In \fB\-mouse\fP mode, this sets the mass of the mouse (analogously to the
-\fB\-size\fP parameter.)
+the drag the mouse through it to make "waves".
 .TP 8
 .B \-nowalls
 This will cause the balls to continue on past the edge of the
@@ -221,7 +208,7 @@ made about the suitability of this software for any purpose.  It is provided
 .SH AUTHOR
 Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
 
-Viscosity and mouse support by Philip Edward Cutone, III.
+Viscosity support by Philip Edward Cutone, III.
 
 Walls, speed limit options, new bouncing, graphs, and tail mode fix by
 Matthew Strait. 31 March 2001
index 1449e1153a8907de59e9f7f8e52ce8d4ff2ed499..080a277b77933cbd1178f353302eb26c868f84a1 100644 (file)
@@ -1129,6 +1129,9 @@ static const char *blaster_defaults [] = {
   "*move_stars_x: 2",
   "*move_stars_y: 1",
   "*move_stars_random: 0",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
index 82661ab028777bb665b17c06bdeaba7ee3e20eae..83f9bd4c8e5a29682ab0525be2c32cc9448a67c4 100644 (file)
@@ -416,6 +416,9 @@ static const char *blitspin_defaults [] = {
   "*duration:  120",
   "*bitmap:    (default)",
   "*geometry:  512x512",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
index 081ba4851c57dc286b35fd16bce13c3a0e2c91ad..d7be5a0f61b23de742d9df45494eae79904d5299 100644 (file)
@@ -84,7 +84,8 @@ static const char sccsid[] = "@(#)bouboule.c  4.00 97/01/01 xlockmore";
                                        "*left3d:               blue    \n"                     \
                                        "*both3d:               magenta \n"                     \
                                        "*none3d:               black   \n"                     \
-                                       "*fpsSolid:             true    \n"
+                                       "*fpsSolid:             true    \n"                     \
+                                       "*ignoreRotation: True  \n"
 
 # define SMOOTH_COLORS
 # define bouboule_handle_event 0
index 5daa72cb982f64eca9745a1a079a49140117eb93..3c811ca00b75b3b11c1b9216a476d1e1e94e0a86 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2005-2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2005-2013 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
@@ -70,7 +70,7 @@ reset_boxes (state *st)
   st->color_horiz_p = random() & 1;
 
   if (st->done_once && st->colors)
-    free_colors (st->dpy, st->xgwa.colormap, st->colors, st->ncolors);
+    free_colors (st->xgwa.screen, st->xgwa.colormap, st->colors, st->ncolors);
 
   if (!st->done_once)
     {
@@ -121,7 +121,7 @@ reset_boxes (state *st)
     {
       st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");  /* re-get */
       if (st->ncolors < 1) st->ncolors = 1;
-      make_smooth_colormap (st->dpy, st->xgwa.visual, st->xgwa.colormap,
+      make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
                             st->colors, &st->ncolors, True, 0, False);
       if (st->ncolors < 1) abort();
       XClearWindow (st->dpy, st->window);
@@ -531,6 +531,9 @@ static const char *boxfit_defaults [] = {
   "*peek:                 False",
   "*grabDesktopImages:     False",   /* HAVE_COCOA */
   "*chooseRandomImages:    True",    /* HAVE_COCOA */
+#ifdef USE_IPHONE
+  "*ignoreRotation:       True",
+#endif
   0
 };
 
index 9ba52c1489275ea9c29b168cfc02705041b7f574..c73b89d785e039b4051394e480c4356498197f81 100644 (file)
@@ -38,6 +38,7 @@ static const char sccsid[] = "@(#)braid.c     5.00 2000/11/01 xlockmore";
                                   "*size: -7 \n" \
                                   "*ncolors: 64 \n" \
                                   "*fpsSolid: true \n" \
+                                  "*ignoreRotation: True" \
 
 # define UNIFORM_COLORS
 # define braid_handle_event 0
index c65d46f0c507f73248e714d5a01a18b54d009e25..71754d14f6275e540fac45e1bafcc197249416dc 100644 (file)
@@ -30,6 +30,7 @@
 
 
 #include <math.h>
+#include <stdint.h>
 #include "screenhack.h"
 
 #ifdef HAVE_XSHM_EXTENSION
 /* #define VERBOSE */
 #define RANDOM() ((int) (random() & 0X7FFFFFFFL))
 
-typedef signed char            int8_;
-typedef unsigned char  uint8_;
-typedef short                  int16_;
-typedef unsigned short uint16_;
-typedef long                   int32_;
-typedef unsigned long  uint32_;
 typedef unsigned char  BOOL;
 
 
@@ -68,6 +63,9 @@ static const char *bumps_defaults [] = {
 #ifdef HAVE_XSHM_EXTENSION
   "*useSHM:            True",
 #endif /* HAVE_XSHM_EXTENSION */
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
@@ -91,9 +89,9 @@ static XrmOptionDescRec bumps_options [] = {
  * a member of TBumps. */
 typedef struct
 {
-       uint8_ *aLightMap;
-       uint16_ nFalloffDiameter, nFalloffRadius;
-       uint16_ nLightDiameter, nLightRadius;
+       uint8_t *aLightMap;
+       uint16_t nFalloffDiameter, nFalloffRadius;
+       uint16_t nLightDiameter, nLightRadius;
        float nAccelX, nAccelY;
        float nAccelMax;
        float nVelocityX, nVelocityY;
@@ -112,17 +110,17 @@ typedef struct
         Pixmap source;
        GC GraphicsContext;
        XColor *xColors;
-       uint32_ *aColors;
+       unsigned long *aColors;
        XImage *pXImage;
 #ifdef HAVE_XSHM_EXTENSION
        XShmSegmentInfo XShmInfo;
        Bool    bUseShm;
 #endif /* HAVE_XSHM_EXTENSION */
 
-       uint8_ nColorCount;                             /* Number of colors used. */
-       uint8_ bytesPerPixel;
-       uint16_ iWinWidth, iWinHeight;
-       uint16_ *aBumpMap;                              /* The actual bump map. */
+       uint8_t nColorCount;                            /* Number of colors used. */
+       uint8_t bytesPerPixel;
+       uint16_t iWinWidth, iWinHeight;
+       uint16_t *aBumpMap;                             /* The actual bump map. */
        SSpotLight SpotLight;
 
         int delay;
@@ -142,37 +140,37 @@ static void SoftenBumpMap( SBumps * );
 
 
 /* This function pointer will point to the appropriate PutPixel*() function below. */
-static void (*MyPutPixel)( int8_ *, uint32_ );
+static void (*MyPutPixel)( int8_t *, uint32_t );
 
-static void PutPixel32( int8_ *pData, uint32_ pixel )
+static void PutPixel32( int8_t *pData, uint32_t pixel )
 {
-       *(uint32_ *)pData = pixel;
+       *(uint32_t *)pData = pixel;
 }
 
-static void PutPixel24( int8_ *pData, uint32_ pixel )
+static void PutPixel24( int8_t *pData, uint32_t pixel )
 {
        pData[ 2 ] = ( pixel & 0x00FF0000 ) >> 16;
        pData[ 1 ] = ( pixel & 0x0000FF00 ) >> 8;
        pData[ 0 ] = ( pixel & 0x000000FF );
 }
 
-static void PutPixel16( int8_ *pData, uint32_ pixel )
+static void PutPixel16( int8_t *pData, uint32_t pixel )
 {
-       *(uint16_ *)pData = (uint16_)pixel;
+       *(uint16_t *)pData = (uint16_t)pixel;
 }
 
-static void PutPixel8( int8_ *pData, uint32_ pixel )
+static void PutPixel8( int8_t *pData, uint32_t pixel )
 {
-       *(uint8_ *)pData = (uint8_)pixel;
+       *(uint8_t *)pData = (uint8_t)pixel;
 }
 
 /* Creates the light map, which is a circular image... going from black around the edges
  * to white in the center. */
-static void CreateSpotLight( SSpotLight *pSpotLight, uint16_ iDiameter, uint16_ nColorCount )
+static void CreateSpotLight( SSpotLight *pSpotLight, uint16_t iDiameter, uint16_t nColorCount )
 {
        double nDist;
-       int16_ iDistX, iDistY;
-       uint8_ *pLOffset;
+       int16_t iDistX, iDistY;
+       uint8_t *pLOffset;
        
        pSpotLight->nFalloffDiameter = iDiameter;
        pSpotLight->nFalloffRadius = pSpotLight->nFalloffDiameter / 2;
@@ -183,7 +181,7 @@ static void CreateSpotLight( SSpotLight *pSpotLight, uint16_ iDiameter, uint16_
        printf( "%s: Spot Light Diameter: %d\n", progclass, pSpotLight->nLightDiameter );
 #endif
 
-       pSpotLight->aLightMap = malloc( pSpotLight->nLightDiameter * pSpotLight->nLightDiameter * sizeof(uint8_) );
+       pSpotLight->aLightMap = malloc( pSpotLight->nLightDiameter * pSpotLight->nLightDiameter * sizeof(uint8_t) );
 
        pLOffset = pSpotLight->aLightMap;
        for( iDistY=-pSpotLight->nLightRadius; iDistY<pSpotLight->nLightRadius; ++iDistY )
@@ -192,7 +190,7 @@ static void CreateSpotLight( SSpotLight *pSpotLight, uint16_ iDiameter, uint16_
                {
                        nDist = sqrt( pow( iDistX+0.5F, 2 ) + pow( iDistY+0.5F, 2 ) );
                        if( nDist / pSpotLight->nLightRadius <= 1.0f )
-                               *pLOffset = (uint8_)(nColorCount - ( ( nDist / pSpotLight->nLightRadius ) * ( nColorCount - 1 ) ));
+                               *pLOffset = (uint8_t)(nColorCount - ( ( nDist / pSpotLight->nLightRadius ) * ( nColorCount - 1 ) ));
                        else
                                *pLOffset = 0;
 
@@ -251,8 +249,8 @@ static void CreateBumps( SBumps *pBumps, Display *dpy, Window NewWin )
 {
        XWindowAttributes XWinAttribs;
        XGCValues GCValues;
-       int32_ nGCFlags;
-       uint16_ iDiameter;
+       int32_t nGCFlags;
+       uint16_t iDiameter;
 
        /* Make size and velocity a function of window size, so it appears the same at 100x60 as it does in 3200x1200. */
        XGetWindowAttributes( dpy, NewWin, &XWinAttribs );
@@ -291,7 +289,7 @@ static void CreateBumps( SBumps *pBumps, Display *dpy, Window NewWin )
        {
                pBumps->pXImage = XCreateImage( pBumps->dpy, XWinAttribs.visual, XWinAttribs.depth, 
                                                                        ZPixmap, 0, NULL, iDiameter, iDiameter, BitmapPad( pBumps->dpy ), 0 );
-               pBumps->pXImage->data = malloc( pBumps->pXImage->bytes_per_line * pBumps->pXImage->height * sizeof(int8_) );
+               pBumps->pXImage->data = malloc( pBumps->pXImage->bytes_per_line * pBumps->pXImage->height * sizeof(int8_t) );
        }
 
        /* For speed, access the XImage data directly using my own PutPixel routine. */
@@ -347,7 +345,7 @@ static void SetPalette(Display *dpy, SBumps *pBumps, XWindowAttributes *pXWinAtt
        XColor BaseColor;
        XColor Color;
        char *sColor;                   /* Spotlight Color */
-       int16_ iColor;
+       int16_t iColor;
        
        sColor = get_string_resource(dpy,  "color", "Color" );
 
@@ -374,7 +372,7 @@ static void SetPalette(Display *dpy, SBumps *pBumps, XWindowAttributes *pXWinAtt
        if( pBumps->nColorCount < 2 )   pBumps->nColorCount = 2;
        if( pBumps->nColorCount > 128 ) pBumps->nColorCount = 128;
 
-       pBumps->aColors = malloc( pBumps->nColorCount * sizeof(uint32_ ) );
+       pBumps->aColors = malloc( pBumps->nColorCount * sizeof(unsigned long) );
 
        /* Creates a phong shade:                 / BaseColor  \                               Index/ColorCount 
         *                                                      PhongShade = | ------------ | Index + ( 65535 - BaseColor )^ 
@@ -382,15 +380,15 @@ static void SetPalette(Display *dpy, SBumps *pBumps, XWindowAttributes *pXWinAtt
        pBumps->nColorCount--;
        for( iColor=0; iColor<=pBumps->nColorCount; iColor++ )
        {
-               Color.red   = (uint16_)( ( ( BaseColor.red   / (double)pBumps->nColorCount ) * iColor ) + pow( 0xFFFF - BaseColor.red,   iColor/(double)pBumps->nColorCount ) );
-               Color.green = (uint16_)( ( ( BaseColor.green / (double)pBumps->nColorCount ) * iColor ) + pow( 0xFFFF - BaseColor.green, iColor/(double)pBumps->nColorCount ) );
-               Color.blue  = (uint16_)( ( ( BaseColor.blue  / (double)pBumps->nColorCount ) * iColor ) + pow( 0xFFFF - BaseColor.blue,  iColor/(double)pBumps->nColorCount ) );
+               Color.red   = (uint16_t)( ( ( BaseColor.red   / (double)pBumps->nColorCount ) * iColor ) + pow( 0xFFFF - BaseColor.red,   iColor/(double)pBumps->nColorCount ) );
+               Color.green = (uint16_t)( ( ( BaseColor.green / (double)pBumps->nColorCount ) * iColor ) + pow( 0xFFFF - BaseColor.green, iColor/(double)pBumps->nColorCount ) );
+               Color.blue  = (uint16_t)( ( ( BaseColor.blue  / (double)pBumps->nColorCount ) * iColor ) + pow( 0xFFFF - BaseColor.blue,  iColor/(double)pBumps->nColorCount ) );
 
                if( !XAllocColor( pBumps->dpy, pXWinAttribs->colormap, &Color ) )
                {
                        XFreeColors( pBumps->dpy, pXWinAttribs->colormap, pBumps->aColors, iColor, 0 );
                        free( pBumps->aColors );
-                       pBumps->aColors = malloc( pBumps->nColorCount * sizeof(uint32_) );
+                       pBumps->aColors = malloc( pBumps->nColorCount * sizeof(unsigned long) );
                        pBumps->nColorCount--;
                        iColor = -1;
                }
@@ -424,11 +422,11 @@ static void InitBumpMap_2(Display *dpy, SBumps *pBumps)
 {
        XImage *pScreenImage;
        XColor *pColor;
-       uint8_ nSoften;
-       uint16_ iWidth, iHeight;
-       uint32_ nAverager;
-       uint16_ *pBump;
-       uint16_ maxHeight;
+       uint8_t nSoften;
+       uint16_t iWidth, iHeight;
+       uint32_t nAverager;
+       uint16_t        *pBump;
+       uint16_t maxHeight;
        double softenMultiplier = 1.0f;
        BOOL bInvert = (BOOL)get_boolean_resource(dpy,  "invert", "Boolean" );
     XWindowAttributes XWinAttribs;
@@ -446,7 +444,7 @@ static void InitBumpMap_2(Display *dpy, SBumps *pBumps)
        XClearWindow (pBumps->dpy, pBumps->Win);
        XSync (pBumps->dpy, 0);
 
-       pBumps->aBumpMap = malloc( pBumps->iWinWidth * pBumps->iWinHeight * sizeof(uint16_) );
+       pBumps->aBumpMap = malloc( pBumps->iWinWidth * pBumps->iWinHeight * sizeof(uint16_t) );
        
        nSoften = get_integer_resource(dpy,  "soften", "Integer" );
        while( nSoften-- )
@@ -510,10 +508,10 @@ static void InitBumpMap_2(Display *dpy, SBumps *pBumps)
  */
 static void SoftenBumpMap( SBumps *pBumps )
 {
-       uint16_ *pOffset, *pTOffset;
-       uint32_ nHeight;
-       uint32_ iWidth, iHeight;
-       uint16_ *aTempBuffer = malloc( pBumps->iWinWidth * pBumps->iWinHeight * sizeof(uint16_) );
+       uint16_t *pOffset, *pTOffset;
+       uint32_t nHeight;
+       uint32_t iWidth, iHeight;
+       uint16_t *aTempBuffer = malloc( pBumps->iWinWidth * pBumps->iWinHeight * sizeof(uint16_t) );
 
        pOffset = pBumps->aBumpMap;
        pTOffset = aTempBuffer;
@@ -539,7 +537,7 @@ static void SoftenBumpMap( SBumps *pBumps )
                }
        }                                               
 
-       memcpy( pBumps->aBumpMap, aTempBuffer, pBumps->iWinWidth * pBumps->iWinHeight * sizeof(uint16_) );
+       memcpy( pBumps->aBumpMap, aTempBuffer, pBumps->iWinWidth * pBumps->iWinHeight * sizeof(uint16_t) );
        free( aTempBuffer );
 }
 
@@ -547,14 +545,14 @@ static void SoftenBumpMap( SBumps *pBumps )
 /* This is where we slap down some pixels... */
 static void Execute( SBumps *pBumps )
 {
-       int32_ nLightXPos, nLightYPos;
-       int32_ iScreenX, iScreenY;
-       int32_ iLightX, iLightY;
-       uint16_ *pBOffset;
-       int8_ *pDOffset;
-       int32_ nX, nY;
-       uint16_ nColor;
-       int32_ nLightOffsetFar = pBumps->SpotLight.nFalloffDiameter - pBumps->SpotLight.nLightRadius;
+       int32_t nLightXPos, nLightYPos;
+       int32_t iScreenX, iScreenY;
+       int32_t iLightX, iLightY;
+       uint16_t *pBOffset;
+       int8_t *pDOffset;
+       int32_t nX, nY;
+       uint16_t nColor;
+       int32_t nLightOffsetFar = pBumps->SpotLight.nFalloffDiameter - pBumps->SpotLight.nLightRadius;
 
        CalcLightPos( pBumps );
        
@@ -569,7 +567,7 @@ static void Execute( SBumps *pBumps )
 
     /* warning: pointer targets in assignment differ in signedness
        Should pDOffset be a int8?  I can't tell.  -jwz, 22-Jul-2003 */
-               pDOffset = (int8_ *) &pBumps->pXImage->data[ (iLightY+pBumps->SpotLight.nLightRadius) * pBumps->pXImage->bytes_per_line ];
+               pDOffset = (int8_t *) &pBumps->pXImage->data[ (iLightY+pBumps->SpotLight.nLightRadius) * pBumps->pXImage->bytes_per_line ];
                pBOffset = pBumps->aBumpMap + ( iScreenY * pBumps->iWinWidth ) + nLightXPos;
                for( iScreenX=nLightXPos, iLightX=-pBumps->SpotLight.nLightRadius; iLightX<nLightOffsetFar; ++iScreenX, ++iLightX, ++pBOffset, pDOffset+=pBumps->bytesPerPixel )
                {
@@ -659,7 +657,7 @@ bumps_init (Display *dpy, Window Win)
 
 #ifdef VERBOSE
        time_t Time = time( NULL );
-       uint16_ iFrame = 0;
+       uint16_t iFrame = 0;
 #endif  /*  VERBOSE */
        
        CreateBumps( Bumps, dpy, Win );
index 6f547bea4f51ed2b46849d14e64455081a86364a..d17bda5e895ad6a4aa3dd3191d8330007c9ce17c 100644 (file)
@@ -701,7 +701,8 @@ ccurve_init (Display *dpy, Window window)
     st->context = XCreateGC (st->dpy, st->window, GCForeground | GCBackground,
                         &values);
     st->color_count = MAXIMUM_COLOR_COUNT;
-    make_color_loop (st->dpy, st->color_map,
+    make_color_loop (hack_attributes.screen, hack_attributes.visual,
+                     st->color_map,
                     0,   1, 1,
                     120, 1, 1,
                     240, 1, 1,
@@ -842,6 +843,9 @@ static const char *ccurve_defaults [] =
     ".delay:      3",
     ".pause:      0.4",
     ".limit: 200000",
+#ifdef USE_IPHONE
+    "*ignoreRotation: True",
+#endif
     0
 };
 
index e9cef13eb4ab77d8f9ef77c4c5b33312b05af796..0bf241c2285599b3b6591c7eb45fdd7c43a4c344 100644 (file)
@@ -838,6 +838,9 @@ static const char *celtic_defaults[] = {
     "*delay: 10000",
     "*delay2: 5",
     "*showGraph: False",
+#ifdef USE_IPHONE
+    "*ignoreRotation: True",
+#endif
     0
 };
 
@@ -919,10 +922,10 @@ celtic_init (Display *d_arg, Window w_arg)
   else
     {
 #if 0
-      make_random_colormap (st->dpy, st->xgwa.visual, st->xgwa.colormap,
+      make_random_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
                             st->colors, &st->ncolors, True, True, 0, True);
 #else
-      make_smooth_colormap (st->dpy, st->xgwa.visual, st->xgwa.colormap,
+      make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
                             st->colors, &st->ncolors, True, 0, True);
 #endif
       if (st->ncolors < 2)
@@ -979,7 +982,7 @@ celtic_draw (Display *dpy, Window window, void *closure)
     /* recolor each time */
     st->ncolors = get_integer_resource (st->dpy, "ncolors", "Integer");
     if (st->ncolors > 2)
-      make_smooth_colormap (st->dpy, st->xgwa.visual, st->xgwa.colormap,
+      make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
                             st->colors, &st->ncolors, True, 0, True);
 
     st->eraser = erase_window (st->dpy, st->window, st->eraser);
index 911b99be27bd8d2c6581a5e5e59d8faed492bed8..4e848ef56619183dfac07b399e05ff390c49a643 100644 (file)
@@ -302,7 +302,8 @@ cloudlife_init (Display *dpy, Window window)
 
     if (st->cycle_colors) {
         st->colors = (XColor *) xrealloc(st->colors, sizeof(XColor) * (st->ncolors+1));
-        make_smooth_colormap (st->dpy, st->xgwa.visual, st->xgwa.colormap, st->colors, &st->ncolors,
+        make_smooth_colormap (st->xgwa.screen, st->xgwa.visual,
+                              st->xgwa.colormap, st->colors, &st->ncolors,
                               True, &tmp, True);
     }
 
@@ -397,6 +398,9 @@ static const char *cloudlife_defaults[] = {
     "*maxAge:          64",
     "*initialDensity:  30",
     "*cellSize:                3",
+#ifdef USE_IPHONE
+    "*ignoreRotation:   True",
+#endif
     0
 };
 
index ccd0e6dea562223f648e79b99ee524603156cfe4..c21080d89f56886aafd20ecfb94683e135b312ca 100644 (file)
@@ -55,6 +55,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALFTONE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALO.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HELIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HEXADROP.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HOPALONG.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERBALL.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERCUBE.C
index ccd0e6dea562223f648e79b99ee524603156cfe4..c21080d89f56886aafd20ecfb94683e135b312ca 100644 (file)
@@ -55,6 +55,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALFTONE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALO.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HELIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HEXADROP.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HOPALONG.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERBALL.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERCUBE.C
index 3c9a1f4e2a8952aa62759a0b439d1fc1dbb8ef20..aefbd9197c3ecf7b2a80396682873596523becce 100644 (file)
@@ -4,8 +4,8 @@
             a screen saver and locker for the X window system
                             by Jamie Zawinski
 
-                              version 5.21
-                               04-Feb-2013
+                              version 5.22
+                               16-Jul-2013
 
                      http://www.jwz.org/xscreensaver/
 
index b4fd4ddaf41a41347009db8c9e1e1549b441755b..46e065533734332accdfccd966a0e52c7fb8fece 100644 (file)
    <xscreensaver-text />
   </vgroup>
   <vgroup>
+   <number id="duration" type="slider" arg="-duration %"
+           _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+           low="10" high="600" default="60"/>
+
    <xscreensaver-image />
    <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
   </vgroup>
index 270ee242c7d569240c9ca46db8c14b156e5ffa69..7079e6aa10f22b783228de4fafa9526414fe6be2 100644 (file)
@@ -4,14 +4,19 @@
 
   <command arg="-root"/>
 
-  <number id="delay" type="slider" arg="-delay %"
-          _label="Frame rate" _low-label="Low" _high-label="High"
-          low="0" high="100000" default="10000"
-          convert="invert"/>
-
-  <number id="speed" type="slider" arg="-speed %"
-          _label="Speed" _low-label="Slow" _high-label="Fast"
-          low="0.1" high="10.0" default="1.0"/>
+  <hgroup>
+   <vgroup>
+    <number id="delay" type="slider" arg="-delay %"
+            _label="Frame rate" _low-label="Low" _high-label="High"
+            low="0" high="100000" default="10000"
+            convert="invert"/>
+   </vgroup>
+   <vgroup>
+    <number id="speed" type="slider" arg="-speed %"
+            _label="Speed" _low-label="Slow" _high-label="Fast"
+            low="0.1" high="10.0" default="1.0"/>
+   </vgroup>
+  </hgroup>
 
   <hgroup>
    <vgroup>
diff --git a/hacks/config/hexadrop.xml b/hacks/config/hexadrop.xml
new file mode 100644 (file)
index 0000000..d44ca84
--- /dev/null
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hexadrop" _label="Hexadrop">
+
+  <command arg="-root"/>
+
+  <hgroup>
+   <vgroup>
+    <number id="delay" type="slider" arg="-delay %"
+            _label="Frame rate" _low-label="Low" _high-label="High"
+            low="0" high="50000" default="30000"
+            convert="invert"/>
+
+    <number id="speed" type="slider" arg="-speed %"
+            _label="Speed" _low-label="Slow" _high-label="Fast"
+             low="0.1" high="4.0" default="1.0"/>
+
+    <number id="size" type="slider" arg="-size %"
+            _label="Tile size" _low-label="Small" _high-label="Large"
+            low="5" high="50" default="15"
+            convert="invert"/>
+   </vgroup>
+
+   <vgroup>
+    <select id="sides">
+     <option id="0" _label="Random shape"/>
+     <option id="3" _label="Triangles"    arg-set="-sides 3"/>
+     <option id="4" _label="Squares"      arg-set="-sides 4"/>
+     <option id="6" _label="Hexagons"     arg-set="-sides 6"/>
+     <option id="5" _label="Octagons"     arg-set="-sides 8"/>
+    </select>
+
+    <select id="uniform">
+     <option id="r-uniform"  _label="Random speed"/>
+     <option id="uniform"    _label="Uniform speed"     arg-set="-uniform-speed"/>
+     <option id="no-uniform" _label="Non-uniform speed" arg-set="-no-uniform-speed"/>
+    </select>
+
+    <select id="lockstep">
+     <option id="r-lockstep"  _label="Random sync"/>
+     <option id="lockstep"    _label="Synchronized"     arg-set="-lockstep"/>
+     <option id="no-lockstep" _label="Non-synchronized" arg-set="-no-lockstep"/>
+    </select>
+
+    <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+   </vgroup>
+  </hgroup>
+
+  <_description>
+Draws a grid of hexagons or other shapes and drops them out.
+
+http://en.wikipedia.org/wiki/Tiling_by_regular_polygons
+
+Written by Jamie Zawinski; 2013.
+  </_description>
+</screensaver>
diff --git a/hacks/config/kaleidocycle.xml b/hacks/config/kaleidocycle.xml
new file mode 100644 (file)
index 0000000..7266e54
--- /dev/null
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="kaleidocycle" _label="Kaleidocycle" gl="yes">
+
+  <command arg="-root"/>
+
+  <number id="delay" type="slider" arg="-delay %"
+          _label="Frame rate" _low-label="Low" _high-label="High"
+          low="0" high="100000" default="30000"
+          convert="invert"/>
+
+  <number id="count" type="slider" arg="-count %"
+          _label="Count" _low-label="8" _high-label="64"
+          low="8" high="64" default="16"/>
+
+  <number id="speed" type="slider" arg="-speed %"
+          _label="Speed" _low-label="Slow" _high-label="Fast"
+          low="0.1" high="8.0" default="1.0"/>
+
+  <boolean id="wander" _label="Wander" arg-set="-wander"/>
+
+  <select id="rotation">
+    <option id="no"  _label="Don't rotate"               arg-set="-spin 0"/>
+    <option id="x"   _label="Rotate around X axis"       arg-set="-spin X"/>
+    <option id="y"   _label="Rotate around Y axis"       arg-set="-spin Y"/>
+    <option id="z"   _label="Rotate around Z axis"/>
+    <option id="xy"  _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+    <option id="xz"  _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+    <option id="yz"  _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+    <option id="xyz" _label="Rotate around all three axes" arg-set="-spin YZ"/>
+  </select>
+
+  <boolean id="wire"    _label="Wireframe"              arg-set="-wireframe"/>
+  <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+  <_description>
+Draw a ring composed of tetrahedra connected at the edges that twists
+and rotates toroidally.
+
+When a series of tetrahedra are joined at the edges in a loop, it is
+possible for them to rotate continously through the center without
+deforming.  This only works with an even number of tetrahedra, and
+there must be eight or more, or they don't fit.
+
+Written by Jamie Zawinski; 2013.
+  </_description>
+</screensaver>
index 3bc86190f2e2af5c469026971071c333870a9622..15a0025fc7bc755efbf4e41a95a1185c9819975f 100644 (file)
@@ -2,7 +2,7 @@
 
 <screensaver name="phosphor" _label="Phosphor">
 
 <command arg="-root"/>
+ <command arg="-root"/>
 
  <hgroup>
   <vgroup>
diff --git a/hacks/config/quasicrystal.xml b/hacks/config/quasicrystal.xml
new file mode 100644 (file)
index 0000000..9fd78c8
--- /dev/null
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="quasicrystal" _label="QuasiCrystal" gl="yes">
+
+  <command arg="-root"/>
+
+  <hgroup>
+   <vgroup>
+    <number id="delay" type="slider" arg="-delay %"
+            _label="Frame rate" _low-label="Low" _high-label="High"
+            low="0" high="100000" default="30000"
+            convert="invert"/>
+
+    <number id="speed" type="slider" arg="-speed %"
+            _label="Speed" _low-label="Slow" _high-label="Fast"
+            low="0.1" high="5.0" default="1.0"/>
+   </vgroup>
+   <vgroup>
+    <number id="count" type="slider" arg="-count %"
+            _label="Density" _low-label="Low" _high-label="High"
+            low="7" high="37" default="17"/>
+
+    <number id="contrast" type="slider" arg="-contrast %"
+            _label="Contrast" _low-label="Low" _high-label="High"
+            low="0" high="100" default="30"/>
+   </vgroup>
+  </hgroup>
+
+  <hgroup>
+   <boolean id="wander"    _label="Displacement" arg-unset="-no-wander"/>
+   <boolean id="spin"      _label="Rotation"     arg-unset="-no-spin"/>
+   <boolean id="symmetric" _label="Symmetry"     arg-unset="-no-symmetry"/>
+   <boolean id="showfps"   _label="Show frame rate" arg-set="-fps"/>
+  </hgroup>
+
+  <_description>
+A quasicrystal is a structure that is ordered but aperiodic.
+Two-dimensional quasicrystals can be generated by adding a set of
+planes where x is the sine of y.  Different complex aperiodic plane
+tilings are produced depending on the period, position, and rotation
+of the component planes, and whether the rotation of the planes is
+evenly distributed around the circle (the "symmetry" option, above)
+or random.
+
+See also the "RD-Bomb", "CWaves" and "Penrose" screen savers.
+
+http://en.wikipedia.org/wiki/Quasicrystal
+
+Written by Jamie Zawinski; 2013.
+  </_description>
+</screensaver>
diff --git a/hacks/config/unknownpleasures.xml b/hacks/config/unknownpleasures.xml
new file mode 100644 (file)
index 0000000..655e5b4
--- /dev/null
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="unknownpleasures" _label="UnknownPleasures" gl="yes">
+
+  <command arg="-root"/>
+
+  <number id="delay" type="slider" arg="-delay %"
+          _label="Frame rate" _low-label="Low" _high-label="High"
+          low="0" high="100000" default="30000"
+          convert="invert"/>
+
+  <number id="speed" type="slider" arg="-speed %"
+          _label="Speed" _low-label="Slow" _high-label="Fast"
+          low="0.1" high="3.0" default="1.0"/>
+
+  <number id="count" type="slider" arg="-count %"
+          _label="Scanlines" _low-label="Few" _high-label="Many"
+          low="3" high="200" default="80"/>
+
+  <number id="resolution" type="slider" arg="-resolution %"
+          _label="Resolution" _low-label="Low" _high-label="High"
+          low="5" high="300" default="100"/>
+
+  <hgroup>
+   <boolean id="ortho" _label="Orthographic Projection" arg-unset="-no-ortho"/>
+   <boolean id="wire"    _label="Wireframe"              arg-set="-wireframe"/>
+   <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+  </hgroup>
+
+  <_description>
+PSR B1919+21 (AKA CP 1919) was the first pulsar ever discovered:
+a spinning neutron star emitting a periodic lighthouse-like beacon.
+An illustration of the signal received from it was published in
+Scientific American in 1971, and later in The Cambridge Encyclopedia
+of Astronomy in 1977, where it was seen by Stephen Morris, the
+drummer of Joy Division, and was consequently appropriated by
+Peter Saville for the cover of the band's album "Unknown Pleasures".
+
+http://en.wikipedia.org/wiki/Pulsar
+http://en.wikipedia.org/wiki/PSR_B1919%2B21
+http://en.wikipedia.org/wiki/Unknown_Pleasures
+http://en.wikipedia.org/wiki/Peter_Saville_%28graphic_designer%29
+http://en.wikipedia.org/wiki/Joy_Division
+
+Written by Jamie Zawinski; 2013.
+  </_description>
+</screensaver>
index 62df14cda924e0d08202ed9a61b4b98e269d9a7b..6cc50daaa322e0677670b7c77c66387da6f7c9fd 100644 (file)
@@ -67,7 +67,7 @@ init_coral(struct state *st)
     if(!st->board) exit(1);
     cmap = xgwa.colormap;
     if( st->ncolors ) {
-        free_colors(st->dpy, cmap, st->colors, st->ncolors);
+        free_colors(xgwa.screen, cmap, st->colors, st->ncolors);
         st->ncolors = 0;
     }
     gcv.foreground = st->default_fg_pixel = get_pixel_resource(st->dpy, cmap, "foreground", "Foreground");
@@ -75,7 +75,8 @@ init_coral(struct state *st)
     gcv.foreground = get_pixel_resource (st->dpy, cmap, "background", "Background");
     st->erase_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
     st->ncolors = NCOLORSMAX;
-    make_uniform_colormap(st->dpy, xgwa.visual, cmap, st->colors, &st->ncolors, True, &writeable, False);
+    make_uniform_colormap(xgwa.screen, xgwa.visual, cmap,
+                          st->colors, &st->ncolors, True, &writeable, False);
     if (st->ncolors <= 0) {
       st->ncolors = 2;
       st->colors[0].red = st->colors[0].green = st->colors[0].blue = 0;
@@ -289,6 +290,9 @@ static const char *coral_defaults[] = {
   "*seeds:     20", /* too many for 640x480, too few for 1280x1024 */
   "*delay:     5",
   "*delay2:    20000",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
index 6f9fa76061320a06e908cc47a3a003eef3083f5d..ab3a6f7366e3ca853b6b2031f950dd212e105ef0 100644 (file)
@@ -216,21 +216,21 @@ setup_colormap (struct state *st, XColor **colors, int *n_colors)
   
   if (!strcmp (color_scheme, "random"))
     {
-      make_random_colormap (st->dpy, st->wattr.visual,
+      make_random_colormap (st->wattr.screen, st->wattr.visual,
                            st->wattr.colormap,
                            *colors, n_colors,
                            True, True, &writable, True);
     }
   else if (!strcmp (color_scheme, "smooth"))
     {
-      make_smooth_colormap (st->dpy, st->wattr.visual,
+      make_smooth_colormap (st->wattr.screen, st->wattr.visual,
                            st->wattr.colormap,
                            *colors, n_colors,
                            True, &writable, True);
     }
   else 
     {
-      make_uniform_colormap (st->dpy, st->wattr.visual,
+      make_uniform_colormap (st->wattr.screen, st->wattr.visual,
                             st->wattr.colormap,
                             *colors, n_colors, True,
                             &writable, True);
@@ -242,7 +242,7 @@ setup_colormap (struct state *st, XColor **colors, int *n_colors)
 static void
 free_colormap (struct state *st, XColor **colors, int n_colors)
 {
-  free_colors (st->dpy, st->wattr.colormap, *colors, n_colors);
+  free_colors (st->wattr.screen, st->wattr.colormap, *colors, n_colors);
   free (*colors);
 }
 
index a1c501d84978099dd886ceb4dd11a3a531996ba0..3acd7caee386f3e211f6e9803ffdf16365d66d0e 100644 (file)
@@ -74,7 +74,8 @@ static const char sccsid[] = "@(#)crystal.c   4.12 98/09/10 xlockmore";
                                                 "*cycles:                200   \n" \
                                                 "*size:                  -15   \n" \
                                                 "*ncolors:               100   \n" \
-                                                "*fpsSolid:              true  \n" \
+                                                "*fpsSolid:       True \n" \
+                                                "*ignoreRotation: True \n" \
 
 # define crystal_handle_event 0
 # include "xlockmore.h"                /* in xscreensaver distribution */
@@ -582,7 +583,8 @@ draw_crystal(ModeInfo * mi)
 
 /* Rotate colours */
        if (cryst->cycle_p) {
-               rotate_colors(display, cryst->cmap, cryst->colors, cryst->ncolors,
+               rotate_colors(mi->xgwa.screen, cryst->cmap,
+                      cryst->colors, cryst->ncolors,
                              cryst->direction);
                if (!(LRAND() % 1000))
                        cryst->direction = -cryst->direction;
@@ -808,7 +810,8 @@ release_crystal(ModeInfo * mi)
                                MI_BG_PIXEL(mi) = cryst->bg;
 #endif
                                if (cryst->colors && cryst->ncolors && !cryst->no_colors)
-                                       free_colors(display, cryst->cmap, cryst->colors, cryst->ncolors);
+                                       free_colors(mi->xgwa.screen, cryst->cmap, cryst->colors,
+                                cryst->ncolors);
                                if (cryst->colors)
                                        (void) free((void *) cryst->colors);
 #if 0 /* #### wrong! -jwz */
@@ -1175,7 +1178,8 @@ init_crystal(ModeInfo * mi)
        if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
 /* Set up colour map */
                if (cryst->colors && cryst->ncolors && !cryst->no_colors)
-                       free_colors(display, cryst->cmap, cryst->colors, cryst->ncolors);
+                       free_colors(mi->xgwa.screen, cryst->cmap,
+                        cryst->colors, cryst->ncolors);
                if (cryst->colors)
                        (void) free((void *) cryst->colors);
                cryst->colors = 0;
@@ -1204,14 +1208,20 @@ init_crystal(ModeInfo * mi)
                }
                if (!cryst->mono_p) {
                        if (!(LRAND() % 10))
-                               make_random_colormap(MI_DISPLAY(mi), MI_VISUAL(mi), cryst->cmap, cryst->colors, &cryst->ncolors,
-                                               True, True, &cryst->cycle_p, True);
+                               make_random_colormap(mi->xgwa.screen, MI_VISUAL(mi),
+                                     cryst->cmap, cryst->colors,
+                                     &cryst->ncolors,
+                                     True, True, &cryst->cycle_p, True);
                        else if (!(LRAND() % 2))
-                               make_uniform_colormap(MI_DISPLAY(mi), MI_VISUAL(mi), cryst->cmap, cryst->colors, &cryst->ncolors,
-                                                     True, &cryst->cycle_p, True);
+                               make_uniform_colormap(mi->xgwa.screen, MI_VISUAL(mi),
+                                      cryst->cmap, cryst->colors,
+                                      &cryst->ncolors, True,
+                                      &cryst->cycle_p, True);
                        else
-                               make_smooth_colormap(MI_DISPLAY(mi), MI_VISUAL(mi), cryst->cmap, cryst->colors, &cryst->ncolors,
-                                                    True, &cryst->cycle_p, True);
+                               make_smooth_colormap(mi->xgwa.screen, MI_VISUAL(mi),
+                                     cryst->cmap, cryst->colors,
+                                     &cryst->ncolors,
+                                     True, &cryst->cycle_p, True);
                }
 #if 0 /* #### wrong! -jwz */
                XInstallColormap(display, cryst->cmap);
index 912ccc705628ec4e81895da0107f931dedf7e3bd..94c235574b1daef78240f2e3b5092624937ab30b 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2007 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2007-2013 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
@@ -57,7 +57,7 @@ cwaves_init (Display *dpy, Window window)
   st->ncolors = get_integer_resource (dpy, "ncolors", "Integer");
   if (st->ncolors < 4) st->ncolors = 4;
   st->colors = (XColor *) malloc (sizeof(*st->colors) * (st->ncolors+1));
-  make_smooth_colormap (st->dpy, st->xgwa.visual, st->xgwa.colormap,
+  make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
                         st->colors, &st->ncolors,
                         True, 0, False);
 
@@ -170,7 +170,8 @@ cwaves_event (Display *dpy, Window window, void *closure, XEvent *event)
   state *st = (state *) closure;
   if (event->type == ButtonPress)
     {
-      make_smooth_colormap (st->dpy, st->xgwa.visual, st->xgwa.colormap,
+      make_smooth_colormap (st->xgwa.screen, st->xgwa.visual,
+                            st->xgwa.colormap,
                             st->colors, &st->ncolors,
                             True, 0, False);
       return True;
@@ -192,6 +193,9 @@ static const char *cwaves_defaults [] = {
   "*scale:                2",
   "*debug:                False",
   "*delay:                20000",
+#ifdef USE_IPHONE
+  "*ignoreRotation:        True",
+#endif
   0
 };
 
index baf3be43562d6e8c0d1faad58ad6df254ac1d751..246a4f0ca149bbe3a8c3a704193e744e030931c4 100644 (file)
@@ -125,7 +125,8 @@ cynosure_init (Display *d, Window w)
   if (mono_p)
     ;
   else {
-    make_smooth_colormap (st->dpy, st->xgwa.visual, st->xgwa.colormap, st->colors, &st->ncolors,
+    make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+                          st->colors, &st->ncolors,
                          True, 0, True);
     if (st->ncolors <= 2) {
       mono_p = True;
@@ -418,6 +419,9 @@ static const char *cynosure_defaults [] = {
   "*sway:              30",
   "*tweak:             20",
   "*gridSize:          12",
+#ifdef USE_IPHONE
+  "*ignoreRotation:     True",
+#endif
   0
 };
 
index 42f8149a1d2d02dc79b4c30819886fc17a286af0..d4927b6070b64fe1ed609c92d1e75d8562d2e8b6 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992-2008 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2013 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
@@ -332,8 +332,8 @@ decayscreen_reshape (Display *dpy, Window window, void *closure,
   XClearWindow (st->dpy, st->window);
   XCopyArea (st->dpy, st->saved, st->window, st->gc,
              0, 0, st->saved_w, st->saved_h,
-             (w - st->saved_w) / 2,
-             (h - st->saved_h) / 2);
+             ((int)w - st->saved_w) / 2,
+             ((int)h - st->saved_h) / 2);
   st->sizex = w;
   st->sizey = h;
 }
@@ -366,6 +366,9 @@ static const char *decayscreen_defaults [] = {
   "*delay:                     10000",
   "*mode:                      random",
   "*duration:                  120",
+#ifdef USE_IPHONE
+  "*ignoreRotation:             True",
+#endif
   0
 };
 
index 69085525a029f9ece95185a471c761628e6b7a95..27ada0502553f698aecf30e05c8b1e268e91dde1 100644 (file)
@@ -1,5 +1,4 @@
-/* xscreensaver, Copyright (c) 1997, 1998, 2002, 2006
- *  Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1997-2013 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
@@ -54,16 +53,16 @@ struct state {
 
 /* copied from make_random_colormap in colors.c */
 static void
-make_mondrian_colormap (Display *dpy, Visual *visual, Colormap cmap,
+make_mondrian_colormap (Screen *screen, Visual *visual, Colormap cmap,
                      XColor *colors, int *ncolorsP,
                      Bool allocate_p,
                      Bool *writable_pP,
                      Bool verbose_p)
 {
+  Display *dpy = DisplayOfScreen (screen);
   Bool wanted_writable = (allocate_p && writable_pP && *writable_pP);
   int ncolors = 8;
   int i;
-  Screen *screen = (dpy ? DefaultScreenOfDisplay(dpy) : 0); /* #### WRONG! */
 
   if (*ncolorsP <= 0) return;
 
@@ -104,7 +103,7 @@ make_mondrian_colormap (Display *dpy, Visual *visual, Colormap cmap,
       unsigned long *pixels = (unsigned long *)
        malloc(sizeof(*pixels) * (ncolors + 1));
 
-      allocate_writable_colors (dpy, cmap, pixels, &ncolors);
+      allocate_writable_colors (screen, cmap, pixels, &ncolors);
       if (ncolors > 0)
        for (i = 0; i < ncolors; i++)
          colors[i].pixel = pixels[i];
@@ -240,17 +239,20 @@ deco_init (Display *dpy, Window window)
       mondrian_set_sizes(st, st->xgwa.width, st->xgwa.height);
 
       /** set up red-yellow-blue-black-white colormap and fgc **/
-      make_mondrian_colormap(dpy, st->xgwa.visual, st->xgwa.colormap,
+      make_mondrian_colormap(st->xgwa.screen, st->xgwa.visual,
+                             st->xgwa.colormap,
                             st->colors, &st->ncolors, True, 0, True);
 
       /** put white in several cells **/
       /** set min-height and min-width to about 10% of total w/h **/
   }
   else if (st->smoothColors)
-      make_smooth_colormap (dpy, st->xgwa.visual, st->xgwa.colormap,
+      make_smooth_colormap (st->xgwa.screen, st->xgwa.visual,
+                            st->xgwa.colormap,
                            st->colors, &st->ncolors, True, 0, True);
   else
-      make_random_colormap (dpy, st->xgwa.visual, st->xgwa.colormap,
+      make_random_colormap (st->xgwa.screen, st->xgwa.visual,
+                            st->xgwa.colormap,
                            st->colors, &st->ncolors, False, True, 0, True);
 
   gcv.line_width = st->old_line_width = st->line_width;
@@ -311,6 +313,9 @@ static const char *deco_defaults [] = {
   "*goldenRatio:        False",
   "*smoothColors:       False",
   "*mondrian:           False",
+#ifdef USE_IPHONE
+  "*ignoreRotation:     True",
+#endif
   0
 };
 
index 27ba04843921e9173582e17e64ca1e23bc19f203..06cfe1b9dc7373b3c4d1b15e4331930f8f6fcc04 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1999-2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1999-2013 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
@@ -62,7 +62,14 @@ draw_star (struct state *st, Drawable w, struct throbber *t)
   XPoint points[11];
   int x = t->x;
   int y = t->y;
-  int s = t->size / 0.383;  /* trial and error, I forget how to derive this */
+
+  /*
+    The following constant is really:
+      sqrt(5 - sqrt(5)) / sqrt(25 - 11 * sqrt(5))
+
+    Reference: http://mathworld.wolfram.com/Pentagram.html
+  */
+  int s = t->size * 2.6180339887498985;
   int s2 = t->size;
   double c = M_PI * 2;
   double o = -M_PI / 2;
@@ -312,7 +319,7 @@ deluxe_init (Display *dpy, Window window)
 #ifndef HAVE_COCOA
     COLOR:
 #endif
-      make_random_colormap (st->dpy, st->xgwa.visual, st->xgwa.colormap,
+      make_random_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
                             st->colors, &st->ncolors, True, True, 0, True);
       if (st->ncolors < 2)
         goto MONO;
@@ -431,6 +438,9 @@ static const char *deluxe_defaults [] = {
   "*useDBE:            True",
   "*useDBEClear:       True",
 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+#ifdef USE_IPHONE
+  "*ignoreRotation:     True",
+#endif
   0
 };
 
index c9a15e25c711d51d47cf89c2d1f0a2cb042a351e..947134841ec64482f0c09ccb891418bd9085f842 100644 (file)
@@ -58,6 +58,7 @@ static const char sccsid[] = "@(#)demon.c     5.00 2000/11/01 xlockmore";
                                        "*size:    -7    \n" \
                                        "*ncolors: 64    \n" \
                                        "*fpsSolid: true    \n" \
+                                   "*ignoreRotation: True  \n" \
 
 # define demon_handle_event 0
 # define UNIFORM_COLORS
index 1746f726c2e08653c9c0b79de3ccd92dfd5c2aea..a78690d033388921cb3c6ebfc34176bd001ba293 100644 (file)
@@ -38,6 +38,7 @@ static const char sccsid[] = "@(#)discrete.c  5.00 2000/11/01 xlockmore";
                                        "*cycles: 2500 \n" \
                                        "*ncolors: 100 \n" \
                                        "*fpsSolid: true \n" \
+                                   "*ignoreRotation: True \n" \
 
 # define SMOOTH_COLORS
 # define discrete_handle_event 0
index b2411fc7327fb88ac7939afe33c2b404fa44ed7e..8173c43b96bcdc61a1ff92217abc3b2cc52e5003 100644 (file)
@@ -834,6 +834,9 @@ static const char *distort_defaults [] = {
 #ifdef HAVE_XSHM_EXTENSION
        "*useSHM:                       False",         /* xshm turns out not to help. */
 #endif /* HAVE_XSHM_EXTENSION */
+#ifdef USE_IPHONE
+  "*ignoreRotation:     True",
+#endif
        0
 };
 
index 711bc09e96991348213b0b49e5af500fcd4e42b8..3547ca5109c2d69638f7da29d90a8e0e31b64a5f 100644 (file)
@@ -36,6 +36,7 @@ static const char sccsid[] = "@(#)drift.c     5.00 2000/11/01 xlockmore";
                                  "*count: 30 \n" \
                                  "*ncolors: 200 \n" \
                                  "*fpsSolid: true \n" \
+                                 "*ignoreRotation: True \n" \
 
 # define SMOOTH_COLORS
 # define drift_handle_event 0
index 004c0ea56a1a9d123efc4a1ebc0b7dc52e81230e..288999fa95bbf7220b50769c69d3d950a3600db3 100644 (file)
@@ -65,6 +65,9 @@ static const char *epicycle_defaults [] = {
   "*divisorPoisson: 0.4",
   "*sizeFactorMin: 1.05",
   "*sizeFactorMax: 2.05",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
@@ -401,7 +404,7 @@ colour_init(struct state *st, XWindowAttributes *pxgwa)
    */
   if (st->colors)
     {
-      free_colors(st->dpy, st->cmap, st->colors, st->ncolors);
+      free_colors(pxgwa->screen, st->cmap, st->colors, st->ncolors);
       st->colors = 0;
       st->ncolors = 0;
     }
@@ -421,7 +424,8 @@ colour_init(struct state *st, XWindowAttributes *pxgwa)
       st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
       if (!st->colors) abort();
          
-      make_smooth_colormap (st->dpy, pxgwa->visual, st->cmap, st->colors, &st->ncolors,
+      make_smooth_colormap (pxgwa->screen, pxgwa->visual, st->cmap,
+                            st->colors, &st->ncolors,
                            True, /* allocate */
                            False, /* not writable */
                            True); /* verbose (complain about failure) */
index 2a3700bf4053c5a1e8c9501126647302acc011f6..307bfd299fc9045a665d5d21d7e1adf5a224d4c5 100644 (file)
@@ -47,6 +47,7 @@ static const char sccsid[] = "@(#)euler2d.c   5.00 2000/11/01 xlockmore";
                                        "*cycles:  3000  \n" \
                                        "*ncolors: 64    \n" \
                                        "*fpsSolid: true    \n" \
+                                       "*ignoreRotation: True \n" \
 
 # define euler2d_handle_event 0
 # define SMOOTH_COLORS
index 9fa65f8f13f10acb2ff58f6304c194683d7c9d56..25fe734325770a3d29709aab4e14b48fd35dacb1 100644 (file)
@@ -35,6 +35,7 @@ static const char sccsid[] = "@(#)fadeplot.c  5.00 2000/11/01 xlockmore";
                                        "*cycles: 1500 \n" \
                                        "*ncolors: 64 \n" \
                                        "*fpsSolid: true \n" \
+                                       "*ignoreRotation: True \n" \
 
 # define BRIGHT_COLORS
 # define UNIFORM_COLORS
index 18148a3e3dc052237483255e65bd621a6689c543..11bc5e5b478c3755443ed12437dcfe22da1ef17f 100644 (file)
@@ -45,7 +45,7 @@
 #define HEIGHT 632                /* 548     */
 #define SHELLCOUNT 4              /* FIXED NUMBER; for SSE optimization */
 #define PIXCOUNT 500              /* 500     */
-#define SHELL_LIFE_DEFAULT 3200   /* 3200    */
+#define SHELL_LIFE_DEFAULT 32     /* 32      */
 #define SHELL_LIFE_RATIO 6        /* 6       */
 #define POWDER 5.0                /* 5.0     */
 #define FTWEAK 12                 /* 12      */
@@ -709,6 +709,9 @@ fireworkx_init (Display *dpy, Window win)
        st->shoot          = get_boolean_resource(st->dpy, "shoot"   , "Boolean");
        st->verbose        = get_boolean_resource(st->dpy, "verbose" , "Boolean");
        st->max_shell_life = get_integer_resource(st->dpy, "maxlife" , "Integer");
+        /* transition from xscreensaver <= 5.20 */
+       if (st->max_shell_life > 100) st->max_shell_life = 100;
+
        st->delay          = get_integer_resource(st->dpy, "delay"   , "Integer");
 
        st->max_shell_life = pow(10.0,(st->max_shell_life/50.0)+2.7);
@@ -735,7 +738,8 @@ fireworkx_init (Display *dpy, Window win)
        {
                st->colors = (XColor *) calloc(sizeof(XColor),st->ncolors+1);
                writable = False;
-               make_smooth_colormap(st->dpy, vi, cmap, st->colors, &st->ncolors,
+               make_smooth_colormap(xwa.screen, vi, cmap,
+                                     st->colors, &st->ncolors,
                                     False, &writable, True);
        }
        st->gc = XCreateGC(st->dpy, win, 0, &gcv);
index eed6287cefd3a6141475b8100533527789d6fb8a..18db22daec2569cea20b43586151f509c4a7a6b7 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1993-2008 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1993-2013 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
@@ -151,7 +151,8 @@ flame_init (Display *dpy, Window window)
       st->ncolors = get_integer_resource (st->dpy, "colors", "Integer");
       if (st->ncolors <= 0) st->ncolors = 128;
       st->colors = (XColor *) malloc ((st->ncolors+1) * sizeof (*st->colors));
-      make_smooth_colormap (st->dpy, xgwa.visual, xgwa.colormap, st->colors, &st->ncolors,
+      make_smooth_colormap (xgwa.screen, xgwa.visual, xgwa.colormap,
+                            st->colors, &st->ncolors,
                            True, 0, True);
       if (st->ncolors <= 2)
        mono_p = True, st->ncolors = 0;
@@ -418,6 +419,9 @@ static const char *flame_defaults [] = {
   "*delay:     50000",
   "*delay2:    2000000",
   "*points:    10000",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
index 958f7bc1b37272f34699143ef2380e9c572e1044..6bab228740d4c38266dfa2fec6fe9b2691c60fbd 100644 (file)
@@ -328,6 +328,12 @@ fluidballs_init (Display *dpy, Window window)
   state->shake_p = get_boolean_resource (dpy, "shake", "Shake");
   state->shake_threshold = get_float_resource (dpy, "shakeThreshold",
                                                "ShakeThreshold");
+  state->time_tick = 999999;
+
+# ifdef USE_IPHONE     /* Always obey real-world gravity */
+  state->shake_p = False;
+# endif
+
 
   state->fps_p = get_boolean_resource (dpy, "doFPS", "DoFPS");
   if (state->fps_p)
@@ -443,6 +449,20 @@ check_wall_clock (b_state *state, float max_d)
 
       state->time_since_shake += (now.tv_sec - state->last_time.tv_sec);
 
+# ifdef USE_IPHONE     /* Always obey real-world gravity */
+      {
+        float a = fabs (fabs(state->accx) > fabs(state->accy)
+                        ? state->accx : state->accy);
+        switch ((int) current_device_rotation ()) {
+        case    0: case  360: state->accx =  0; state->accy =  a; break;
+        case  -90:            state->accx = -a; state->accy =  0; break;
+        case   90:            state->accx =  a; state->accy =  0; break;
+        case  180: case -180: state->accx =  0; state->accy = -a; break;
+        default: break;
+        }
+      }
+# endif /* USE_IPHONE */
+
       if (state->fps_p) 
        {
          float elapsed = ((now.tv_sec  + (now.tv_usec  / 1000000.0)) -
@@ -715,17 +735,29 @@ fluidballs_event (Display *dpy, Window window, void *closure, XEvent *event)
           return True;
         }
       else
-        for (i=1; i <= state->count; i++)
-          {
-            float d = ((state->px[i] - rx) * (state->px[i] - rx) +
-                       (state->py[i] - ry) * (state->py[i] - ry));
-            float r = state->r[i];
-            if (d < r*r)
+        {
+          /* When trying to pick up a ball, first look for a click directly
+             inside the ball; but if we don't find it, expand the radius
+             outward until we find something nearby.
+           */
+          float max = state->max_radius * 4;
+          float step = max / 10;
+          float r2;
+          for (r2 = step; r2 < max; r2 += step) {
+            for (i = 1; i <= state->count; i++)
               {
-                state->mouse_ball = i;
-                return True;
+                float d = ((state->px[i] - rx) * (state->px[i] - rx) +
+                           (state->py[i] - ry) * (state->py[i] - ry));
+                float r = state->r[i];
+                if (r2 > r) r = r2;
+                if (d < r*r)
+                  {
+                    state->mouse_ball = i;
+                    return True;
+                  }
               }
           }
+        }
       return True;
     }
   else if (event->xany.type == ButtonRelease)   /* drop the ball */
@@ -780,6 +812,9 @@ static const char *fluidballs_defaults [] = {
   "*useDBE:            True",
   "*useDBEClear:       True",
 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+#ifdef USE_IPHONE
+  "*ignoreRotation:    True",
+#endif
   0
 };
 
index 43a0b5bf49500f609d58bbc90393bda0d5b5ae48..8003941336a38d3bf319f77191a20df49a887539 100644 (file)
@@ -45,6 +45,7 @@ static const char sccsid[] = "@(#)galaxy.c 4.04 97/07/28 xlockmore";
                                        "*cycles:  250   \n"   \
                                        "*ncolors:  64   \n" \
                                        "*fpsSolid:  true   \n" \
+                                       "*ignoreRotation: True \n" \
 
 # define UNIFORM_COLORS
 # define galaxy_handle_event 0
index 815ca6c29d5ce01a321127d7307bb00837c58eee..03de047b892bbf166a1d3b39065bca68be80943b 100644 (file)
@@ -116,7 +116,8 @@ SRCS                = xscreensaver-gl-helper.c normals.c glxfonts.c fps-gl.c \
                  jigsaw.c photopile.c dropshadow.c rubikblocks.c surfaces.c \
                  hilbert.c companion.c companion_quad.c companion_disc.c \
                  companion_heart.c tronbit.c tronbit_idle1.c tronbit_idle2.c \
-                 tronbit_no.c tronbit_yes.c jwzgles.c
+                 tronbit_no.c tronbit_yes.c jwzgles.c kaleidocycle.c \
+                 quasicrystal.c unknownpleasures.c
 
 OBJS           = xscreensaver-gl-helper.o normals.o glxfonts.o fps-gl.o \
                  atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \
@@ -155,7 +156,8 @@ OBJS                = xscreensaver-gl-helper.o normals.o glxfonts.o fps-gl.o \
                  jigsaw.o photopile.o dropshadow.o rubikblocks.o surfaces.o \
                  hilbert.o companion.o companion_quad.o companion_disc.o \
                  companion_heart.o tronbit.o tronbit_idle1.o tronbit_idle2.o \
-                 tronbit_no.o tronbit_yes.o jwzgles.o
+                 tronbit_no.o tronbit_yes.o jwzgles.o kaleidocycle.o \
+                 quasicrystal.o unknownpleasures.o
 
 GL_EXES                = cage gears moebius pipes sproingies stairs superquadrics \
                  morph3d rubik atlantis lament bubble3d glplanet pulsar \
@@ -170,7 +172,8 @@ GL_EXES             = cage gears moebius pipes sproingies stairs superquadrics \
                  antmaze tangram crackberg glhanoi cube21 timetunnel \
                  juggler3d topblock glschool glcells voronoi moebiusgears \
                  lockward cubicgrid hypnowheel skytentacles jigsaw photopile \
-                 rubikblocks surfaces hilbert companioncube tronbit
+                 rubikblocks surfaces hilbert companioncube tronbit \
+                 kaleidocycle quasicrystal unknownpleasures
 GLE_EXES       = extrusion
 SUID_EXES      = sonar
 GL_UTIL_EXES   = xscreensaver-gl-helper
@@ -225,7 +228,8 @@ GL_MEN              = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
                  voronoi.man moebiusgears.man lockward.man cubicgrid.man \
                  hypnowheel.man skytentacles.man sonar.man jigsaw.man \
                  photopile.man rubikblocks.man surfaces.man hilbert.man \
-                 companioncube.man tronbit.man
+                 companioncube.man tronbit.man kaleidocycle.man \
+                 quasicrystal.man unknownpleasures.man
 MEN            = @GL_MEN@
 RETIRED_MEN    = glforestfire.man
 EXTRAS         = README Makefile.in dxf2gl.pl vrml2gl.pl wfront2gl.pl \
@@ -817,6 +821,17 @@ TBIT_OBJS=tronbit.o tronbit_idle1.o tronbit_idle2.o tronbit_no.o tronbit_yes.o\
 tronbit:                       $(TBIT_OBJS)
        $(CC_HACK) -o $@        $(TBIT_OBJS) $(HACK_LIBS)
 
+KALEIDOCYCLE_OBJS=kaleidocycle.o normals.o $(HACK_TRACK_OBJS)
+kaleidocycle:                  $(KALEIDOCYCLE_OBJS)
+       $(CC_HACK) -o $@        $(KALEIDOCYCLE_OBJS) $(HACK_LIBS)
+
+quasicrystal:  quasicrystal.o  $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+unknownpleasures: unknownpleasures.o   $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+
 ##############################################################################
 #
 # DO NOT DELETE: updated by make distdepend
@@ -1960,6 +1975,24 @@ juggler3d.o: $(HACK_SRC)/xlockmoreI.h
 juggler3d.o: $(HACK_SRC)/xlockmore.h
 jwzgles.o: ../../config.h
 jwzgles.o: $(srcdir)/jwzglesI.h
+kaleidocycle.o: ../../config.h
+kaleidocycle.o: $(HACK_SRC)/fps.h
+kaleidocycle.o: $(srcdir)/gltrackball.h
+kaleidocycle.o: $(srcdir)/jwzglesI.h
+kaleidocycle.o: $(srcdir)/jwzgles.h
+kaleidocycle.o: $(srcdir)/normals.h
+kaleidocycle.o: $(srcdir)/rotator.h
+kaleidocycle.o: $(HACK_SRC)/screenhackI.h
+kaleidocycle.o: $(UTILS_SRC)/colors.h
+kaleidocycle.o: $(UTILS_SRC)/grabscreen.h
+kaleidocycle.o: $(UTILS_SRC)/hsv.h
+kaleidocycle.o: $(UTILS_SRC)/resources.h
+kaleidocycle.o: $(UTILS_SRC)/usleep.h
+kaleidocycle.o: $(UTILS_SRC)/visual.h
+kaleidocycle.o: $(UTILS_SRC)/xshm.h
+kaleidocycle.o: $(UTILS_SRC)/yarandom.h
+kaleidocycle.o: $(HACK_SRC)/xlockmoreI.h
+kaleidocycle.o: $(HACK_SRC)/xlockmore.h
 klein.o: ../../config.h
 klein.o: $(HACK_SRC)/fps.h
 klein.o: $(srcdir)/gltrackball.h
@@ -2296,6 +2329,22 @@ pulsar.o: $(UTILS_SRC)/yarandom.h
 pulsar.o: $(HACK_SRC)/xlockmoreI.h
 pulsar.o: $(HACK_SRC)/xlockmore.h
 pulsar.o: $(srcdir)/xpm-ximage.h
+quasicrystal.o: ../../config.h
+quasicrystal.o: $(HACK_SRC)/fps.h
+quasicrystal.o: $(srcdir)/jwzglesI.h
+quasicrystal.o: $(srcdir)/jwzgles.h
+quasicrystal.o: $(srcdir)/rotator.h
+quasicrystal.o: $(HACK_SRC)/screenhackI.h
+quasicrystal.o: $(UTILS_SRC)/colors.h
+quasicrystal.o: $(UTILS_SRC)/grabscreen.h
+quasicrystal.o: $(UTILS_SRC)/hsv.h
+quasicrystal.o: $(UTILS_SRC)/resources.h
+quasicrystal.o: $(UTILS_SRC)/usleep.h
+quasicrystal.o: $(UTILS_SRC)/visual.h
+quasicrystal.o: $(UTILS_SRC)/xshm.h
+quasicrystal.o: $(UTILS_SRC)/yarandom.h
+quasicrystal.o: $(HACK_SRC)/xlockmoreI.h
+quasicrystal.o: $(HACK_SRC)/xlockmore.h
 queens.o: $(srcdir)/chessmodels.h
 queens.o: ../../config.h
 queens.o: $(HACK_SRC)/fps.h
@@ -2840,6 +2889,22 @@ tunnel_draw.o: $(UTILS_SRC)/visual.h
 tunnel_draw.o: $(UTILS_SRC)/xshm.h
 tunnel_draw.o: $(UTILS_SRC)/yarandom.h
 tunnel_draw.o: $(HACK_SRC)/xlockmoreI.h
+unknownpleasures.o: ../../config.h
+unknownpleasures.o: $(HACK_SRC)/fps.h
+unknownpleasures.o: $(srcdir)/gltrackball.h
+unknownpleasures.o: $(srcdir)/jwzglesI.h
+unknownpleasures.o: $(srcdir)/jwzgles.h
+unknownpleasures.o: $(HACK_SRC)/screenhackI.h
+unknownpleasures.o: $(UTILS_SRC)/colors.h
+unknownpleasures.o: $(UTILS_SRC)/grabscreen.h
+unknownpleasures.o: $(UTILS_SRC)/hsv.h
+unknownpleasures.o: $(UTILS_SRC)/resources.h
+unknownpleasures.o: $(UTILS_SRC)/usleep.h
+unknownpleasures.o: $(UTILS_SRC)/visual.h
+unknownpleasures.o: $(UTILS_SRC)/xshm.h
+unknownpleasures.o: $(UTILS_SRC)/yarandom.h
+unknownpleasures.o: $(HACK_SRC)/xlockmoreI.h
+unknownpleasures.o: $(HACK_SRC)/xlockmore.h
 voronoi.o: ../../config.h
 voronoi.o: $(HACK_SRC)/fps.h
 voronoi.o: $(srcdir)/jwzglesI.h
index d0c84ed083a67cb7ba459db2633e729bbd5be9ca..b9a290e3ba8716a606401b2d1df090e2cc615b61 100644 (file)
@@ -19,7 +19,6 @@
 
 
 #define DEFAULTS       "*delay:        30000       \n" \
-                       "*count:        1           \n" \
                        "*showFPS:      False       \n" \
                        "*count:        3           \n" \
                        "*wireframe:    False       \n" \
index 8ae8143f0670b567d5db44e89e393ba53dd24a78..3f92a545323d2e93fa5b6680cf8a8cca36913a1b 100644 (file)
@@ -458,7 +458,7 @@ init_cube (ModeInfo *mi)
     H[2] = ((H[1] + shift) < 360) ? (H[1]+shift) : (H[1] + shift - 360);
     S[0] = S[1] = S[2] = 1.0;
     V[0] = V[1] = V[2] = 1.0;
-    make_color_loop(0, 0,
+    make_color_loop(0, 0, 0,
                    H[0], S[0], V[0], 
                    H[1], S[1], V[1], 
                    H[2], S[2], V[2], 
index 1b192428deb070565135ed6ebe71cf54bb5f20b3..d6c5514830875f26af237260d669a24737e0b35c 100644 (file)
@@ -2305,10 +2305,7 @@ draw_logo (ModeInfo *mi)
   {
     GLfloat scale = 0;
     glScalef(3, 3, 3);
-
-# ifdef USE_IPHONE
-    glScalef (0.7, 0.7, 0.7);  /* make room for the frame */
-# endif
+    glScalef (0.6, 0.6, 0.6);
 
     glColor3f(dc->color[0], dc->color[1], dc->color[2]);
 
index 8c44bff3983a777886742774909a8bc07954c901..9c37c8b8647ba8db0e2d16f587e4779018ea74f6 100644 (file)
@@ -284,13 +284,13 @@ static void make_tables(Engine *e)
   float f;
 
   f = ONEREV / (M_PI * 2);
-  for (i = 0 ; i <= TWOREV ; i++) {
+  for (i = 0 ; i < TWOREV ; i++) {
     e->sin_table[i] = sin(i/f);
   }
-  for (i = 0 ; i <= TWOREV ; i++) {
+  for (i = 0 ; i < TWOREV ; i++) {
     e->cos_table[i] = cos(i/f);
   }
-  for (i = 0 ; i <= TWOREV ; i++) {
+  for (i = 0 ; i < TWOREV ; i++) {
     e->tan_table[i] = tan(i/f);
   }
 }
index 25ceb422112b234d6f848120b594efec2654b173..227327fcf4d81ea0b8b949b7692fb6286427ca54 100644 (file)
@@ -1,5 +1,5 @@
 /* font-ximage.c --- renders text to an XImage for use with OpenGL.
- * xscreensaver, Copyright (c) 2001, 2003 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 2001-2013 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
@@ -134,6 +134,8 @@ text_to_ximage (Screen *screen, Visual *visual,
         overall.rbearing = MAX(overall.rbearing, o2.rbearing);
         lines++;
       }
+    free (text);
+    text = 0;
 
     width = overall.lbearing + overall.rbearing + margin + margin + 1;
     height = ((f->ascent + f->descent) * lines) + margin + margin;
index eb522a031b2b0b7e9f256c2b1a1e5001d25974f6..158a42347674a6f1e715ffaf038d787567757ded 100644 (file)
@@ -157,7 +157,7 @@ init_glschool(ModeInfo *mi)
        sc->nColors = 360;
        sc->context = init_GL(mi);
        sc->colors = (XColor *)calloc(sc->nColors, sizeof(XColor));
-       make_color_ramp(0, 0,
+       make_color_ramp(0, 0, 0,
                                        0.0, 1.0, 1.0,
                                        359.0, 1.0, 1.0,
                                        sc->colors, &sc->nColors,
index 93d4c54263ef97e2610616d794013e10f0acbc5d..ee54cf91d2432f4a541774a742621d77286a54c4 100644 (file)
@@ -116,8 +116,8 @@ gltrackball_mousewheel (trackball_state *ts,
                         int button, int percent, int flip_p)
 {
   int up_p;
-  double move;
   int horizontal_p;
+  int mx, my, move, scale;
 
 #ifdef HAVE_COCOA
   flip_p = 0;      /* MacOS has already handled this. */
@@ -137,15 +137,14 @@ gltrackball_mousewheel (trackball_state *ts,
       up_p = !up_p;
     }
 
+  scale = mx = my = 1000;
   move = (up_p
-          ? 1.0 - (percent / 100.0)
-          : 1.0 + (percent / 100.0));
-
-  gltrackball_start (ts, 50, 50, 100, 100);
-  if (horizontal_p)
-    gltrackball_track (ts, 50*move, 50, 100, 100);
-  else
-    gltrackball_track (ts, 50, 50*move, 100, 100);
+          ? floor (scale * (1.0 - (percent / 100.0)))
+          : ceil  (scale * (1.0 + (percent / 100.0))));
+  if (horizontal_p) mx = move;
+  else              my = move;
+  gltrackball_start (ts, scale, scale, scale*2, scale*2);
+  gltrackball_track (ts, mx, my, scale*2, scale*2);
 }
 
 void
index f70b120ba1e1c2436cbdacfe3e7d6d4d2e7d774d..8fe0ebcbdaefafc8b525c2cd1f14469165d86d35 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2012-2013 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
@@ -1027,6 +1027,7 @@ jwzgles_glTexCoord1f (GLfloat s)
 }
 
 
+/* glColor: GLfloat */
 
 void
 jwzgles_glColor4fv (const GLfloat *v)
@@ -1079,77 +1080,230 @@ jwzgles_glColor4f (GLfloat r, GLfloat g, GLfloat b, GLfloat a)
   jwzgles_glColor4fv (v);
 }
 
-
 void
 jwzgles_glColor3f (GLfloat r, GLfloat g, GLfloat b)
 {
   jwzgles_glColor4f (r, g, b, 1);
 }
 
-
 void
 jwzgles_glColor3fv (const GLfloat *v)
 {
-  GLfloat vv[4];
-  vv[0] = v[0];
-  vv[1] = v[1];
-  vv[2] = v[2];
-  vv[3] = 1;
-  jwzgles_glColor4fv (vv);
+  jwzgles_glColor3f (v[0], v[1], v[2]);
 }
 
 
+/* glColor: GLdouble */
+
 void
-jwzgles_glColor4i (GLuint r, GLuint g, GLuint b, GLuint a)
+jwzgles_glColor4d (GLdouble r, GLdouble g, GLdouble b, GLdouble a)
 {
   jwzgles_glColor4f (r, g, b, a);
 }
 
+void
+jwzgles_glColor4dv (const GLdouble *v)
+{
+  jwzgles_glColor4d (v[0], v[1], v[2], v[3]);
+}
 
 void
-jwzgles_glColor3i (GLuint r, GLuint g, GLuint b)
+jwzgles_glColor3d (GLdouble r, GLdouble g, GLdouble b)
 {
-  jwzgles_glColor4f (r, g, b, 1);
+  jwzgles_glColor4d (r, g, b, 1.0);
+}
+
+void
+jwzgles_glColor3dv (const GLdouble *v)
+{
+  jwzgles_glColor3d (v[0], v[1], v[2]);
 }
 
 
+/* glColor: GLint (INT_MIN - INT_MAX) */
+
+void
+jwzgles_glColor4i (GLint r, GLint g, GLint b, GLint a)
+{
+  /* -0x8000000 - 0x7FFFFFFF  =>  0.0 - 1.0 */
+  jwzgles_glColor4f (0.5 + (GLfloat) r / 0xFFFFFFFF,
+                     0.5 + (GLfloat) g / 0xFFFFFFFF, 
+                     0.5 + (GLfloat) b / 0xFFFFFFFF,
+                     0.5 + (GLfloat) a / 0xFFFFFFFF);
+}
+
 void
 jwzgles_glColor4iv (const GLint *v)
 {
-  GLfloat vv[4];
-  vv[0] = v[0];
-  vv[1] = v[1];
-  vv[2] = v[2];
-  vv[3] = v[3];
-  jwzgles_glColor4fv (vv);
+  jwzgles_glColor4i (v[0], v[1], v[2], v[3]);
 }
 
 
+void
+jwzgles_glColor3i (GLint r, GLint g, GLint b)
+{
+  jwzgles_glColor4i (r, g, b, 0x7FFFFFFF);
+}
+
 void
 jwzgles_glColor3iv (const GLint *v)
 {
-  GLfloat vv[4];
-  vv[0] = v[0];
-  vv[1] = v[1];
-  vv[2] = v[2];
-  vv[3] = 1;
-  jwzgles_glColor4fv (vv);
+  jwzgles_glColor3i (v[0], v[1], v[2]);
+}
+
+
+/* glColor: GLuint (0 - UINT_MAX) */
+
+void
+jwzgles_glColor4ui (GLuint r, GLuint g, GLuint b, GLuint a)
+{
+  /* 0 - 0xFFFFFFFF  =>  0.0 - 1.0 */
+  jwzgles_glColor4f ((GLfloat) r / 0xFFFFFFFF,
+                     (GLfloat) g / 0xFFFFFFFF, 
+                     (GLfloat) b / 0xFFFFFFFF,
+                     (GLfloat) a / 0xFFFFFFFF);
+}
+
+void
+jwzgles_glColor4uiv (const GLuint *v)
+{
+  jwzgles_glColor4ui (v[0], v[1], v[2], v[3]);
+}
+
+void
+jwzgles_glColor3ui (GLuint r, GLuint g, GLuint b)
+{
+  jwzgles_glColor4ui (r, g, b, 0xFFFFFFFF);
+}
+
+void
+jwzgles_glColor3uiv (const GLuint *v)
+{
+  jwzgles_glColor3ui (v[0], v[1], v[2]);
+}
+
+
+/* glColor: GLshort (SHRT_MIN - SHRT_MAX) */
+
+void
+jwzgles_glColor4s (GLshort r, GLshort g, GLshort b, GLshort a)
+{
+  /* -0x8000 - 0x7FFF  =>  0.0 - 1.0 */
+  jwzgles_glColor4f (0.5 + (GLfloat) r / 0xFFFF,
+                     0.5 + (GLfloat) g / 0xFFFF,
+                     0.5 + (GLfloat) b / 0xFFFF,
+                     0.5 + (GLfloat) a / 0xFFFF);
+}
+
+void
+jwzgles_glColor4sv (const GLshort *v)
+{
+  jwzgles_glColor4s (v[0], v[1], v[2], v[3]);
+}
+
+void
+jwzgles_glColor3s (GLshort r, GLshort g, GLshort b)
+{
+  jwzgles_glColor4s (r, g, b, 0x7FFF);
+}
+
+void
+jwzgles_glColor3sv (const GLshort *v)
+{
+  jwzgles_glColor3s (v[0], v[1], v[2]);
 }
 
 
+/* glColor: GLushort (0 - USHRT_MAX) */
+
+void
+jwzgles_glColor4us (GLushort r, GLushort g, GLushort b, GLushort a)
+{
+  /* 0 - 0xFFFF  =>  0.0 - 1.0 */
+  jwzgles_glColor4f ((GLfloat) r / 0xFFFF,
+                     (GLfloat) g / 0xFFFF,
+                     (GLfloat) b / 0xFFFF,
+                     (GLfloat) a / 0xFFFF);
+}
+
+void
+jwzgles_glColor4usv (const GLushort *v)
+{
+  jwzgles_glColor4us (v[0], v[1], v[2], v[3]);
+}
+
+void
+jwzgles_glColor3us (GLushort r, GLushort g, GLushort b)
+{
+  jwzgles_glColor4us (r, g, b, 0xFFFF);
+}
+
+void
+jwzgles_glColor3usv (const GLushort *v)
+{
+  jwzgles_glColor3us (v[0], v[1], v[2]);
+}
+
+
+/* glColor: GLbyte (-128 - 127) */
+
+void
+jwzgles_glColor4b (GLbyte r, GLbyte g, GLbyte b, GLbyte a)
+{
+  /* -128 - 127  =>  0.0 - 1.0 */
+  jwzgles_glColor4f (0.5 + (GLfloat) r / 255,
+                     0.5 + (GLfloat) g / 255,
+                     0.5 + (GLfloat) b / 255,
+                     0.5 + (GLfloat) a / 255);
+}
+
+void
+jwzgles_glColor4bv (const GLbyte *v)
+{
+  jwzgles_glColor4b (v[0], v[1], v[2], v[3]);
+}
+
+void
+jwzgles_glColor3b (GLbyte r, GLbyte g, GLbyte b)
+{
+  jwzgles_glColor4b (r, g, b, 127);
+}
+
+void
+jwzgles_glColor3bv (const GLbyte *v)
+{
+  jwzgles_glColor3b (v[0], v[1], v[2]);
+}
+
+
+/* glColor: GLubyte (0 - 255) */
+
 void
 jwzgles_glColor4ub (GLubyte r, GLubyte g, GLubyte b, GLubyte a)
 {
-  jwzgles_glColor4f (r, g, b, a);
+  /* 0 - 255  =>  0.0 - 1.0 */
+  jwzgles_glColor4f (r / 255.0, g / 255.0, b / 255.0, a / 255.0);
 }
 
+void
+jwzgles_glColor4ubv (const GLubyte *v)
+{
+  jwzgles_glColor4ub (v[0], v[1], v[2], v[3]);
+}
 
 void
 jwzgles_glColor3ub (GLubyte r, GLubyte g, GLubyte b)
 {
-  jwzgles_glColor4f (r, g, b, 1);
+  jwzgles_glColor4ub (r, g, b, 255);
 }
 
+void
+jwzgles_glColor3ubv (const GLubyte *v)
+{
+  jwzgles_glColor3ub (v[0], v[1], v[2]);
+}
+
+
 
 void
 jwzgles_glMaterialfv (GLenum face, GLenum pname, const GLfloat *color)
@@ -1758,10 +1912,10 @@ optimize_arrays (void)
   for (i = 0; i < L->count; i++)
     {
       list_fn *F = &L->fns[i];
-      int count;
+/*      int count; */
       if (! F->arrays)
         continue;
-      count = F->argv[2].i;  /* 3rd arg to glDrawArrays */
+/*      count = F->argv[2].i;*/  /* 3rd arg to glDrawArrays */
 
       for (j = 0; j < 4; j++)
         {
@@ -2252,7 +2406,6 @@ copy_array_data (draw_array *A, int count, const char *name)
      data multiple times.
    */
   int stride2, bytes, i, j;
-  const void *old;
   void *data2;
   const GLfloat *IF;
   GLfloat *OF;
@@ -2306,7 +2459,6 @@ copy_array_data (draw_array *A, int count, const char *name)
     break;
   }
 
-  old = A->data;
   A->data = data2;
   A->bytes = bytes;
   A->stride = stride2;
@@ -3054,6 +3206,9 @@ jwzgles_glEnable (GLuint bit)
     }
   else
     {
+      /* We implement 1D textures as 2D textures. */
+      if (bit == GL_TEXTURE_1D) bit = GL_TEXTURE_2D;
+
       if (! state->replaying_list)
         LOG2 ("direct %-12s %s", "glEnable", mode_desc(bit));
       glEnable (bit);  /* the real one */
@@ -3095,6 +3250,9 @@ jwzgles_glDisable (GLuint bit)
     }
   else
     {
+      /* We implement 1D textures as 2D textures. */
+      if (bit == GL_TEXTURE_1D) bit = GL_TEXTURE_2D;
+
       if (! state->replaying_list)
         LOG2 ("direct %-12s %s", "glDisable", mode_desc(bit));
       glDisable (bit);  /* the real one */
@@ -3131,6 +3289,10 @@ jwzgles_glIsEnabled (GLuint bit)
   Assert (!state->compiling_verts, "glIsEnabled not allowed inside glBegin");
   Assert (!state->compiling_list,  "glIsEnabled not allowed inside glNewList");
   */
+
+  /* We implement 1D textures as 2D textures. */
+  if (bit == GL_TEXTURE_1D) bit = GL_TEXTURE_2D;
+
   switch (bit) {
   case GL_TEXTURE_2D: return !!(state->enabled & ISENABLED_TEXTURE_2D);
   case GL_TEXTURE_GEN_S: return !!(state->enabled & ISENABLED_TEXTURE_GEN_S);
index faa26efd9a69749b2885ec05f901ac3345576167..afe0b35ca91a17e720fc23ca066756e664d64b23 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2012-2013 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
@@ -197,12 +197,34 @@ extern void jwzgles_glColor3f (GLfloat, GLfloat, GLfloat);
 extern void jwzgles_glColor4f (GLfloat, GLfloat, GLfloat, GLfloat);
 extern void jwzgles_glColor3fv (const GLfloat *);
 extern void jwzgles_glColor4fv (const GLfloat *);
-extern void jwzgles_glColor4i (GLuint, GLuint, GLuint, GLuint);
-extern void jwzgles_glColor3i (GLuint, GLuint, GLuint);
+extern void jwzgles_glColor3s (GLshort, GLshort, GLshort);
+extern void jwzgles_glColor4s (GLshort, GLshort, GLshort, GLshort);
+extern void jwzgles_glColor3sv (const GLshort *);
+extern void jwzgles_glColor4sv (const GLshort *);
+extern void jwzgles_glColor3us (GLushort, GLushort, GLushort);
+extern void jwzgles_glColor4us (GLushort, GLushort, GLushort, GLushort);
+extern void jwzgles_glColor3usv (const GLushort *);
+extern void jwzgles_glColor4usv (const GLushort *);
+extern void jwzgles_glColor3d (GLdouble, GLdouble, GLdouble);
+extern void jwzgles_glColor4d (GLdouble, GLdouble, GLdouble, GLdouble);
+extern void jwzgles_glColor3dv (const GLdouble *);
+extern void jwzgles_glColor4dv (const GLdouble *);
+extern void jwzgles_glColor4i (GLint, GLint, GLint, GLint);
+extern void jwzgles_glColor3i (GLint, GLint, GLint);
 extern void jwzgles_glColor3iv (const GLint *);
 extern void jwzgles_glColor4iv (const GLint *);
+extern void jwzgles_glColor4ui (GLuint, GLuint, GLuint, GLuint);
+extern void jwzgles_glColor3ui (GLuint, GLuint, GLuint);
+extern void jwzgles_glColor3uiv (const GLuint *);
+extern void jwzgles_glColor4uiv (const GLuint *);
+extern void jwzgles_glColor4b (GLbyte, GLbyte, GLbyte, GLbyte);
+extern void jwzgles_glColor3b (GLbyte, GLbyte, GLbyte);
+extern void jwzgles_glColor4bv (const GLbyte *);
+extern void jwzgles_glColor3bv (const GLbyte *);
 extern void jwzgles_glColor4ub (GLubyte, GLubyte, GLubyte, GLubyte);
 extern void jwzgles_glColor3ub (GLubyte, GLubyte, GLubyte);
+extern void jwzgles_glColor4ubv (const GLubyte *);
+extern void jwzgles_glColor3ubv (const GLubyte *);
 extern void jwzgles_glMaterialf (GLuint, GLuint, GLfloat);
 extern void jwzgles_glMateriali (GLuint, GLuint, GLuint);
 extern void jwzgles_glMaterialfv (GLuint, GLuint, const GLfloat *);
diff --git a/hacks/glx/kaleidocycle.c b/hacks/glx/kaleidocycle.c
new file mode 100644 (file)
index 0000000..025e45b
--- /dev/null
@@ -0,0 +1,566 @@
+/* kaleidocycle, Copyright (c) 2013 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
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * A loop of rotating tetrahedra.  Created by jwz, July 2013.
+ * Inspired by, and some math borrowed from:
+ * http://www.kaleidocycles.de/pdf/kaleidocycles_theory.pdf
+ * http://intothecontinuum.tumblr.com/post/50873970770/an-even-number-of-at-least-8-regular-tetrahedra
+ */
+
+
+#define DEFAULTS       "*delay:        30000       \n" \
+                       "*count:        16          \n" \
+                       "*showFPS:      False       \n" \
+                       "*wireframe:    False       \n" \
+
+# define refresh_kaleidocycle 0
+# define release_kaleidocycle 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "normals.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_SPIN        "Z"
+#define DEF_WANDER      "False"
+#define DEF_SPEED       "1.0"
+
+typedef struct {
+  GLXContext *glx_context;
+  rotator *rot, *rot2;
+  trackball_state *trackball;
+  Bool button_down_p;
+
+  int min_count, max_count;
+  Bool startup_p;
+
+  int ncolors;
+  XColor *colors;
+  int ccolor;
+
+  GLfloat count;
+  GLfloat th, dth;
+
+  enum { STATIC, IN, OUT } mode, prev_mode;
+
+} kaleidocycle_configuration;
+
+static kaleidocycle_configuration *bps = NULL;
+
+static char *do_spin;
+static GLfloat speed;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+  { "-spin",   ".spin",   XrmoptionSepArg, 0 },
+  { "+spin",   ".spin",   XrmoptionNoArg, "" },
+  { "-wander", ".wander", XrmoptionNoArg, "True" },
+  { "+wander", ".wander", XrmoptionNoArg, "False" },
+  { "-speed",  ".speed",  XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+  {&do_spin,   "spin",   "Spin",   DEF_SPIN,   t_String},
+  {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+  {&speed,     "speed",  "Speed",  DEF_SPEED,  t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt kaleidocycle_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_kaleidocycle (ModeInfo *mi, int width, int height)
+{
+  GLfloat h = (GLfloat) height / (GLfloat) width;
+
+  glViewport (0, 0, (GLint) width, (GLint) height);
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  gluLookAt( 0.0, 0.0, 30.0,
+             0.0, 0.0, 0.0,
+             0.0, 1.0, 0.0);
+
+  glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+kaleidocycle_handle_event (ModeInfo *mi, XEvent *event)
+{
+  kaleidocycle_configuration *bp = &bps[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button == Button1)
+    {
+      bp->button_down_p = True;
+      gltrackball_start (bp->trackball,
+                         event->xbutton.x, event->xbutton.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button == Button1)
+    {
+      bp->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5 ||
+            event->xbutton.button == Button6 ||
+            event->xbutton.button == Button7))
+    {
+      gltrackball_mousewheel (bp->trackball, event->xbutton.button, 5,
+                              !!event->xbutton.state);
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           bp->button_down_p)
+    {
+      gltrackball_track (bp->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+
+  return False;
+}
+
+
+
+ENTRYPOINT void 
+init_kaleidocycle (ModeInfo *mi)
+{
+  kaleidocycle_configuration *bp;
+  int wire = MI_IS_WIREFRAME(mi);
+  int i;
+
+  if (!bps) {
+    bps = (kaleidocycle_configuration *)
+      calloc (MI_NUM_SCREENS(mi), sizeof (kaleidocycle_configuration));
+    if (!bps) {
+      fprintf(stderr, "%s: out of memory\n", progname);
+      exit(1);
+    }
+  }
+
+  bp = &bps[MI_SCREEN(mi)];
+
+  bp->glx_context = init_GL(mi);
+
+  reshape_kaleidocycle (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+  glLineWidth (4);
+
+  if (!wire)
+    {
+      GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+      GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+      GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+      GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+      glEnable(GL_LIGHTING);
+      glEnable(GL_LIGHT0);
+      glEnable(GL_DEPTH_TEST);
+      glEnable(GL_CULL_FACE);
+
+      glLightfv(GL_LIGHT0, GL_POSITION, pos);
+      glLightfv(GL_LIGHT0, GL_AMBIENT,  amb);
+      glLightfv(GL_LIGHT0, GL_DIFFUSE,  dif);
+      glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+      glEnable (GL_BLEND);
+      glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+    }
+
+  {
+    Bool spinx = False, spiny = False, spinz = False;
+    double spin_speed   = 0.25;
+    double wander_speed = 0.005;
+    double spin_accel   = 0.2;
+    double twist_speed  = 0.25;
+    double twist_accel  = 1.0;
+
+    char *s = do_spin;
+    while (*s)
+      {
+        if      (*s == 'x' || *s == 'X') spinx = True;
+        else if (*s == 'y' || *s == 'Y') spiny = True;
+        else if (*s == 'z' || *s == 'Z') spinz = True;
+        else if (*s == '0') ;
+        else
+          {
+            fprintf (stderr,
+         "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
+                     progname, do_spin);
+            exit (1);
+          }
+        s++;
+      }
+
+    bp->rot = make_rotator (spinx ? spin_speed : 0,
+                            spiny ? spin_speed : 0,
+                            spinz ? spin_speed : 0,
+                            spin_accel,
+                            do_wander ? wander_speed : 0,
+                            False);
+    bp->rot2 = make_rotator (twist_speed, 0, 0, twist_accel, 0, True);
+
+    bp->trackball = gltrackball_init ();
+  }
+
+  if (MI_COUNT(mi) < 8) MI_COUNT(mi) = 8;
+  if (MI_COUNT(mi) & 1) MI_COUNT(mi)++;
+
+  bp->min_count = 8;
+  bp->max_count = 12 + MI_COUNT(mi) * 1.3;
+  if (bp->max_count & 1) bp->max_count++;
+  bp->startup_p = True;
+
+  bp->count = 0;
+  bp->mode = IN;
+  bp->prev_mode = IN;
+
+/*
+  bp->count = MI_COUNT(mi);
+  bp->mode = STATIC;
+*/
+
+  bp->ncolors = 512;
+  if (! bp->colors)
+    bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+  make_uniform_colormap (0, 0, 0,
+                         bp->colors, &bp->ncolors,
+                         False, 0, False);
+
+  for (i = 0; i < bp->ncolors; i++)
+    {
+      /* make colors twice as bright */
+      bp->colors[i].red   = (bp->colors[i].red   >> 2) + 0x7FFF;
+      bp->colors[i].green = (bp->colors[i].green >> 2) + 0x7FFF;
+      bp->colors[i].blue  = (bp->colors[i].blue  >> 2) + 0x7FFF;
+    }
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+
+/* t = toroidal rotation, a = radial position
+   colors = 4 colors, 4 channels each.
+ */
+static void
+draw_tetra (ModeInfo *mi, double t, double a, Bool reflect_p,
+            GLfloat *colors)
+{
+  int wire = MI_IS_WIREFRAME(mi);
+
+  XYZ v1, v2, v3, P, Q;
+  XYZ verts[4];
+  int i;
+
+  double scale;
+  double sint = sin(t);
+  double cost = cos(t);
+  double tana = tan(a);
+  double sint2 = sint * sint;
+  double tana2 = tana * tana;
+
+  v1.x = cost;
+  v1.y = 0;
+  v1.z = sint;
+
+  scale = 1 / sqrt (1 + sint2 * tana2);
+  v2.x = scale * -sint;
+  v2.y = scale * -sint * tana;
+  v2.z = scale * cost;
+
+  v3.x = scale * -sint2 * tana;
+  v3.y = scale;
+  v3.z = scale * cost * sint * tana;
+
+  P.x = v3.y / tana - v3.x;
+  P.y = 0;
+  P.z = -v3.z / 2;
+
+  Q.x = v3.y / tana;
+  Q.y = v3.y;
+  Q.z = v3.z / 2;
+
+  verts[0] = P;
+  verts[1] = P;
+  verts[2] = Q;
+  verts[3] = Q;
+
+  scale = sqrt(2) / 2;
+  verts[0].x = P.x - scale * v1.x;
+  verts[0].y = P.y - scale * v1.y;
+  verts[0].z = P.z - scale * v1.z;
+
+  verts[1].x = P.x + scale * v1.x;
+  verts[1].y = P.y + scale * v1.y;
+  verts[1].z = P.z + scale * v1.z;
+
+  verts[2].x = Q.x - scale * v2.x;
+  verts[2].y = Q.y - scale * v2.y;
+  verts[2].z = Q.z - scale * v2.z;
+
+  verts[3].x = Q.x + scale * v2.x;
+  verts[3].y = Q.y + scale * v2.y;
+  verts[3].z = Q.z + scale * v2.z;
+
+  for (i = 0; i < 4; i++)
+    {
+      Bool reflect2_p = ((i + (reflect_p != 0)) & 1);
+      XYZ a = verts[(i+1) % 4];
+      XYZ b = verts[(i+2) % 4];
+      XYZ c = verts[(i+3) % 4];
+      XYZ n = ((i & 1)
+               ? calc_normal (b, a, c)
+               : calc_normal (a, b, c));
+      if (wire)
+        glColor4fv (colors + (i * 4));
+      else
+        glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, colors + (i * 4));
+
+      glFrontFace (reflect2_p ? GL_CW : GL_CCW);
+      glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+      glNormal3f (n.x, n.y, n.z);
+      glVertex3f (a.x, a.y, a.z);
+      glVertex3f (b.x, b.y, b.z);
+      glVertex3f (c.x, c.y, c.z);
+      glEnd();
+    }
+}
+
+
+/* Reflect through the plane normal to the given vector.
+ */
+static void
+reflect (double x, double y, double z)
+{
+  GLfloat m[4][4];
+
+  m[0][0] = 1 - (2 * x * x);
+  m[1][0] = -2 * x * y;
+  m[2][0] = -2 * x * z;
+  m[3][0] = 0;
+
+  m[0][1] = -2 * x * y;
+  m[1][1] = 1 - (2 * y * y);
+  m[2][1] = -2 * y * z;
+  m[3][1] = 0;
+
+  m[0][2] = -2 * x * z;
+  m[1][2] = -2 * y * z;
+  m[2][2] = 1 - (2 * z * z);
+  m[3][2] = 0;
+
+  m[0][3] = 0;
+  m[1][3] = 0;
+  m[2][3] = 0;
+  m[3][3] = 1;
+
+  glMultMatrixf (&m[0][0]);
+}
+
+
+ENTRYPOINT void
+draw_kaleidocycle (ModeInfo *mi)
+{
+  kaleidocycle_configuration *bp = &bps[MI_SCREEN(mi)];
+  Display *dpy = MI_DISPLAY(mi);
+  Window window = MI_WINDOW(mi);
+  GLfloat colors[4*4];
+  GLfloat count;
+  double t, a;
+  int i;
+
+  GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
+  GLfloat bshiny   = 128.0;
+
+  if (!bp->glx_context)
+    return;
+
+  glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+  mi->polygon_count = 0;
+
+  glShadeModel(GL_SMOOTH);
+  glEnable(GL_DEPTH_TEST);
+  glEnable(GL_NORMALIZE);
+  glEnable(GL_CULL_FACE);
+
+  glPushMatrix ();
+
+  {
+    double x, y, z;
+    get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+    glTranslatef((x - 0.5) * 5,
+                 (y - 0.5) * 5,
+                 (z - 0.5) * 10);
+
+    /* Do it twice because we don't track the device's orientation. */
+    glRotatef( current_device_rotation(), 0, 0, 1);
+    gltrackball_rotate (bp->trackball);
+    glRotatef(-current_device_rotation(), 0, 0, 1);
+
+    get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+    glRotatef (x * 360, 1, 0, 0);
+    glRotatef (y * 360, 0, 1, 0);
+    glRotatef (z * 360, 0, 0, 1);
+
+    get_rotation (bp->rot2, &x, &y, &z, !bp->button_down_p);
+    bp->th = x * 360 * 10 * speed;
+
+    /* Make sure the twist is always in motion.  Without this, the rotator
+       sometimes stops, and for too long, and it's boring looking.
+     */
+    bp->th += speed * bp->dth++;
+    while (bp->dth > 360) bp->dth -= 360;
+    while (bp->th  > 360) bp->th  -= 360;
+  }
+
+  glMaterialfv (GL_FRONT, GL_SPECULAR,  bspec);
+  glMateriali  (GL_FRONT, GL_SHININESS, bshiny);
+
+
+  /* Evenly spread the colors of the faces, and cycle them together.
+   */
+  for (i = 0; i < 4; i++)
+    {
+      int o  = bp->ncolors / 4;
+      int c = (bp->ccolor + (o*i)) % bp->ncolors;
+      colors[i*4+0] = bp->colors[c].red   / 65536.0;
+      colors[i*4+1] = bp->colors[c].green / 65536.0;
+      colors[i*4+2] = bp->colors[c].blue  / 65536.0;
+      colors[i*4+3] = 1;
+    }
+  bp->ccolor++;
+  if (bp->ccolor >= bp->ncolors) bp->ccolor = 0;
+
+
+  count = (int) floor (bp->count);
+  while (count < 8) count++;
+  if (((int) floor (count)) & 1) count++;
+
+  a = 2 * M_PI / (bp->count < 8 ? 8 : bp->count);
+  t = bp->th / (180 / M_PI);
+
+  glScalef (3, 3, 3);
+  glScalef (a, a, a);
+  glRotatef (90, 0, 0, 1);
+/*  glRotatef (45, 0, 1, 0); */
+
+  for (i = 0; i <= (int) floor (bp->count); i++)
+    {
+      Bool flip_p = (i & 1);
+      glPushMatrix();
+      glRotatef ((i/2) * 4 * 180 / bp->count, 0, 0, 1);
+      if (flip_p) reflect (-sin(a), cos(a), 0);
+
+      if (bp->mode != STATIC && i >= (int) floor (bp->count))
+        {
+          /* Fractional bp->count means the last piece is in transition */
+          GLfloat scale = bp->count - (int) floor (bp->count);
+          GLfloat tick = 0.07 * speed;
+          GLfloat ocount = bp->count;
+          GLfloat alpha;
+
+          /* Fill in faster if we're starting up */
+          if (bp->count < MI_COUNT(mi))
+            tick *= 2;
+
+          glScalef (scale, scale, scale);
+
+          switch (bp->mode) {
+          case IN: break;
+          case OUT: tick = -tick; break;
+          case STATIC: tick = 0; break;
+          }
+
+          bp->count += tick;
+
+          if (bp->mode == IN
+              ? floor (ocount) != floor (bp->count)
+              : ceil  (ocount) != ceil  (bp->count))
+            {
+              if (bp->mode == IN)
+                bp->count = floor (ocount) + 1;
+              else
+                bp->count = ceil  (ocount) - 1;
+
+              if (((int) floor (bp->count)) & 1 ||
+                  (bp->mode == IN && 
+                   (bp->count < MI_COUNT(mi) &&
+                    bp->startup_p)))
+                {
+                  /* keep going if it's odd, or less than 8. */
+                  bp->count = round(bp->count);
+                }
+              else
+                {
+                  bp->mode = STATIC;
+                  bp->startup_p = False;
+                }
+            }
+
+          alpha = (scale * scale * scale * scale);
+          if (alpha < 0.4) alpha = 0.4;
+          colors[3] = colors[7] = colors[11] = colors[15] = alpha;
+        }
+
+      draw_tetra (mi, t, a, flip_p, colors);
+      mi->polygon_count += 4;
+
+      glPopMatrix();
+    }
+
+  if (bp->mode == STATIC && !(random() % 200)) {
+    if (bp->count <= bp->min_count)
+      bp->mode = IN;
+    else if (bp->count >= bp->max_count)
+      bp->mode = OUT;
+    else
+      bp->mode = bp->prev_mode;
+
+    bp->prev_mode = bp->mode;
+  }
+
+
+  mi->recursion_depth = ceil (bp->count);
+
+  glPopMatrix ();
+
+  if (mi->fps_p) do_fps (mi);
+  glFinish();
+
+  glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("Kaleidocycle", kaleidocycle)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/kaleidocycle.man b/hacks/glx/kaleidocycle.man
new file mode 100644 (file)
index 0000000..874d82d
--- /dev/null
@@ -0,0 +1,96 @@
+.de EX         \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "25-Jul-98" "X Version 11"
+.SH NAME
+kaleidocycle - draws twistable rings of tetrahedra
+.SH SYNOPSIS
+.B kaleidocycle
+[\-display \fIhost:display.screen\fP] [\-window] [\-root]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP]
+[\-count \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-wander] [\-no-wander]
+[\-spin \fIaxes\fP]
+[\-no-spin]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIkaleidocycle\fP program draws a ring composed of tetrahedra
+connected at the edges that twists and rotates toroidally.  Segments
+are occasionally inserted or removed.
+.SH OPTIONS
+.I kaleidocycle
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-count \fInumber\fP
+The initial number of segments. Default 16.  Must be 8 or greater, and
+an even number.
+.TP 8
+.B \-speed \fInumber\fP
+Adjust the animation speed. 0.5 for half as fast, 2.0 for twice as fast.
+.TP 8
+.B \-wander
+Move the text around the screen.  This is the default.
+.TP 8
+.B \-no\-wander
+Keep the text centered on the screen.
+.TP 8
+.B \-spin
+Which axes around which the text should spin.  The default is "Z",
+meaning rotate the object the plane of the screen only.
+.TP 8
+.B \-no\-spin
+Don't spin the text at all: the same as \fB\-spin ""\fP.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2001-2013 by Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.  No representations are made about the
+suitability of this software for any purpose.  It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>
diff --git a/hacks/glx/quasicrystal.c b/hacks/glx/quasicrystal.c
new file mode 100644 (file)
index 0000000..d01d1ed
--- /dev/null
@@ -0,0 +1,441 @@
+/* quasicrystal, Copyright (c) 2013 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
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * Overlapping sine waves create interesting plane-tiling interference
+ * patterns.  Created by jwz, Jul 2013.  Inspired by
+ * http://mainisusuallyafunction.blogspot.com/2011/10/quasicrystals-as-sums-of-waves-in-plane.html
+ */
+
+
+#define DEFAULTS       "*delay:        30000       \n" \
+                       "*spin:         True        \n" \
+                       "*wander:       True        \n" \
+                       "*symmetric:    True        \n" \
+                       "*count:        17          \n" \
+                       "*contrast:     30          \n" \
+                       "*showFPS:      False       \n" \
+                       "*wireframe:    False       \n" \
+
+# define refresh_quasicrystal 0
+# define release_quasicrystal 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_SPEED  "1.0"
+
+typedef struct {
+  rotator *rot, *rot2;
+  GLuint texid;
+} plane;
+
+typedef struct {
+  GLXContext *glx_context;
+  Bool button_down_p;
+  Bool symmetric_p;
+  GLfloat contrast;
+  int count;
+  int ncolors, ccolor;
+  XColor *colors;
+  plane *planes;
+  int mousex, mousey;
+
+} quasicrystal_configuration;
+
+static quasicrystal_configuration *bps = NULL;
+
+static GLfloat speed;
+
+static XrmOptionDescRec opts[] = {
+  { "-spin",         ".spin",      XrmoptionNoArg, "True"  },
+  { "+spin",         ".spin",      XrmoptionNoArg, "False" },
+  { "-wander",       ".wander",    XrmoptionNoArg, "True"  },
+  { "+wander",       ".wander",    XrmoptionNoArg, "False" },
+  { "-symmetry",     ".symmetric", XrmoptionNoArg, "True"   },
+  { "-no-symmetry",  ".symmetric", XrmoptionNoArg, "False"  },
+  { "-speed",        ".speed",     XrmoptionSepArg, 0 },
+  { "-contrast",     ".contrast",  XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+  {&speed,     "speed",  "Speed",  DEF_SPEED,  t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt quasicrystal_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_quasicrystal (ModeInfo *mi, int width, int height)
+{
+  GLfloat h = (GLfloat) height / (GLfloat) width;
+
+  glViewport (0, 0, (GLint) width, (GLint) height);
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  glOrtho (0, 1, 1, 0, -1, 1);
+
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  glTranslatef (0.5, 0.5, 0);
+  glScalef (h, 1, 1);
+  if (width > height)
+    glScalef (1/h, 1/h, 1);
+  glTranslatef (-0.5, -0.5, 0);
+  glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+quasicrystal_handle_event (ModeInfo *mi, XEvent *event)
+{
+  quasicrystal_configuration *bp = &bps[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button == Button1)
+    {
+      bp->button_down_p = True;
+      bp->mousex = event->xbutton.x;
+      bp->mousey = event->xbutton.y;
+      return True;
+    }
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button == Button1)
+    {
+      bp->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           bp->button_down_p)
+    {
+      /* Dragging up and down tweaks contrast */
+
+      int dx = event->xmotion.x - bp->mousex;
+      int dy = event->xmotion.y - bp->mousey;
+
+      if (abs(dy) > abs(dx))
+        {
+          bp->contrast += dy / 40.0;
+          if (bp->contrast < 0)   bp->contrast = 0;
+          if (bp->contrast > 100) bp->contrast = 100;
+        }
+
+      bp->mousex = event->xmotion.x;
+      bp->mousey = event->xmotion.y;
+      return True;
+    }
+
+  return False;
+}
+
+
+
+ENTRYPOINT void 
+init_quasicrystal (ModeInfo *mi)
+{
+  quasicrystal_configuration *bp;
+  int wire = MI_IS_WIREFRAME(mi);
+  unsigned char *tex_data = 0;
+  int tex_width;
+  int i;
+
+  if (!bps) {
+    bps = (quasicrystal_configuration *)
+      calloc (MI_NUM_SCREENS(mi), sizeof (quasicrystal_configuration));
+    if (!bps) {
+      fprintf(stderr, "%s: out of memory\n", progname);
+      exit(1);
+    }
+  }
+
+  bp = &bps[MI_SCREEN(mi)];
+
+  bp->glx_context = init_GL(mi);
+
+  reshape_quasicrystal (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+  glDisable (GL_DEPTH_TEST);
+  glEnable (GL_CULL_FACE);
+
+  bp->count = MI_COUNT(mi);
+  if (bp->count < 1) bp->count = 1;
+
+  if (! wire)
+    {
+      unsigned char *o;
+      tex_width = 4096;
+      tex_data = (unsigned char *) calloc (4, tex_width);
+      o = tex_data;
+      for (i = 0; i < tex_width; i++)
+        {
+          unsigned char y = 255 * (1 + sin (i * M_PI * 2 / tex_width)) / 2;
+          *o++ = y;
+          *o++ = y;
+          *o++ = y;
+          *o++ = 255;
+        }
+    }
+
+  bp->symmetric_p =
+    get_boolean_resource (MI_DISPLAY (mi), "symmetry", "Symmetry");
+
+  bp->contrast = get_float_resource (MI_DISPLAY (mi), "contrast", "Contrast");
+  if (bp->contrast < 0 || bp->contrast > 100) 
+    {
+      fprintf (stderr, "%s: contrast must be between 0 and 100%%.\n", progname);
+      bp->contrast = 0;
+    }
+
+  {
+    Bool spinp   = get_boolean_resource (MI_DISPLAY (mi), "spin", "Spin");
+    Bool wanderp = get_boolean_resource (MI_DISPLAY (mi), "wander", "Wander");
+    double spin_speed   = 0.01;
+    double wander_speed = 0.0001;
+    double spin_accel   = 10.0;
+    double scale_speed  = 0.005;
+
+    bp->planes = (plane *) calloc (sizeof (*bp->planes), bp->count);
+
+    bp->ncolors = 256;  /* ncolors affects color-cycling speed */
+    bp->colors = (XColor *) calloc (bp->ncolors, sizeof(XColor));
+    make_smooth_colormap (0, 0, 0, bp->colors, &bp->ncolors,
+                          False, 0, False);
+    bp->ccolor = 0;
+
+    for (i = 0;  i < bp->count; i++)
+      {
+        plane *p = &bp->planes[i];
+        p->rot = make_rotator (0, 0,
+                               spinp ? spin_speed : 0,
+                               spin_accel,
+                               wanderp ? wander_speed : 0,
+                               True);
+        p->rot2 = make_rotator (0, 0,
+                                0, 0,
+                               scale_speed,
+                               True);
+        if (! wire)
+          {
+            clear_gl_error();
+
+            glGenTextures (1, &p->texid);
+            glBindTexture (GL_TEXTURE_1D, p->texid);
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+            glTexImage1D (GL_TEXTURE_1D, 0, GL_RGBA,
+                          tex_width, 0,
+                          GL_RGBA,
+                          /* GL_UNSIGNED_BYTE, */
+                          GL_UNSIGNED_INT_8_8_8_8_REV,
+                          tex_data);
+            check_gl_error("texture");
+
+            glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+            glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+            glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+            glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+            glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+          }
+      }
+  }
+
+  if (tex_data) free (tex_data);
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+ENTRYPOINT void
+draw_quasicrystal (ModeInfo *mi)
+{
+  quasicrystal_configuration *bp = &bps[MI_SCREEN(mi)];
+  Display *dpy = MI_DISPLAY(mi);
+  Window window = MI_WINDOW(mi);
+  int wire = MI_IS_WIREFRAME(mi);
+  double r, ps;
+  int i;
+
+  if (!bp->glx_context)
+    return;
+
+  glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+  mi->polygon_count = 0;
+
+  glShadeModel(GL_FLAT);
+  glDisable(GL_DEPTH_TEST);
+  glDisable(GL_CULL_FACE);
+  glDisable (GL_LIGHTING);
+
+  glEnable (GL_BLEND);
+  glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+  glPushMatrix ();
+  glTranslatef (0.5, 0.5, 0);
+  glScalef (3, 3, 3);
+
+  if (wire) glScalef (0.2, 0.2, 0.2);
+
+  for (i = 0;  i < bp->count; i++)
+    {
+      plane *p = &bp->planes[i];
+      double x, y, z;
+      double scale = (wire ? 10 : 700.0 / bp->count);
+      double pscale;
+
+      glPushMatrix();
+
+      get_position (p->rot, &x, &y, &z, !bp->button_down_p);
+      glTranslatef((x - 0.5) * 0.3333,
+                   (y - 0.5) * 0.3333,
+                   0);
+
+      /* With -symmetry, keep the planes' scales in sync.
+         Otherwise, they scale independently.
+       */
+      if (bp->symmetric_p && i > 0)
+        pscale = ps;
+      else
+        {
+          get_position (p->rot2, &x, &y, &z, !bp->button_down_p);
+          pscale = 1 + (4 * z);
+          ps = pscale;
+        }
+
+      scale *= pscale;
+
+
+      /* With -symmetry, evenly distribute the planes' rotation.
+         Otherwise, they rotate independently.
+       */
+      if (bp->symmetric_p && i > 0)
+        z = r + (i * M_PI * 2 / bp->count);
+      else
+        {
+          get_rotation (p->rot, &x, &y, &z, !bp->button_down_p);
+          r = z;
+        }
+
+
+      glRotatef (z * 360, 0, 0, 1);
+      glTranslatef (-0.5, -0.5, 0);
+
+      glColor4f (1, 1, 1, (wire ? 0.5 : 1.0 / bp->count));
+
+      if (!wire)
+        {
+          glEnable (GL_TEXTURE_1D);
+          glBindTexture (GL_TEXTURE_1D, p->texid);
+        }
+
+      glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+      glNormal3f (0, 0, 1);
+      glTexCoord2f (-scale/2,  scale/2); glVertex3f (0, 1, 0);
+      glTexCoord2f ( scale/2,  scale/2); glVertex3f (1, 1, 0);
+      glTexCoord2f ( scale/2, -scale/2); glVertex3f (1, 0, 0);
+      glTexCoord2f (-scale/2, -scale/2); glVertex3f (0, 0, 0);
+      glEnd();
+
+      if (wire)
+        {
+          float j;
+          glDisable (GL_TEXTURE_1D);
+          glColor4f (1, 1, 1, 1.0 / bp->count);
+          for (j = 0; j < 1; j += (1 / scale))
+            {
+              glBegin (GL_LINES);
+              glVertex3f (j, 0, 0);
+              glVertex3f (j, 1, 0);
+              mi->polygon_count++;
+              glEnd();
+            }
+        }
+
+      glPopMatrix();
+
+      mi->polygon_count++;
+    }
+
+  /* Colorize the grayscale image. */
+  {
+    GLfloat c[4];
+    c[0] = bp->colors[bp->ccolor].red   / 65536.0;
+    c[1] = bp->colors[bp->ccolor].green / 65536.0;
+    c[2] = bp->colors[bp->ccolor].blue  / 65536.0;
+    c[3] = 1;
+
+    /* Brighten the colors. */
+    c[0] = (0.6666 + c[0]/3);
+    c[1] = (0.6666 + c[1]/3);
+    c[2] = (0.6666 + c[2]/3);
+
+    glBlendFunc (GL_DST_COLOR, GL_SRC_COLOR);
+    glDisable (GL_TEXTURE_1D);
+    glColor4fv (c);
+    glTranslatef (-0.5, -0.5, 0);
+    glBegin (GL_QUADS);
+    glVertex3f (0, 1, 0);
+    glVertex3f (1, 1, 0);
+    glVertex3f (1, 0, 0);
+    glVertex3f (0, 0, 0);
+    glEnd();
+    mi->polygon_count++;
+  }
+
+  /* Clip the colors to simulate contrast. */
+
+  if (bp->contrast > 0)
+    {
+      /* If c > 0, map 0 - 100 to 0.5 - 1.0, and use (s & ~d) */
+      GLfloat c = 1 - (bp->contrast / 2 / 100.0);
+      glDisable (GL_TEXTURE_1D);
+      glDisable (GL_BLEND);
+      glEnable (GL_COLOR_LOGIC_OP);
+      glLogicOp (GL_AND_REVERSE);
+      glColor4f (c, c, c, 1);
+      glBegin (GL_QUADS);
+      glVertex3f (0, 1, 0);
+      glVertex3f (1, 1, 0);
+      glVertex3f (1, 0, 0);
+      glVertex3f (0, 0, 0);
+      glEnd();
+      mi->polygon_count++;
+      glDisable (GL_COLOR_LOGIC_OP);
+    }
+
+  /* Rotate colors. */
+  bp->ccolor++;
+  if (bp->ccolor >= bp->ncolors)
+    bp->ccolor = 0;
+
+
+  glPopMatrix ();
+
+  if (mi->fps_p) do_fps (mi);
+  glFinish();
+
+  glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("QuasiCrystal", quasicrystal)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/quasicrystal.man b/hacks/glx/quasicrystal.man
new file mode 100644 (file)
index 0000000..cbf9040
--- /dev/null
@@ -0,0 +1,84 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+quasicrystal - aperiodic plane tilings.
+.SH SYNOPSIS
+.B quasicrystal
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-count \fInumber\fP]
+[\-contrast \fIpercent\fP]
+[\-no-wander]
+[\-no-spin]
+[\-asymmetric]
+[\-fps]
+.SH DESCRIPTION
+A quasicrystal is a structure that is ordered but aperiodic.
+Two-dimensional quasicrystals can be generated by adding a set of planes
+where x is the sine of y. Different complex aperiodic plane tilings are
+produced depending on the period, position, and rotation of the component
+planes, and whether the rotation of the planes is evenly distributed around
+the circle (the "symmetric" option, above) or random. See also the
+"RD-Bomb", "CWaves" and "Penrose" screen savers.
+http://en.wikipedia.org/wiki/Quasicrystal
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2 for twice as fast, 0.5 for half as fast.
+.TP 8
+.B \-contrast \fIcontrast\fP
+Contrast. Sort of.  Default 30%.
+.TP 8
+.B \-count \fInumber\fP
+How many planes to use. Default 17.
+.TP 8
+.B \-wander | \-no-wander
+Whether the planes should displace horizontally and vertically.
+.TP 8
+.B \-spin | \-no-spin
+Whether the planes should rotate.
+.TP 8
+.B \-asymmetric
+Allow each plane to rotate freely instead of being constrained to an
+even distribution around the circle.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2013 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software and its documentation for any purpose is 
+hereby granted without fee, provided that the above copyright notice appear 
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
index 022477598dc3e5857fbad4085bac605008284dfd..2529e2a3c572425e11ca538a44dd5257c11b8ba0 100644 (file)
@@ -899,6 +899,8 @@ ENTRYPOINT void init_tangram(ModeInfo * mi)
         gl_init(mi);
     }
 
+    reshape_tangram (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
     wire = MI_IS_WIREFRAME(mi);
 
     tp->name_list = glGenLists(1);
index f58755d1ab3833d7a0cd9b35d9fbb1cc45c4a396..2305a937769d1a9e637147ee156af168e5b2bc76 100644 (file)
@@ -1,4 +1,4 @@
-/* texfonts, Copyright (c) 2005-2012 Jamie Zawinski <jwz@jwz.org>
+/* texfonts, Copyright (c) 2005-2013 Jamie Zawinski <jwz@jwz.org>
  * Loads X11 fonts into textures for use with OpenGL.
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -440,7 +440,8 @@ print_texture_string (texture_font_data *data, const char *string)
         }
       else if (c == '\t')
         {
-          x = ((x + tabs) / tabs) * tabs;  /* tab to tab stop */
+          if (tabs)
+            x = ((x + tabs) / tabs) * tabs;  /* tab to tab stop */
         }
 # ifdef DO_SUBSCRIPTS
       else if (c == '[' && (isdigit (string[i+1])))
diff --git a/hacks/glx/unknownpleasures.c b/hacks/glx/unknownpleasures.c
new file mode 100644 (file)
index 0000000..b59cff6
--- /dev/null
@@ -0,0 +1,512 @@
+/* unknownpleasures, Copyright (c) 2013 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
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * Translated from Mathematica code by Archery:
+ * http://intothecontinuum.tumblr.com/post/27443100682/in-july-1967-astronomers-at-the-cavendish
+ *
+ * Interestingly, the original image is copyright-free:
+ * http://adamcap.com/2011/05/19/history-of-joy-division-unknown-pleasures-album-art/
+ * http://en.wikipedia.org/wiki/Unknown_Pleasures
+ *
+ * TODO:
+ *
+ * - Performance is not great. Spending half our time in compute_line()
+ *   and half our time in glEnd().  It's a vast number of cos/pow calls,
+ *   and a vast number of polygons.  I'm not sure how much could be cached.
+ *
+ * - There's too low periodicity vertically on the screen.
+ *
+ * - There's too low periodicity in time.
+ *
+ * - Could take advantage of time periodicity for caching: just save every
+ *   poly for an N second loop.  That would be a huge amount of RAM though.
+ *
+ * - At low resolutions, GL_POLYGON_OFFSET_FILL seems to work poorly
+ *   and the lines get blocky.
+ */
+
+
+#define DEFAULTS       "*delay:        30000       \n" \
+                       "*count:        80          \n" \
+                       "*resolution:   100         \n" \
+                       "*ortho:        True        \n" \
+                       "*showFPS:      False       \n" \
+                       "*wireframe:    False       \n" \
+                       "*geometry:    =800x800"   "\n" \
+
+# define refresh_unk 0
+# define release_unk 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_SPEED  "1.0"
+
+
+typedef struct {
+  GLXContext *glx_context;
+  trackball_state *trackball;
+  Bool button_down_p;
+  Bool orthop;
+  GLfloat resolution;
+  int count;
+  GLfloat t;
+} unk_configuration;
+
+static unk_configuration *bps = NULL;
+
+static GLfloat speed;
+
+static XrmOptionDescRec opts[] = {
+  { "-speed",        ".speed",      XrmoptionSepArg, 0 },
+  { "-resolution",   ".resolution", XrmoptionSepArg, 0 },
+  { "-ortho",        ".ortho",      XrmoptionNoArg,  "True"  },
+  { "-no-ortho",     ".ortho",      XrmoptionNoArg,  "False" },
+};
+
+static argtype vars[] = {
+  {&speed, "speed",  "Speed",  DEF_SPEED,  t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt unk_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_unk (ModeInfo *mi, int width, int height)
+{
+  unk_configuration *bp = &bps[MI_SCREEN(mi)];
+  GLfloat h = (GLfloat) height / (GLfloat) width;
+
+  glViewport (0, 0, (GLint) width, (GLint) height);
+
+  if (bp->orthop)
+    {
+      glMatrixMode(GL_PROJECTION);
+      glLoadIdentity();
+      gluPerspective (1.0, 1/h, 690, 710);
+
+      glMatrixMode(GL_MODELVIEW);
+      glLoadIdentity();
+      gluLookAt( 0, 0, 700,
+                 0, 0, 0,
+                 0, 1, 0);
+      if (width < height)
+        glScalef (1/h, 1/h, 1);
+      glTranslatef (0, -0.5, 0);
+    }
+  else
+    {
+      glMatrixMode(GL_PROJECTION);
+      glLoadIdentity();
+      gluPerspective (30.0, 1/h, 20.0, 40.0);
+
+      glMatrixMode(GL_MODELVIEW);
+      glLoadIdentity();
+      gluLookAt( 0.0, 0.0, 30.0,
+                 0.0, 0.0, 0.0,
+                 0.0, 1.0, 0.0);
+      if (width < height)
+        glScalef (1/h, 1/h, 1);
+    }
+
+  glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+unk_handle_event (ModeInfo *mi, XEvent *event)
+{
+  unk_configuration *bp = &bps[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button == Button1)
+    {
+      bp->button_down_p = True;
+      gltrackball_start (bp->trackball,
+                         event->xbutton.x, event->xbutton.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button == Button1)
+    {
+      bp->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5 ||
+            event->xbutton.button == Button6 ||
+            event->xbutton.button == Button7))
+    {
+      int b = event->xbutton.button;
+      int speed = 1;
+      if (b == Button6 || b == Button7)
+        speed *= 3;
+      if (bp->orthop)
+        switch (b) {                           /* swap axes */
+        case Button4: b = Button6; break;
+        case Button5: b = Button7; break;
+        case Button6: b = Button4; break;
+        case Button7: b = Button5; break;
+        }
+      gltrackball_mousewheel (bp->trackball, b, speed, !!event->xbutton.state);
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           bp->button_down_p)
+    {
+      gltrackball_track (bp->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+  else if (event->xany.type == KeyPress)
+    {
+      KeySym keysym;
+      char c = 0;
+      XLookupString (&event->xkey, &c, 1, &keysym, 0);
+      if (c == ' ')
+        {
+          bp->orthop = !bp->orthop;
+          reshape_unk (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+          return True;
+        }
+      return False;
+    }
+
+  return False;
+}
+
+
+
+ENTRYPOINT void 
+init_unk (ModeInfo *mi)
+{
+  unk_configuration *bp;
+
+  if (!bps) {
+    bps = (unk_configuration *)
+      calloc (MI_NUM_SCREENS(mi), sizeof (unk_configuration));
+    if (!bps) {
+      fprintf(stderr, "%s: out of memory\n", progname);
+      exit(1);
+    }
+  }
+
+  bp = &bps[MI_SCREEN(mi)];
+
+  bp->glx_context = init_GL(mi);
+
+  bp->orthop = get_boolean_resource (MI_DISPLAY (mi), "ortho", "Ortho");
+  bp->resolution = get_float_resource (MI_DISPLAY (mi),
+                                       "resolution", "Resolution");
+  if (bp->resolution < 1) bp->resolution = 1;
+  if (bp->resolution > 300) bp->resolution = 300;
+
+  reshape_unk (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+  bp->count = MI_COUNT(mi);
+  if (bp->count < 1) bp->count = 1;
+
+  bp->trackball = gltrackball_init ();
+
+  if (MI_COUNT(mi) < 1) MI_COUNT(mi) = 1;
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+
+static double
+R (double f)
+{
+  /* A simple, fast, deterministic PRNG.
+     ya_rand_init() is too slow for this, and the stream of numbers here
+     doesn't have to be high quality.
+   */
+#if 1
+  int seed0 = 1613287;
+
+# else
+  /* Kluge to let me pick a good seed factor by trial and error... */
+  static int seed0 = 0;
+  static int count = 0;
+  if (count++ > 150000000) seed0 = 0, count=0;
+  if (! seed0)
+    {
+      seed0 = (random() & 0xFFFFF);
+      fprintf(stderr, "seed0 = %8x %d\n", seed0, seed0);
+    }
+# endif
+
+  long seed = seed0 * f;
+  seed = 48271 * (seed % 44488) - 3399 * (seed / 44488);
+  f = (double) seed / 0x7FFFFFFF;
+
+  return f;
+}
+
+
+static void
+compute_line (ModeInfo *mi,
+              int xmin, int xmax, GLfloat xinc,
+              GLfloat res_scale,
+              int y,
+              GLfloat *points)
+{
+  unk_configuration *bp = &bps[MI_SCREEN(mi)];
+
+  GLfloat fx;
+  int lastx = -999999;
+
+  /* Compute the points on the line */
+
+  for (fx = xmin; fx < xmax; fx += xinc)
+    {
+      int x = fx;
+      int n;
+      GLfloat hsum = 0, vsum = 0;
+
+      if (x == lastx) continue;
+      lastx = x;
+
+      for (n = 1; n <= 30; n++)
+        {
+          /* This sum affects crinkliness of the lines */
+          hsum += (10 *
+                   sin (2 * M_PI
+                        * R (4 * y)
+                        + bp->t
+                        + R (2 * n * y)
+                        * 2 * M_PI)
+                   *  exp (-pow ((.3 * (x / res_scale) + 30
+                                  - 1 * 100 * R (2 * n * y)),
+                                 2)
+                           / 20.0));
+        }
+
+      for (n = 1; n <= 4; n++)
+        {
+          /* This sum affects amplitude of the peaks */
+          vsum += (3 * (1 + R (3 * n * y))
+                   * fabs (sin (bp->t + R (n * y)
+                                * 2 * M_PI))
+                   * exp (-pow (((x / res_scale) - 1 * 100 * R (n * y)),
+                                2)
+                          / 20.0));
+        }
+
+      /* Scale of this affects amplitude of the flat parts */
+      points[x - xmin] = (0.2 * sin (2 * M_PI * R (6 * y) + hsum) + vsum);
+    }
+
+}
+
+
+ENTRYPOINT void
+draw_unk (ModeInfo *mi)
+{
+  unk_configuration *bp = &bps[MI_SCREEN(mi)];
+  Display *dpy = MI_DISPLAY(mi);
+  Window window = MI_WINDOW(mi);
+  int wire = MI_IS_WIREFRAME(mi);
+  GLfloat aspect = 1.5;
+
+  GLfloat res_scale = 4;
+  int xmin = -50 * res_scale;
+  int xmax = 150 * res_scale;
+  GLfloat xinc = 100.0 / (bp->resolution / res_scale);
+  int ymin = 1;
+  int ytop = MI_COUNT(mi);
+  int yinc = 1;
+  int y;
+  GLfloat *points;
+
+  if (xinc < 0.25) xinc = 0.25;
+
+  if (!bp->glx_context)
+    return;
+
+  glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+  mi->polygon_count = 0;
+
+  glShadeModel (GL_FLAT);
+  glEnable (GL_DEPTH_TEST);
+  glDisable (GL_CULL_FACE);
+
+  glPushMatrix ();
+
+  glRotatef(current_device_rotation(), 0, 0, 1);
+
+  gltrackball_rotate (bp->trackball);
+  glScalef (10, 10, 10);
+
+  glRotatef (-45, 1, 0, 0);
+  glTranslatef (-0.5, -0.5, 0);
+  if (bp->orthop)
+    glTranslatef (0, 0.05, 0);
+  else
+    glTranslatef (0, 0.15, 0);
+
+  points = (GLfloat *) malloc (sizeof(*points) * (xmax - xmin));
+
+  if (!bp->button_down_p)
+    {
+      double s = 6.3 / 19 / 3;
+# if 1
+      bp->t -= s * speed;
+      if (bp->t <= 0)
+        bp->t = s * 18 * 3;
+# else
+      bp->t += s;
+# endif
+    }
+
+  glLineWidth (2);
+
+  /* Lower the resolution to get a decent frame rate on iPhone 4s */
+  if (mi->xgwa.width <= 640 || mi->xgwa.height <= 640)
+    {
+      ytop *= 0.6;
+      xinc *= 3;
+    }
+
+# ifdef USE_IPHONE
+  /* Lower it even further for iPhone 3 */
+  if (mi->xgwa.width <= 480 || mi->xgwa.height <= 480)
+    {
+      ytop *= 0.8;
+      xinc *= 1.2;
+    }
+
+  /* Performance just sucks on iPad 3, even with a very high xinc. WTF? */
+/*
+  if (mi->xgwa.width >= 2048 || mi->xgwa.height >= 2048)
+    xinc *= 2;
+*/
+
+# endif /* USE_IPHONE */
+
+
+  /* Make the image fill the screen a little more fully */
+  if (mi->xgwa.width <= 640 || mi->xgwa.height <= 640)
+    {
+      glScalef (1.2, 1.2, 1.2);
+      glTranslatef (-0.08, 0, 0);
+    }
+
+  if (mi->xgwa.width <= 480 || mi->xgwa.height <= 480)
+    glLineWidth (1);
+
+
+  if (wire)
+    xinc *= 1.3;
+
+  /* Draw back mask */
+  {
+    GLfloat s = 0.99;
+    glDisable (GL_POLYGON_OFFSET_FILL);
+    glColor3f (0, 0, 0);
+    glPushMatrix();
+    glTranslatef (0, (1-aspect)/2, -0.005);
+    glScalef (1, aspect, 1);
+    glTranslatef (0.5, 0.5, 0);
+    glScalef (s, s, 1);
+    glBegin (GL_QUADS);
+    glVertex3f (-0.5, -0.5, 0);
+    glVertex3f ( 0.5, -0.5, 0);
+    glVertex3f ( 0.5,  0.5, 0);
+    glVertex3f (-0.5,  0.5, 0);
+    glEnd();
+    glPopMatrix();
+  }
+
+  if (! wire)
+    {
+      glEnable (GL_LINE_SMOOTH);
+      glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
+      glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
+      glEnable (GL_BLEND);
+
+      /* So the masking quads don't interfere with the lines */
+      glEnable (GL_POLYGON_OFFSET_FILL);
+      glPolygonOffset (1.0, 1.0);
+    }
+
+  for (y = ymin; y <= ytop; y += yinc)
+    {
+      /* Compute all the verts on the line */
+      compute_line (mi, xmin, xmax, xinc, res_scale, y, points);
+
+      /* Draw the line segments; then draw the black shielding quads. */
+      {
+        GLfloat yy = y / (GLfloat) ytop;
+        int linesp;
+
+        yy = (yy * aspect) - ((aspect - 1) / 2);
+
+        for (linesp = 0; linesp <= 1; linesp++)
+          {
+            GLfloat fx;
+            int lastx = -999999;
+
+            GLfloat c = (linesp || wire ? 1 : 0);
+            glColor3f (c, c, c);
+
+            glBegin (linesp
+                     ? GL_LINE_STRIP
+                     : wire ? GL_LINES : GL_QUAD_STRIP);
+            lastx = -999999;
+            for (fx = xmin; fx < xmax; fx += xinc)
+              {
+                int x = fx;
+                GLfloat xx = (x - xmin) / (GLfloat) (xmax - xmin);
+                GLfloat zz = points [x - xmin];
+
+                if (x == lastx) continue;
+                lastx = x;
+
+                zz /= 80;
+                glVertex3f (xx, yy, zz);
+                if (! linesp)
+                  glVertex3f (xx, yy, 0);
+                mi->polygon_count++;
+              }
+            glEnd ();
+          }
+      }
+    }
+
+  free (points);
+
+  glPopMatrix ();
+
+  if (mi->fps_p) do_fps (mi);
+  glFinish();
+
+  glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("UnknownPleasures", unknownpleasures, unk)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/unknownpleasures.man b/hacks/glx/unknownpleasures.man
new file mode 100644 (file)
index 0000000..422c81f
--- /dev/null
@@ -0,0 +1,74 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+unknownpleasures - an animation of the signal from the pulsar PSR B1919+21.
+.SH SYNOPSIS
+.B unknownpleasures
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fIpercent\fP]
+[\-count \fIinteger\fP]
+[\-resolution \fIpercent\fP]
+[\-no-ortho]
+[\-fps]
+.SH DESCRIPTION
+PSR B1919+21 (AKA CP 1919) was the first pulsar ever discovered: a spinning
+neutron star emitting a periodic lighthouse-like beacon. An illustration of
+the signal received from it was published in Scientific American in 1971,
+and later in The Cambridge Encyclopedia of Astronomy in 1977, where it was
+seen by Stephen Morris, the drummer of Joy Division, and was consequently
+appropriated by Peter Saville for the cover of the band's album "Unknown
+Pleasures".
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2 for twice as fast, 0.5 for half as fast.
+.TP 8
+.B \-count \fInumber\fP
+Scanlines (vertical resolution).  Default: 80.
+.TP 8
+.B \-count \fInumber\fP
+Horizontal Resolution, Default: 100%.
+.TP 8
+.B \-ortho | \-no-ortho
+Whether to use an orthographic projection.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2013 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software and its documentation for any purpose is 
+hereby granted without fee, provided that the above copyright notice appear 
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
index 94578c238b4e148dd9c5ca66d9951aaa065acf76..cf600bc7312ed9b618d8f079c01eaef761dba26d 100644 (file)
@@ -1,5 +1,5 @@
 /* xpm-ximage.c --- converts XPM data to an XImage for use with OpenGL.
- * xscreensaver, Copyright (c) 1998-2008 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1998-2013 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
@@ -157,7 +157,9 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap,
             }
           row += stride;
         }
-      gdk_pixbuf_unref (pb); /* #### does doing this free colors? */
+
+      /* #### are colors getting freed here? */
+      g_object_unref (pb);
 
       return image;
     }
index 02a5b11352ff3f439c59d2f98f1df59066e1bfba..f7229cce153fa7b4ee3cda37c1f1a636845d5406 100644 (file)
@@ -577,6 +577,9 @@ static const char *goop_defaults [] = {
   "*torque:            0.0075",
   "*elasticity:                0.9",
   "*maxVelocity:       0.5",
+#ifdef USE_IPHONE
+  "*ignoreRotation:     True",
+#endif
   0
 };
 
index a6ea63126f995f20970e79978ba9c29caa90d5e5..38e97de8c9658c50d98737c719f109a7085d95e4 100644 (file)
@@ -33,6 +33,7 @@ static const char sccsid[] = "@(#)grav.c      5.00 2000/11/01 xlockmore";
                                        "*count: 12 \n" \
                                        "*ncolors: 64 \n" \
                                        "*fpsSolid: true \n" \
+                                       "*ignoreRotation: True \n" \
 
 #define BRIGHT_COLORS
 # define grav_handle_event 0
index 2496cdf55fd258922d0c19c174a7ff2ad78528e5..5ef65b817e8d445516753e3918cc46282ac290bf 100644 (file)
@@ -257,6 +257,9 @@ static const char *greynetic_defaults [] = {
   "*fpsSolid:  true",
   "*delay:     10000",
   "*grey:      false",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
index 5cd78b504991fbbf379269055b3e26a92432fefb..84503c1fc77ee07d90109429886b1664e79d4d3a 100644 (file)
@@ -191,7 +191,7 @@ halftone_init (Display *dpy, Window window)
   halftone->ncolors = get_integer_resource (dpy, "colors", "Colors");
   if (halftone->ncolors < 4) halftone->ncolors = 4;
   halftone->colors = (XColor *) calloc(halftone->ncolors, sizeof(XColor));
-  make_smooth_colormap (dpy, attrs.visual, attrs.colormap,
+  make_smooth_colormap (attrs.screen, attrs.visual, attrs.colormap,
                         halftone->colors, &halftone->ncolors,
                         True, 0, False);
   halftone->color0 = 0;
@@ -373,6 +373,9 @@ static const char *halftone_defaults [] = {
   "*sizeFactor:                1.5",
   "*colors:            200",
   "*cycleSpeed:                10",
+#ifdef USE_IPHONE
+  "*ignoreRotation:     True",
+#endif
   0
 };
 
index 2b7e30fb79616a307fc67a50b7148d224e1a0e3e..40a55402a95b5491908cc6bdea686781dba9c4b5 100644 (file)
@@ -1,5 +1,4 @@
-/* xscreensaver, Copyright (c) 1993, 1995, 1996, 1997, 1998, 1999, 2003, 2006
- *  Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1993-2013 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
@@ -139,10 +138,12 @@ halo_init (Display *dpy, Window window)
   if (mono_p)
     ;
   else if (random() % (cmode == seuss_mode ? 2 : 10))
-    make_uniform_colormap (st->dpy, xgwa.visual, st->cmap, st->colors, &st->ncolors,
+    make_uniform_colormap (xgwa.screen, xgwa.visual, st->cmap,
+                           st->colors, &st->ncolors,
                           True, 0, True);
   else
-    make_smooth_colormap (st->dpy, xgwa.visual, st->cmap, st->colors, &st->ncolors,
+    make_smooth_colormap (xgwa.screen, xgwa.visual, st->cmap,
+                          st->colors, &st->ncolors,
                          True, 0, True);
 
   if (st->ncolors <= 2) mono_p = True;
@@ -404,6 +405,9 @@ static const char *halo_defaults [] = {
   "*delay2:            20",
   "*increment:         0",
   "*animate:           False",
+#ifdef USE_IPHONE
+  "*ignoreRotation:     True",
+#endif
   0
 };
 
index ea28f6909b94e70a3e22524b76d3875304822494..3b6f0f8c22b4e70b47049e1ffb57f688bc480176 100644 (file)
@@ -341,6 +341,9 @@ static const char *helix_defaults [] = {
   "*fpsSolid:  true",
   "*delay:      5",
   "*subdelay:  20000",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
diff --git a/hacks/hexadrop.c b/hacks/hexadrop.c
new file mode 100644 (file)
index 0000000..dd8bfee
--- /dev/null
@@ -0,0 +1,408 @@
+/* xscreensaver, Copyright (c) 1999-2013 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
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * Draws a grid of hexagons or other shapes and drops them out.
+ * Created 8-Jul-2013.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+#define countof(x) (sizeof(x)/sizeof(*(x)))
+#define ABS(x) ((x)<0?-(x):(x))
+
+typedef struct {
+  int sides;
+  int cx, cy;
+  double th0, th, radius, i, speed;
+  int colors[2];
+  Bool initted_p;
+} cell;
+
+typedef struct {
+  Display *dpy;
+  Window window;
+  XWindowAttributes xgwa;
+
+  int ncells, cells_size, gw, gh;
+  cell *cells;
+
+  int delay;
+  double speed;
+  int sides;
+  Bool lockstep_p;
+  Bool uniform_p;
+  Bool initted_p;
+
+  int ncolors;
+  XColor *colors;
+  GC gc;
+
+} state;
+
+
+static void
+make_cells (state *st)
+{
+  int grid_size = get_integer_resource (st->dpy, "size", "Size");
+  cell *cells2;
+  int size, r, gw, gh, x, y, i;
+  double th = 0;
+
+  grid_size = get_integer_resource (st->dpy, "size", "Size");
+  if (grid_size < 5) grid_size = 5;
+
+  size = ((st->xgwa.width > st->xgwa.height
+           ? st->xgwa.width : st->xgwa.height)
+          / grid_size);
+  gw = st->xgwa.width  / size;
+  gh = st->xgwa.height / size;
+
+  switch (st->sides) {
+  case 8:
+    r  = size * 0.75;
+    th = M_PI / st->sides;
+    gw *= 1.25;
+    gh *= 1.25;
+    break;
+  case 6:
+    r  = size / sqrt(3);
+    th = M_PI / st->sides;
+    gh *= 1.2;
+    break;
+  case 3:
+    size *= 2;
+    r  = size / sqrt(3);
+    th = M_PI / st->sides / 2;
+    break;
+  case 4:
+    size /= 2;
+    r  = size * sqrt (2);
+    th = M_PI / st->sides;
+    break;
+  default:
+    abort();
+    break;
+  }
+
+  gw += 3;     /* leave a few extra columns off screen just in case */
+  gh += 3;
+
+  st->ncells = gw * gh;
+
+  if (st->initted_p && !st->cells) abort();
+  if (!st->initted_p && st->cells) abort();
+
+  cells2 = (cell *) calloc (st->ncells, sizeof(*cells2));
+  if (! cells2) abort();
+
+  if (st->cells)
+    {
+      for (y = 0; y < (st->gh < gh ? st->gh : gh); y++)
+        for (x = 0; x < (st->gw < gw ? st->gw : gw); x++)
+          cells2[y * gw + x] = st->cells [y * st->gw + x];
+      free (st->cells);
+      st->cells = 0;
+    }
+
+  st->cells = cells2;
+  st->gw = gw;
+  st->gh = gh;
+
+  i = 0;
+  for (y = 0; y < gh; y++)
+    for (x = 0; x < gw; x++)
+      {
+        cell *c = &st->cells[i];
+        c->sides = st->sides;
+        c->radius = r;
+        c->th = th;
+
+        switch (st->sides) {
+        case 8:
+          if (x & 1)
+            {
+              c->cx = x * size;
+              c->radius /= 2;
+              c->th = M_PI / 4;
+              c->sides = 4;
+              c->radius *= 1.1;
+            }
+          else
+            {
+              c->cx = x * size;
+              c->radius *= 1.02;
+              c->radius--;
+            }
+
+          if (y & 1)
+            c->cx -= size;
+
+          c->cy = y * size;
+
+         break;
+        case 6:
+          c->cx = x * size;
+          c->cy = y * size * sqrt(3)/2;
+          if (y & 1)
+            c->cx -= size * 0.5;
+          break;
+        case 4:
+          c->cx = x * size * 2;
+          c->cy = y * size * 2;
+          break;
+        case 3:
+          c->cx = x * size * 0.5;
+          c->cy = y * size * sqrt(3)/2;
+          if ((x & 1) ^ (y & 1))
+            {
+              c->th = th + M_PI;
+              c->cy -= (r * 0.5);
+            }
+          break;
+        default:
+          abort();
+        }
+
+        if (! c->initted_p)
+          {
+            c->speed = st->speed * (st->uniform_p ? 1 : (0.1 + frand(0.9)));
+            c->i = st->lockstep_p ? 0 : random() % r;
+            c->colors[0] = (st->lockstep_p ? 0 : random() % st->ncolors);
+            c->colors[1] = 0;
+            c->initted_p = True;
+          }
+
+        c->radius += 2;  /* Avoid rounding errors */
+
+        if (c->i > c->radius) c->i = c->radius;
+        if (c->colors[0] >= st->ncolors) c->colors[0] = st->ncolors-1;
+        if (c->colors[1] >= st->ncolors) c->colors[1] = st->ncolors-1;
+
+        i++;
+      }
+
+  st->initted_p = True;
+}
+
+
+static void
+draw_cell (state *st, cell *c)
+{
+  XPoint points[20];
+  int i, j;
+  for (j = 0; j <= 1; j++)
+    {
+      int r = (j == 0 ? c->radius : c->i);
+      for (i = 0; i < c->sides; i++)
+        {
+          double th = i * M_PI * 2 / c->sides;
+          points[i].x = c->cx + r * cos (th + c->th) + 0.5;
+          points[i].y = c->cy + r * sin (th + c->th) + 0.5;
+        }
+      XSetForeground (st->dpy, st->gc, st->colors[c->colors[j]].pixel);
+      XFillPolygon (st->dpy, st->window, st->gc, points, c->sides,
+                    Convex, CoordModeOrigin);
+    }
+
+  c->i -= c->speed;
+  if (c->i < 0)
+    {
+      c->i = c->radius;
+      c->colors[1] = c->colors[0];
+      if (c != &st->cells[0])
+        c->colors[0] = st->cells[0].colors[0];
+      else
+        c->colors[0] = random() % st->ncolors;
+    }
+}
+
+
+static void
+hexadrop_init_1 (Display *dpy, Window window, state *st)
+{
+  XGCValues gcv;
+  char *s1, *s2;
+
+  st->dpy = dpy;
+  st->window = window;
+  st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+  st->ncolors = get_integer_resource (st->dpy, "ncolors", "Integer");
+  st->speed = get_float_resource (st->dpy, "speed", "Speed");
+  if (st->speed < 0) st->speed = 0;
+
+  XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+  if (st->ncolors < 2) st->ncolors = 2;
+
+  st->colors = (XColor *) calloc (sizeof(*st->colors), st->ncolors);
+
+  if (st->ncolors < 10)
+    make_random_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+                          st->colors, &st->ncolors, False, True, 0, True);
+  else
+    make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+                          st->colors, &st->ncolors, True, 0, True);
+  XSetWindowBackground (dpy, window, st->colors[0].pixel);
+
+  s1 = get_string_resource (st->dpy, "uniform", "Uniform");
+  s2 = get_string_resource (st->dpy, "lockstep", "Lockstep");
+
+  if ((!s1 || !*s1 || !strcasecmp(s1, "maybe")) &&
+      (!s2 || !*s2 || !strcasecmp(s2, "maybe")))
+    {
+      /* When being random, don't do both. */
+      st->uniform_p = random() & 1;
+      st->lockstep_p = st->uniform_p ? 0 : random() & 1;
+    }
+  else 
+    {
+      if (!s1 || !*s1 || !strcasecmp(s1, "maybe"))
+        st->uniform_p = random() & 1;
+      else
+        st->uniform_p = get_boolean_resource (st->dpy, "uniform", "Uniform");
+
+      if (!s2 || !*s2 || !strcasecmp(s2, "maybe"))
+        st->lockstep_p = random() & 1;
+      else
+        st->lockstep_p = get_boolean_resource (st->dpy, "lockstep","Lockstep");
+    }
+
+
+  st->sides = get_integer_resource (st->dpy, "sides", "Sides");
+  if (! (st->sides == 0 || st->sides == 3 || st->sides == 4 || 
+         st->sides == 6 || st->sides == 8))
+    {
+      printf ("%s: invalid number of sides: %d\n", progname, st->sides);
+      st->sides = 0;
+    }
+
+  if (! st->sides)
+    {
+      static int defs[] = { 3, 3, 3,
+                            4,
+                            6, 6, 6, 6,
+                            8, 8, 8 };
+      st->sides = defs[random() % countof(defs)];
+    }
+
+  make_cells (st);
+  gcv.foreground = st->colors[0].pixel;
+  st->gc = XCreateGC (dpy, window, GCForeground, &gcv);
+}
+
+
+static void *
+hexadrop_init (Display *dpy, Window window)
+{
+  state *st = (state *) calloc (1, sizeof(*st));
+  hexadrop_init_1 (dpy, window, st);
+  return st;
+}
+
+
+
+static unsigned long
+hexadrop_draw (Display *dpy, Window window, void *closure)
+{
+  state *st = (state *) closure;
+  int i;
+
+  for (i = 0; i < st->ncells; i++)
+    draw_cell (st, &st->cells[i]);
+
+  return st->delay;
+}
+
+
+static void
+hexadrop_reshape (Display *dpy, Window window, void *closure, 
+                 unsigned int w, unsigned int h)
+{
+  state *st = (state *) closure;
+  XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+  make_cells (st);
+}
+
+
+static void
+hexadrop_free (Display *dpy, Window window, void *closure)
+{
+  state *st = (state *) closure;
+  if (st->colors)
+    {
+      free_colors (st->xgwa.screen, st->xgwa.colormap, st->colors, st->ncolors);
+      free (st->colors);
+      st->colors = 0;
+    }
+  if (st->cells) 
+    {
+      free (st->cells);
+      st->cells = 0;
+    }
+  if (st->gc)
+    {
+      XFreeGC (st->dpy, st->gc);
+      st->gc = 0;
+    }
+}
+
+
+static Bool
+hexadrop_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+  state *st = (state *) closure;
+
+  if (event->type == ButtonPress || event->type == KeyPress)
+    {
+      cell *c = st->cells;
+      st->cells = 0;
+      hexadrop_free (st->dpy, st->window, st);
+      free (st->cells);
+      st->cells = c;
+      hexadrop_init_1 (st->dpy, st->window, st);
+      return True;
+    }
+
+  return False;
+}
+
+
+static const char *hexadrop_defaults [] = {
+  ".background:                black",
+  ".foreground:                white",
+  "*fpsSolid:          true",
+  "*delay:             30000",
+  "*sides:             0",
+  "*size:              15",
+  "*speed:             1.0",
+  "*ncolors:           128",
+  "*uniform:           Maybe",
+  "*lockstep:          Maybe",
+#ifdef USE_IPHONE
+  "*ignoreRotation:     True",
+#endif
+  0
+};
+
+static XrmOptionDescRec hexadrop_options [] = {
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-sides",          ".sides",       XrmoptionSepArg, 0 },
+  { "-size",           ".size",        XrmoptionSepArg, 0 },
+  { "-speed",          ".speed",       XrmoptionSepArg, 0 },
+  { "-ncolors",                ".ncolors",     XrmoptionSepArg, 0 },
+  { "-uniform-speed",  ".uniform",     XrmoptionNoArg, "True"  },
+  { "-no-uniform-speed",".uniform",    XrmoptionNoArg, "False" },
+  { "-lockstep",       ".lockstep",    XrmoptionNoArg, "True"  },
+  { "-no-lockstep",    ".lockstep",    XrmoptionNoArg, "False" },
+  { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Hexadrop", hexadrop)
diff --git a/hacks/hexadrop.man b/hacks/hexadrop.man
new file mode 100644 (file)
index 0000000..b4a5f84
--- /dev/null
@@ -0,0 +1,74 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+hexadrop - shrinking hexagons.
+.SH SYNOPSIS
+.B hexadrop
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-size \fInumber\fP]
+[\-sides \fInumber\fP]
+[\-uniform-speed]
+[\-no-uniform-speed]
+[\-lockstep]
+[\-no-lockstep]
+[\-fps]
+.SH DESCRIPTION
+Draws a grid of hexagons or other shapes and drops them out.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Speed. 0.5 for half as fast; 2.0 for twice as fast.
+.TP 8
+.B \-size \fInumber\fP
+How many tiles to fit horizontally on the screen.  Default 15.
+.TP 8
+.B \-sides \fInumber\fP
+Shape of the tiles. 3, 4, 6 or 8. Default: random.
+.TP 8
+.B \-uniform-speed | \-no-uniform-speed
+Whether each tile should drop at the same speed. Default: random.
+.TP 8
+.B \-lockstep | \-no-lockstep
+Whether each tile should drop at the same time. Default: random.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2013 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software and its documentation for any purpose is 
+hereby granted without fee, provided that the above copyright notice appear 
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
index 09614458f5e46ca1e92f152f0ed504e93298f51e..10e2656d937b940e6603d636639a026362e7dd99 100644 (file)
@@ -57,6 +57,7 @@ static const char sccsid[] = "@(#)hop.c       5.00 2000/11/01 xlockmore";
                                        "*cycles: 2500 \n" \
                                        "*ncolors: 200 \n" \
                                        "*fpsSolid: true \n" \
+                                       "*ignoreRotation: True \n" \
 
 # define SMOOTH_COLORS
 # define reshape_hop 0
index 099b0d1c8c265282c2162ab0bffeaba0374e419f..d1f789c9869d5547db6221ae1c1363fb090f467c 100644 (file)
@@ -106,6 +106,9 @@ static const char *ifs_defaults [] = {
   "*doubleBuffer:      False",
 #else
   "*doubleBuffer:      True",
+#endif
+#ifdef USE_IPHONE
+  "*ignoreRotation:     True",
 #endif
   0
 };
@@ -435,7 +438,7 @@ ifs_init (Display *d_arg, Window w_arg)
   if (st->colours) free(st->colours);
   st->colours = (XColor *)calloc(st->ncolours, sizeof(XColor));
   if (!st->colours) exit(1);
-  make_smooth_colormap (st->dpy, xgwa.visual, xgwa.colormap, 
+  make_smooth_colormap (xgwa.screen, xgwa.visual, xgwa.colormap, 
                         st->colours, &st->ncolours,
                         True, 0, False);
 
index aeee0308526344d65c48482e31d6450bfea1b0f4..d7f0147f42a1b4f0d9f92003155d32701f24ed12 100644 (file)
@@ -1,4 +1,4 @@
-/* imsmap, Copyright (c) 1992-2008 Juergen Nickelsen and Jamie Zawinski.
+/* imsmap, Copyright (c) 1992-2013 Juergen Nickelsen and Jamie Zawinski.
  * Derived from code by Markus Schirmer, TU Berlin.
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -162,7 +162,7 @@ init_map (struct state *st)
   if (mono_p)
     st->flip_xy = 0;
   else if (st->colors)
-    free_colors (st->dpy, st->cmap, st->colors, st->ncolors);
+    free_colors (st->xgwa.screen, st->cmap, st->colors, st->ncolors);
   st->colors = 0;
 
   st->ncolors = get_integer_resource (st->dpy, "ncolors", "Integer");
@@ -188,7 +188,7 @@ init_map (struct state *st)
     {
       st->colors = (XColor *) malloc (st->ncolors * sizeof(*st->colors));
 
-      make_smooth_colormap (st->dpy, st->xgwa.visual, st->cmap,
+      make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->cmap,
                             st->colors, &st->ncolors,
                             True, 0, False);
       if (st->ncolors <= 2)
@@ -401,6 +401,9 @@ static const char *imsmap_defaults [] = {
   "*iterations:        7",
   "*delay:     5",
   "*delay2:    20000",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
index 6e48f3f277c28369e6ab188423885c37a18ca502..35879f9c3b2109c64bc37598f4cc909733960361 100644 (file)
@@ -85,6 +85,9 @@ static const char *interaggregate_defaults[] =
     "*baseOrbits: 75",
     "*baseOnCenter: False",
     "*drawCenters: False",
+#ifdef USE_IPHONE
+    "*ignoreRotation: True",
+#endif
     0
 };
 
index 6060798181928ddc2482e2a95a5e8a8fa95ea2a2..3a270abe17d86ec3a040bca5eff6dc9d6c234c61 100644 (file)
  * Last modified: Sun Aug 31 23:40:14 2003, 
  *              david slimp <rock808@DavidSlimp.com>
  *             added -hue option to specify base color hue
- *
- * TODO:
- *
- *    This really needs to be sped up.
- *
- *    I've tried making it use XPutPixel/XPutImage instead of XFillRectangle,
- *    but that doesn't seem to help (it's the same speed at gridsize=1, and
- *    it actually makes it slower at larger sizes.)
- *
- *    I played around with shared memory, but clearly I still don't know how
- *    to use the XSHM extension properly, because it doesn't work yet.
- *
- *    Hannu had put in code to use the double-buffering extension, but that
- *    code didn't work for me on Irix.  I don't think it would help anyway,
- *    since it's not the swapping of frames that is the bottleneck (or a source
- *    of visible flicker.)
- *
- *     -- jwz, 4-Jun-98
+ * Last modified: Wed May 15 00:04:43 2013,
+ *              Dave Odell <dmo2118@gmail.com>
+ *              Tuned performance; double-buffering is now off by default.
+ *              Made animation speed independant of FPS.
+ *              Added cleanup code, fixed a few glitches.
+ *              Added gratuitous #ifdefs.
  */
 
 #include <math.h>
+#include <errno.h>
 
 #include "screenhack.h"
 
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#else
+
+typedef unsigned int uint32_t;
+typedef unsigned short uint16_t;
+typedef unsigned char uint8_t;
+
+#endif
+
+/*
+Tested on an Intel(R) Pentium(R) 4 CPU 3.00GHz (family 15, model 6, 2 cores),
+1 GB PC2-4200, nouveau - Gallium 0.4 on NV44, X.Org version: 1.13.3. A very
+modest system by current standards.
+
+Does double-buffering make sense? (gridsize = 2)
+USE_XIMAGE is off: Yes (-db: 4.1 FPS, -no-db: 2.9 FPS)
+XPutImage in strips: No (-db: 35.9 FPS, -no-db: 38.7 FPS)
+XPutImage, whole image: No (-db: 32.3 FPS, -no-db: 33.7 FPS)
+MIT-SHM, whole image: Doesn't work anyway: (37.3 FPS)
+
+If gridsize = 1, XPutImage is slow when the XImage is one line at a time.
+XPutImage in strips: -db: 21.2 FPS, -no-db: 19.7 FPS
+XPutimage, whole image: -db: 23.2 FPS, -no-db: 23.4 FPS
+MIT-SHM: 26.0 FPS
+
+So XPutImage in strips is very slightly faster when gridsize >= 2, but
+quite a bit worse when gridsize = 1.
+*/
+
 /* I thought it would be faster this way, but it turns out not to be... -jwz */
-#undef USE_XIMAGE
+/* It's a lot faster for me, though - D.O. */
+#define USE_XIMAGE
+
+/* i.e. make the XImage the size of the screen. This is much faster when
+ * gridsize = 1. (And SHM is turned off.) */
+#define USE_BIG_XIMAGE
+
+/* Numbers are wave_table size, measured in unsigned integers.
+ * FPS/radius = 50/radius = 800/radius = 1500/Big-O memory usage
+ *
+ * Use at most one of the following:
+ * Both off = regular sqrt() - 13.5 FPS, 50/800/1500. */
+
+/* #define USE_FAST_SQRT_HACKISH */ /* 17.8 FPS/2873/4921/5395/O(lg(radius)) */
+#define USE_FAST_SQRT_BIGTABLE2 /* 26.1 FPS/156/2242/5386/O(radius^2) */
 
 #ifndef USE_XIMAGE
 # undef HAVE_XSHM_EXTENSION  /* only applicable when using XImages */
 #endif /* USE_XIMAGE */
 
-
 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
 # include "xdbe.h"
 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
@@ -82,7 +114,7 @@ static const char *interference_defaults [] = {
   "*gray:        false", /* color or grayscale */
   "*mono:        false", /* monochrome, not very much fun */
 
-  "*doubleBuffer: True",
+  "*doubleBuffer: False", /* doubleBuffer slows things down for me - D.O. */
 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
   "*useDBE:      True", /* use double buffering extension */
 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
@@ -90,6 +122,9 @@ static const char *interference_defaults [] = {
 #ifdef HAVE_XSHM_EXTENSION
   "*useSHM:      True", /* use shared memory extension */
 #endif /*  HAVE_XSHM_EXTENSION */
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
@@ -114,7 +149,7 @@ static XrmOptionDescRec interference_options [] = {
 };
 
 struct inter_source {
-  int x; 
+  int x;
   int y;
   double x_theta;
   double y_theta;
@@ -122,7 +157,7 @@ struct inter_source {
 
 struct inter_context {
   /*
-   * Display-related entries 
+   * Display-related entries
    */
   Display* dpy;
   Window   win;
@@ -138,7 +173,7 @@ struct inter_context {
 #endif /* USE_XIMAGE */
 
 #ifdef HAVE_XSHM_EXTENSION
-  Bool use_shm;
+  Bool use_shm, shm_can_draw;
   XShmSegmentInfo shm_info;
 #endif /* HAVE_XSHM_EXTENSION */
 
@@ -152,7 +187,6 @@ struct inter_context {
   int speed;
   int delay;
   int shift;
-  int radius;
 
   /*
    * Drawing-related entries
@@ -160,13 +194,21 @@ struct inter_context {
   int w;
   int h;
   Colormap cmap;
+  Screen *screen;
   XColor* pal;
+#ifndef USE_XIMAGE
   GC* gcs;
+#endif
+  int radius; /* Not always the same as the X resource. */
+  double last_frame;
+#ifdef USE_XIMAGE
+  uint32_t* row;
+#endif
 
   /*
    * lookup tables
    */
-  int* wave_height;
+  unsigned* wave_height;
     
   /*
    * Interference sources
@@ -181,6 +223,268 @@ struct inter_context {
 # define TARGET(c) ((c)->pix_buf ? (c)->pix_buf : (c)->win)
 #endif /* !HAVE_DOUBLE_BUFFER_EXTENSION */
 
+#ifdef USE_FAST_SQRT_HACKISH
+/* Based loosely on code from Wikipedia:
+ * https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Approximations_that_depend_on_IEEE_representation
+ */
+
+/* FAST_SQRT_EXTRA_BITS = 3: Smallest useful value
+ * = 5/6: A little bit of banding, wave_height table is on par with regular
+ *        sqrt() code.
+ * = 7: No apparent difference with original @ radius = 800.
+ * = 8: One more just to be comfortable.
+ */
+
+# define FAST_SQRT_EXTRA_BITS 8
+
+union int_float
+{
+  uint32_t i;
+  float f;
+};
+
+static unsigned fast_log2(unsigned x)
+{
+  union int_float u;
+  if(!x)
+    return x;
+  u.f = x;
+  return ((u.i - 0x3f800000) >> (23 - FAST_SQRT_EXTRA_BITS)) + 1;
+}
+
+static float fast_inv_log2(unsigned x)
+{
+  union int_float u;
+  if(!x)
+    return 0.0f;
+  u.i = ((x - 1) << (23 - FAST_SQRT_EXTRA_BITS)) + 0x3f800000;
+  return u.f;
+}
+
+#endif
+
+#ifdef USE_FAST_SQRT_BIGTABLE2
+
+/* I eyeballed these figures. They could be improved. - D.O. */
+
+# define FAST_SQRT_DISCARD_BITS1 4
+/* = 5: Dot in center is almost invisible at radius = 800. */
+/* = 4: Dot in center looks OK at radius = 50. */
+
+/* 156/2740/9029 */
+/* # define FAST_SQRT_DISCARD_BITS2 8 */
+/* # define FAST_SQRT_CUTOFF 64 * 64 */
+
+/* 156/2242/5386 */
+# define FAST_SQRT_DISCARD_BITS2 9
+# define FAST_SQRT_CUTOFF 128 * 128
+
+/*
+ * This is a little faster:
+ * 44.5 FPS, 19/5000/17578
+ *
+ * # define FAST_SQRT_DISCARD_BITS1 7
+ * # define FAST_SQRT_DISCARD_BITS2 7
+ * # define FAST_SQRT_CUTOFF 0
+ *
+ * For radius = 800, FAST_SQRT_DISCARD_BITS2 =
+ * = 9/10: Approximately the original table size, some banding near origins.
+ * = 7: wave_height is 20 KB, and just fits inside a 32K L1 cache.
+ * = 6: Nearly indistinguishable from original
+ */
+
+/*
+  FAST_TABLE(x) is equivalent to, but slightly faster than:
+  x < FAST_SQRT_CUTOFF ?
+    (x >> FAST_SQRT_DISCARD_BITS1) :
+    ((x - FAST_SQRT_CUTOFF) >> FAST_SQRT_DISCARD_BITS2) +
+      (FAST_SQRT_CUTOFF >> FAST_SQRT_DISCARD_BITS1);
+*/
+
+#define FAST_TABLE(x) \
+  ((x) < FAST_SQRT_CUTOFF ? \
+    ((x) >> FAST_SQRT_DISCARD_BITS1) : \
+    (((x) + \
+      ((FAST_SQRT_CUTOFF << (FAST_SQRT_DISCARD_BITS2 - \
+        FAST_SQRT_DISCARD_BITS1)) - FAST_SQRT_CUTOFF)) >> \
+      FAST_SQRT_DISCARD_BITS2))
+
+static double fast_inv_table(unsigned x)
+{
+  return x < (FAST_SQRT_CUTOFF >> FAST_SQRT_DISCARD_BITS1) ?
+    (x << FAST_SQRT_DISCARD_BITS1) :
+    ((x - (FAST_SQRT_CUTOFF >> FAST_SQRT_DISCARD_BITS1)) <<
+      FAST_SQRT_DISCARD_BITS2) + FAST_SQRT_CUTOFF;
+}
+
+#endif
+
+/* Also destroys c->row. */
+static void destroy_image(Display* dpy, struct inter_context* c)
+{
+#ifdef USE_XIMAGE
+  if(c->ximage) {
+# ifdef HAVE_XSHM_EXTENSION
+    if(c->use_shm) {
+      destroy_xshm_image(dpy, c->ximage, &c->shm_info);
+    } else
+# endif
+    {
+      /* Also frees c->ximage->data, which isn't allocated by XCreateImage. */
+      XDestroyImage(c->ximage);
+    }
+  }
+
+  free(c->row);
+#endif
+}
+
+static void inter_free(Display* dpy, struct inter_context* c)
+{
+#ifndef USE_XIMAGE
+  unsigned i;
+#endif
+
+  if(c->pix_buf)
+    XFreePixmap(dpy, c->pix_buf);
+
+  if(c->copy_gc)
+    XFreeGC(dpy, c->copy_gc);
+
+  destroy_image(dpy, c);
+
+  if(c->colors <= 2)
+    free(c->pal);
+  else
+    free_colors(c->screen, c->cmap, c->pal, c->colors);
+
+#ifndef USE_XIMAGE
+  for(i = 0; i != c->colors; ++i)
+    XFreeGC(dpy, c->gcs[i]);
+  free(c->gcs);
+#endif
+
+  free(c->wave_height);
+  free(c->source);
+}
+
+static void abort_no_mem(void)
+{
+  fprintf(stderr, "interference: %s\n", strerror(ENOMEM));
+  exit(1);
+}
+
+static void check_no_mem(Display* dpy, struct inter_context* c, void* ptr)
+{
+  if(!ptr) {
+    inter_free(dpy, c);
+    abort_no_mem();
+  }
+}
+
+/* On allocation error, c->row == NULL. */
+static void create_image(
+  Display* dpy, 
+  struct inter_context* c, 
+  const XWindowAttributes* xgwa)
+{
+#ifdef USE_XIMAGE
+  c->row = malloc((c->w / c->grid_size) * sizeof(uint32_t));
+  check_no_mem(dpy, c, c->row);
+
+# ifdef HAVE_XSHM_EXTENSION
+  /*
+   * interference used to put one row at a time to the X server. This changes
+   * today.
+   *
+   * XShmPutImage is asynchronous; the contents of the XImage must not be
+   * modified until the server has placed the data on the screen. Waiting for
+   * an XShmCompletionEvent after every line of pixels is a little nutty, so
+   * shared-memory XImages will cover the entire screen, and it only has to be
+   * sent once per frame.
+   *
+   * The non-SHM code, on the other hand is noticeably slower when
+   * gridsize = 1 with one row at a time. If, on the other hand, gridsize >= 2,
+   * there's a slight speed increase with one row at a time.
+   *
+   * This uses a lot more RAM than the single line approach. Users with only
+   * 4 MB of RAM may wish to disable USE_BIG_XIMAGE and specify -no-shm on the
+   * command line. Since this is 2013 and desktop computers are shipping with
+   * 8 GB of RAM, I doubt that this will be a major issue. - D.O.
+   */
+
+  if (c->use_shm)
+    {
+      c->ximage = create_xshm_image(dpy, xgwa->visual, xgwa->depth,
+                                    ZPixmap, 0, &c->shm_info,
+                                    xgwa->width, xgwa->height);
+      if (!c->ximage)
+        c->use_shm = False;
+      /* If create_xshm_image fails, it will not be attempted again. */
+
+      c->shm_can_draw = True;
+    }
+# endif /* HAVE_XSHM_EXTENSION */
+
+  if (!c->ximage)
+    {
+      c->ximage =
+        XCreateImage(dpy, xgwa->visual,
+                     xgwa->depth, ZPixmap, 0, 0, /* depth, fmt, offset, data */
+                     xgwa->width,                /* width */
+# ifdef USE_BIG_XIMAGE
+                     xgwa->height,               /* height */
+# else
+                     c->grid_size,               /* height */
+# endif
+                     8, 0);                      /* pad, bpl */
+
+      if(c->ximage)
+        {
+          c->ximage->data = (char *)
+            calloc(c->ximage->height, c->ximage->bytes_per_line);
+
+          if(!c->ximage->data)
+            {
+              free(c->ximage);
+              c->ximage = NULL;
+            }
+        }
+    }
+
+  if(!c->ximage)
+    {
+      free(c->row);
+      c->row = 0;
+    }
+
+  check_no_mem(dpy, c, c->row);
+#endif /* USE_XIMAGE */
+}
+
+static void create_pix_buf(Display* dpy, Window win, struct inter_context *c,
+                           const XWindowAttributes* xgwa)
+{
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+  if(c->back_buf)
+    return;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+  c->pix_buf = XCreatePixmap(dpy, win, xgwa->width, xgwa->height, xgwa->depth);
+}
+
+static double float_time(void)
+{
+  struct timeval result;
+  gettimeofday(
+    &result
+#ifdef GETTIMEOFDAY_TWO_ARGS
+    , NULL
+#endif
+    );
+
+  return result.tv_usec * 1.0e-6 + result.tv_sec;
+}
+
 static void inter_init(Display* dpy, Window win, struct inter_context* c) 
 {
   XWindowAttributes xgwa;
@@ -188,10 +492,14 @@ static void inter_init(Display* dpy, Window win, struct inter_context* c)
   int i;
   int mono;
   int gray;
+  int radius;
   XGCValues val;
-  unsigned long valmask = 0;
   Bool dbuf = get_boolean_resource (dpy, "doubleBuffer", "Boolean");
 
+#ifndef USE_XIMAGE
+  unsigned long valmask = 0;
+#endif
+
 # ifdef HAVE_COCOA     /* Don't second-guess Quartz's double-buffering */
   dbuf = False;
 # endif
@@ -203,29 +511,16 @@ static void inter_init(Display* dpy, Window win, struct inter_context* c)
 
   c->delay = get_integer_resource(dpy, "delay", "Integer");
 
-
   XGetWindowAttributes(c->dpy, c->win, &xgwa);
   c->w = xgwa.width;
   c->h = xgwa.height;
   c->cmap = xgwa.colormap;
+  c->screen = xgwa.screen;
 
 #ifdef HAVE_XSHM_EXTENSION
   c->use_shm = get_boolean_resource(dpy, "useSHM", "Boolean");
 #endif /*  HAVE_XSHM_EXTENSION */
 
-  if (dbuf)
-    {
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
-      c->back_buf = xdbe_get_backbuffer (c->dpy, c->win, XdbeUndefined);
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
-      if (!c->back_buf)
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-        c->pix_buf = XCreatePixmap (dpy, win, xgwa.width, xgwa.height,
-                                    xgwa.depth);
-    }
-
   val.function = GXcopy;
   c->copy_gc = XCreateGC(c->dpy, TARGET(c), GCFunction, &val);
 
@@ -250,39 +545,15 @@ static void inter_init(Display* dpy, Window win, struct inter_context* c)
     c->shift -= 360.0;
   while(c->shift <= -360.0)
     c->shift += 360.0;
-  c->radius = get_integer_resource(dpy, "radius", "Integer");;
-  if(c->radius < 1)
-    c->radius = 1;
-
-#ifdef USE_XIMAGE
+  radius = get_integer_resource(dpy, "radius", "Integer");;
+  if(radius < 1)
+    radius = 1;
 
-  c->ximage = 0;
-
-# ifdef HAVE_XSHM_EXTENSION
-  if (c->use_shm)
-    {
-      c->ximage = create_xshm_image(dpy, xgwa.visual, xgwa.depth,
-                                   ZPixmap, 0, &c->shm_info,
-                                   xgwa.width, c->grid_size);
-      if (!c->ximage)
-       c->use_shm = False;
-    }
-# endif /* HAVE_XSHM_EXTENSION */
-
-  if (!c->ximage)
-    {
-      c->ximage =
-       XCreateImage (dpy, xgwa.visual,
-                     xgwa.depth, ZPixmap, 0, 0, /* depth, fmt, offset, data */
-                     xgwa.width, c->grid_size,  /* width, height */
-                     8, 0);                     /* pad, bpl */
-      c->ximage->data = (unsigned char *)
-       calloc(c->ximage->height, c->ximage->bytes_per_line);
-    }
-#endif /* USE_XIMAGE */
+  create_image(dpy, c, &xgwa);
 
   if(!mono) {
     c->pal = calloc(c->colors, sizeof(XColor));
+    check_no_mem(dpy, c, c->pal);
 
     gray = get_boolean_resource(dpy, "gray", "Boolean");
     if(!gray) {
@@ -297,7 +568,7 @@ static void inter_init(Display* dpy, Window win, struct inter_context* c)
       V[0] = 1.0; V[1] = 0.5; V[2] = 0.0;
     }
 
-    make_color_loop(c->dpy, c->cmap, 
+    make_color_loop(c->screen, xgwa.visual, c->cmap, 
                    H[0], S[0], V[0], 
                    H[1], S[1], V[1], 
                    H[2], S[2], V[2], 
@@ -312,34 +583,77 @@ static void inter_init(Display* dpy, Window win, struct inter_context* c)
   if(mono) { /* DON'T else this with the previous if! */
     c->colors = 2;
     c->pal = calloc(2, sizeof(XColor));
+    check_no_mem(dpy, c, c->pal);
     c->pal[0].pixel = BlackPixel(c->dpy, DefaultScreen(c->dpy));
     c->pal[1].pixel = WhitePixel(c->dpy, DefaultScreen(c->dpy));
-  }    
+  }
+
+#ifdef HAVE_XSHM_EXTENSION
+  if(c->use_shm)
+    dbuf = False;
+  /* Double-buffering doesn't work with MIT-SHM: XShmPutImage must draw to the
+   * window. Otherwise, XShmCompletion events will have the XAnyEvent::window
+   * field set to the back buffer, and XScreenSaver will ignore the event. */
+#endif
 
+  if (dbuf)
+    {
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+      c->back_buf = xdbe_get_backbuffer (c->dpy, c->win, XdbeUndefined);
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+      create_pix_buf(dpy, win, c, &xgwa);
+    }
+
+#ifndef USE_XIMAGE
   valmask = GCForeground;
   c->gcs = calloc(c->colors, sizeof(GC));
+  check_no_mem(dpy, c, c->gcs);
   for(i = 0; i < c->colors; i++) {
     val.foreground = c->pal[i].pixel;    
     c->gcs[i] = XCreateGC(c->dpy, TARGET(c), valmask, &val);
   }
+#endif
+
+#if defined USE_FAST_SQRT_HACKISH
+  c->radius = fast_log2(radius * radius);
+#elif defined USE_FAST_SQRT_BIGTABLE2
+  c->radius = radius * radius;
+  c->radius = FAST_TABLE(c->radius);
+#else
+  c->radius = radius;
+#endif
+
+  c->wave_height = calloc(c->radius, sizeof(unsigned));
+  check_no_mem(dpy, c, c->wave_height);
 
-  c->wave_height = calloc(c->radius, sizeof(int));
   for(i = 0; i < c->radius; i++) {
-    float max = 
+    float max, fi;
+#if defined USE_FAST_SQRT_HACKISH
+    fi = sqrt(fast_inv_log2(i));
+#elif defined USE_FAST_SQRT_BIGTABLE2
+    fi = sqrt(fast_inv_table(i));
+#else
+    fi = i;
+#endif
+    max = 
       ((float)c->colors) * 
-      ((float)c->radius - (float)i) /
-      ((float)c->radius);
+      ((float)radius - fi) /
+      ((float)radius);
     c->wave_height[i] = 
-      (int)
-      ((max + max*cos((double)i/50.0)) / 2.0);
+      (unsigned)
+      ((max + max*cos(fi/50.0)) / 2.0);
   }
 
   c->source = calloc(c->count, sizeof(struct inter_source));
+  check_no_mem(dpy, c, c->source);
+
   for(i = 0; i < c->count; i++) {
     c->source[i].x_theta = frand(2.0)*3.14159;
     c->source[i].y_theta = frand(2.0)*3.14159;
   }
 
+  c->last_frame = float_time();
 }
 
 #define source_x(c, i) \
@@ -348,78 +662,201 @@ static void inter_init(Display* dpy, Window win, struct inter_context* c)
   (c->h/2 + ((int)(cos(c->source[i].y_theta)*((float)c->h/2.0))))
 
 /*
- * this is rather suboptimal. the sqrt() doesn't seem to be a big
- * performance hit, but all those separate XFillRectangle()'s are.
- * hell, it's just a quick hack anyway -- if someone wishes to tune
- * it, go ahead! 
+ * This is rather suboptimal. Calculating the distance per-pixel is going to
+ * be a lot slower than using now-ubiquitous SIMD CPU instructions to do four
+ * or eight pixels at a time. Plus, this could be almost trivially
+ * parallelized, what with all the multi-core hardware nowadays.
  */
 
-static void do_inter(struct inter_context* c) 
+static unsigned long do_inter(struct inter_context* c)
 {
   int i, j, k;
-  int result;
+  unsigned result;
   int dist;
-  int g;
+  int g = c->grid_size;
+  unsigned w_div_g = c->w/g;
 
   int dx, dy;
+  int px, py;
+
+#ifdef USE_XIMAGE
+  unsigned img_y = 0;
+  void *scanline = c->ximage->data;
+#endif
+
+  double now;
+  float elapsed;
+
+#if defined USE_XIMAGE && defined HAVE_XSHM_EXTENSION
+  /* Wait a little while for the XServer to become ready if necessary. */
+  if(c->use_shm && !c->shm_can_draw)
+    return 2000;
+#endif
+
+  now = float_time();
+  elapsed = (now - c->last_frame) * 10.0;
+
+  c->last_frame = now;
 
   for(i = 0; i < c->count; i++) {
-    c->source[i].x_theta += (c->speed/1000.0);
+    c->source[i].x_theta += (elapsed*c->speed/1000.0);
     if(c->source[i].x_theta > 2.0*3.14159)
       c->source[i].x_theta -= 2.0*3.14159;
-    c->source[i].y_theta += (c->speed/1000.0);
+    c->source[i].y_theta += (elapsed*c->speed/1000.0);
     if(c->source[i].y_theta > 2.0*3.14159)
       c->source[i].y_theta -= 2.0*3.14159;
     c->source[i].x = source_x(c, i);
     c->source[i].y = source_y(c, i);
   }
 
-  g = c->grid_size;
-
   for(j = 0; j < c->h/g; j++) {
-    for(i = 0; i < c->w/g; i++) {
+    for(i = 0; i < w_div_g; i++) {
       result = 0;
+      px = i*g + g/2;
+      py = j*g + g/2;
       for(k = 0; k < c->count; k++) {
-       dx = i*g + g/2 - c->source[k].x;
-       dy = j*g + g/2 - c->source[k].y;
-       dist = sqrt(dx*dx + dy*dy); /* what's the performance penalty here? */
-       result += (dist >= c->radius ? 0 : c->wave_height[dist]);
+
+        dx = px - c->source[k].x;
+        dy = py - c->source[k].y;
+
+        /*
+         * Other possibilities for improving performance here:
+         * 1. Using octagon-based distance estimation
+         *    (Which causes giant octagons to appear.)
+         * 2. Square root approximation by reinterpret-casting IEEE floats to
+         *    integers.
+         *    (Which causes angles to appear when two waves interfere.)
+         */
+
+/*      int_float u;
+        u.f = dx*dx + dy*dy;
+        u.i = (1 << 29) + (u.i >> 1) - (1 << 22);
+        dist = u.f; */
+
+#if defined USE_FAST_SQRT_BIGTABLE2
+        dist = dx*dx + dy*dy;
+        dist = FAST_TABLE(dist);
+#elif defined USE_FAST_SQRT_HACKISH
+        dist = fast_log2(dx*dx + dy*dy);
+#else
+        dist = sqrt(dx*dx + dy*dy);
+#endif
+
+        result += (dist >= c->radius ? 0 : c->wave_height[dist]);
       }
-      result %= c->colors;
 
-#ifdef USE_XIMAGE
-      /* Fill in these `gridsize' horizontal bits in the scanline */
-      for(k = 0; k < g; k++)
-       XPutPixel(c->ximage, (g*i)+k, 0, c->pal[result].pixel);
+      /* It's slightly faster to do a subtraction or two before calculating the
+       * modulus. - D.O. */
+      if(result >= c->colors)
+      {
+        result -= c->colors;
+        if(result >= c->colors)
+          result %= (unsigned)c->colors;
+      }
 
-#else  /* !USE_XIMAGE */
-      XFillRectangle(c->dpy, TARGET(c), c->gcs[result], g*i, g*j, g, g); 
-#endif /* !USE_XIMAGE */
+#ifdef USE_XIMAGE
+      c->row[i] = c->pal[result].pixel;
+#else
+      XFillRectangle(c->dpy, TARGET(c), c->gcs[result], g*i, g*j, g, g);
+#endif /* USE_XIMAGE */
     }
 
 #ifdef USE_XIMAGE
+    /* Fill in these `gridsize' horizontal bits in the scanline */
+    if(c->ximage->bits_per_pixel == 32)
+    {
+      uint32_t *ptr = (uint32_t *)scanline;
+      for(i = 0; i < w_div_g; i++) {
+        for(k = 0; k < g; k++)
+          ptr[g*i+k] = c->row[i];
+      }
+    }
+    else if(c->ximage->bits_per_pixel == 24)
+    {
+      uint8_t *ptr = (uint8_t *)scanline;
+      for(i = 0; i < w_div_g; i++) {
+        for(k = 0; k < g; k++) {
+          uint32_t pixel = c->row[i];
+          /* Might not work on big-endian. */
+          ptr[0] = pixel;
+          ptr[1] = (pixel & 0x0000ff00) >> 8;
+          ptr[2] = (pixel & 0x00ff0000) >> 16;
+          ptr += 3;
+        }
+      }
+    }
+    else if(c->ximage->bits_per_pixel == 16)
+    {
+      uint16_t *ptr = (uint16_t *)scanline;
+      for(i = 0; i < w_div_g; i++) {
+        for(k = 0; k < g; k++)
+          ptr[g*i+k] = c->row[i];
+      }
+    }
+    else if(c->ximage->bits_per_pixel == 8)
+    {
+      uint8_t *ptr = (uint8_t *)scanline;
+      for(i = 0; i < w_div_g; i++) {
+        for(k = 0; k < g; k++)
+          ptr[g*i+k] = c->row[i];
+      }
+    }
+    else
+    {
+      for(i = 0; i < w_div_g; i++) {
+        for(k = 0; k < g; k++)
+          XPutPixel(c->ximage, (g*i)+k, img_y, c->row[i]);
+      }
+    }
 
     /* Only the first scanline of the image has been filled in; clone that
        scanline to the rest of the `gridsize' lines in the ximage */
     for(k = 0; k < (g-1); k++)
-      memcpy(c->ximage->data + (c->ximage->bytes_per_line * (k + 1)),
-            c->ximage->data + (c->ximage->bytes_per_line * k),
-            c->ximage->bytes_per_line);
+      memcpy(c->ximage->data + (c->ximage->bytes_per_line * (img_y + k + 1)),
+             c->ximage->data + (c->ximage->bytes_per_line * img_y),
+             c->ximage->bytes_per_line);
 
+# ifndef USE_BIG_XIMAGE
     /* Move the bits for this horizontal stripe to the server. */
-# ifdef HAVE_XSHM_EXTENSION
-    if (c->use_shm)
-      XShmPutImage(c->dpy, TARGET(c), c->copy_gc, c->ximage,
-                  0, 0, 0, g*j, c->ximage->width, c->ximage->height,
-                  False);
-    else
-# endif /*  HAVE_XSHM_EXTENSION */
+#  ifdef HAVE_XSHM_EXTENSION
+    if (!c->use_shm)
+#  endif /*  HAVE_XSHM_EXTENSION */
       XPutImage(c->dpy, TARGET(c), c->copy_gc, c->ximage,
-               0, 0, 0, g*j, c->ximage->width, c->ximage->height);
+                0, 0, 0, g*j, c->ximage->width, c->ximage->height);
+# endif
+
+# if defined HAVE_XSHM_EXTENSION && !defined USE_BIG_XIMAGE
+    if (c->use_shm)
+# endif
+    {
+# if defined HAVE_XSHM_EXTENSION || defined USE_BIG_XIMAGE
+      scanline = (char *)scanline + c->ximage->bytes_per_line * g;
+      img_y += g;
+# endif
+    }
 
 #endif /* USE_XIMAGE */
   }
 
+#ifdef HAVE_XSHM_EXTENSION
+  if (c->use_shm)
+  {
+    XShmPutImage(c->dpy, c->win, c->copy_gc, c->ximage,
+                 0, 0, 0, 0, c->ximage->width, c->ximage->height,
+                 True);
+    c->shm_can_draw = False;
+  }
+#endif
+#if defined HAVE_XSHM_EXTENSION && defined USE_BIG_XIMAGE
+  else
+#endif
+#ifdef USE_BIG_XIMAGE
+  {
+    XPutImage(c->dpy, TARGET(c), c->copy_gc, c->ximage,
+              0, 0, 0, 0, c->ximage->width, c->ximage->height);
+  }
+#endif
+
 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
   if (c->back_buf)
     {
@@ -435,12 +872,16 @@ static void do_inter(struct inter_context* c)
         XCopyArea (c->dpy, c->pix_buf, c->win, c->copy_gc,
                    0, 0, c->w, c->h, 0, 0);
       }
+
+  return c->delay;
 }
 
 static void *
 interference_init (Display *dpy, Window win)
 {
   struct inter_context *c = (struct inter_context *) calloc (1, sizeof(*c));
+  if(!c)
+    abort_no_mem();
   inter_init(dpy, win, c);
   return c;
 }
@@ -449,8 +890,7 @@ static unsigned long
 interference_draw (Display *dpy, Window win, void *closure)
 {
   struct inter_context *c = (struct inter_context *) closure;
-  do_inter(c);
-  return c->delay;
+  return do_inter(c);
 }
 
 static void
@@ -458,19 +898,54 @@ interference_reshape (Display *dpy, Window window, void *closure,
                  unsigned int w, unsigned int h)
 {
   struct inter_context *c = (struct inter_context *) closure;
+  XWindowAttributes xgwa;
+  Bool dbuf = (c->pix_buf
+# ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+               || c->back_buf
+# endif
+               );
+
   c->w = w;
   c->h = h;
+
+#ifdef USE_XIMAGE
+  destroy_image(dpy, c);
+  c->ximage = 0;
+#endif
+
+  if(c->pix_buf)
+    XFreePixmap(dpy, c->pix_buf);
+  c->pix_buf = None;
+
+  XGetWindowAttributes(dpy, window, &xgwa);
+  xgwa.width = w;
+  xgwa.height = h;
+  create_image(dpy, c, &xgwa);
+  if(dbuf)
+    create_pix_buf(dpy, window, c, &xgwa);
 }
 
 static Bool
 interference_event (Display *dpy, Window window, void *closure, XEvent *event)
 {
+#if HAVE_XSHM_EXTENSION
+  struct inter_context *c = (struct inter_context *) closure;
+
+  if(c->use_shm && event->type == XShmGetEventBase(dpy) + ShmCompletion)
+  {
+    c->shm_can_draw = True;
+    return True;
+  }
+#endif
   return False;
 }
 
 static void
 interference_free (Display *dpy, Window window, void *closure)
 {
+  struct inter_context *c = (struct inter_context *) closure;
+  inter_free(dpy, c);
 }
 
 XSCREENSAVER_MODULE ("Interference", interference)
+
index ba5268ab26145df0b06441607a891974aae140cd..bcbd19ee3a6dc07f3b67553bdc8e46c7ad3bd670 100644 (file)
@@ -419,7 +419,7 @@ intermomentary_init (Display *dpy, Window window)
       bgs = fgs;
       bgv = fgv / 10.0;
 #endif
-      make_color_ramp (st->dpy, st->xgwa.colormap,
+      make_color_ramp (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
                        bgh, bgs, bgv,
                        fgh, fgs, fgv,
                        st->colors, &st->ncolors,
@@ -554,6 +554,9 @@ static const char *intermomentary_defaults[] = {
     "*maxRiders: 40",
     "*maxRadius: 100",
     "*colors: 256",
+#ifdef USE_IPHONE
+    "*ignoreRotation: True",
+#endif
     0
 };
 
index fe7ad4366d3064868edf3950ffb82ec808f4ca72..d7066b0896e94d2dad8b8d8156423482292330ab 100644 (file)
@@ -38,11 +38,12 @@ static const char sccsid[] = "@(#)julia.c   4.03 97/04/10 xlockmore";
  */
 
 #ifdef STANDALONE
-# define DEFAULTS      "*count:                1000  \n"                       \
-                                       "*cycles:               20    \n"                       \
-                                       "*delay:                10000 \n"                       \
-                                       "*ncolors:              200   \n" \
-                                       "*fpsSolid:             true   \n" \
+# define DEFAULTS      "*count:                  1000   \n" \
+                                       "*cycles:                 20     \n" \
+                                       "*delay:                  10000  \n" \
+                                       "*ncolors:                200    \n" \
+                                       "*fpsSolid:               true   \n" \
+                                       "*ignoreRotation: True   \n" \
 
 # define UNIFORM_COLORS
 # include "xlockmore.h"                                /* in xscreensaver distribution */
index 8c3f80b978ae9b903f51a55ed07a90268d2835ec..f260360d251397e1eb93ddae575443e687b72573 100644 (file)
@@ -100,6 +100,9 @@ static const char *kaleidescope_defaults [] = {
   "*greenrange:     20000",
   "*bluemin:        30000",
   "*bluerange:      20000",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
index b835f5bf9fa8f63896be7bd6df94858cec95cf5f..44df19b41a34cc48854bfef81ec67e5535f27e59 100644 (file)
@@ -55,6 +55,9 @@ static const char *kumppa_defaults [] ={
   "*random:            True",
   /* leave this off by default, since it slows things down.  -- jwz. */
   "*useDBE:            False",
+#ifdef USE_IPHONE
+  "*ignoreRotation:     True",
+#endif
   0
 };
 
index 7a998738f73b2de0471bd6b9dfad443c3c0463fe..ad3e1b02cd211467c8c56c18afbdf245c1593743 100644 (file)
@@ -91,6 +91,7 @@ static const char sccsid[] = "@(#)loop.c      5.01 2000/03/15 xlockmore";
                                        "*size:    -12    \n" \
                                        "*ncolors: 15     \n" \
                                        "*fpsSolid: true     \n" \
+                                       "*ignoreRotation: True \n" \
 
 # define UNIFORM_COLORS
 # define loop_handle_event 0
index 8576386b2ae9c4aba0af4c135c21830fcef9ce89..fda3e811b8754b425f3344897f990f943c481ef2 100644 (file)
@@ -1588,6 +1588,9 @@ maze_draw (Display *dpy, Window window, void *closure)
         st->stop = 0;
         st->state = 1;
 
+        if (st->solve_state && st->solve_state->running)
+          st->solve_state->running = 0;
+
         st->sync_p = ((random() % 4) != 0);
 
         size = get_integer_resource (st->dpy, "gridSize", "Dimension");
index afaed3c99dd6e574eeb4ca7558d41865823db7f7..ddd07eed83c49609766691369d80a5d225eb108e 100644 (file)
@@ -86,7 +86,7 @@ memscroller_init (Display *dpy, Window window)
   {
     int ncolors = 255;
     XColor colors[256];
-    make_random_colormap (st->dpy, st->xgwa.visual, st->xgwa.colormap,
+    make_random_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
                           colors, &ncolors, True, True, 0, False);
   }
 
index 02d418ba395db7bbb60e7b42988f8283df2f4e84..b79dd95d94151550f4fd346a4753791a6e410008 100644 (file)
@@ -408,6 +408,9 @@ static const char *metaballs_defaults [] = {
   "*delay:    10000",
   "*radius:   100",
   "*delta:   3",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
index 10797a5f2610ecbfb1b8f6b825f5cedcddb9b534..d55a9b85db7264ec07b166913a6f3011a13d1348 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1997-2008 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1997-2013 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
@@ -120,7 +120,7 @@ moire_init_1 (struct state *st)
 
       st->colors = (XColor *) malloc (sizeof (XColor) * (st->ncolors+2));
       memset(st->colors, 0, (sizeof (XColor) * (st->ncolors+2)));
-      make_color_ramp (st->dpy, xgwa.colormap,
+      make_color_ramp (xgwa.screen, xgwa.visual, xgwa.colormap,
                       fgh, fgs, fgv, bgh, bgs, bgv,
                       st->colors, &st->ncolors,
                       True, True, False);
@@ -259,6 +259,9 @@ static const char *moire_defaults [] = {
   "*useSHM:          True",
 #else
   "*useSHM:          False",
+#endif
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
 #endif
   0
 };
index 441a371371bda38ba5c39d75cdfca3e1e16f6e2d..69bfe696089af92d48fd08ef122e4c3a606fb305 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1997, 1998, 2006 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1997-2013 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
@@ -64,7 +64,8 @@ moire2_init_1 (struct state *st)
   if (mono_p)
     ;
   else
-    make_smooth_colormap (st->dpy, xgwa.visual, xgwa.colormap, st->colors, &st->ncolors,
+    make_smooth_colormap (xgwa.screen, xgwa.visual, xgwa.colormap,
+                          st->colors, &st->ncolors,
                          True, 0, True);
 
   st->bg_pixel = get_pixel_resource(st->dpy,
@@ -328,6 +329,9 @@ static const char *moire2_defaults [] = {
   "*thickness:         0",
   "*colors:            150",
   "*colorShift:                5",
+#ifdef USE_IPHONE
+  "*ignoreRotation:     True",
+#endif
 
 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
   /* Off by default, since it slows it down a lot, and the flicker isn't really
index 2636375edf4bcab802c8ecafebdf9399884febfe..902a3e224baddedb990106a438d1d4069420d0bc 100644 (file)
@@ -437,6 +437,9 @@ static const char *munch_defaults [] = {
   "*simul:            5",
   "*clear:            65",
   "*xor:              True",
+#ifdef USE_IPHONE
+  "*ignoreRotation:   True",
+#endif
   0
 };
 
index d0de73c98dbd4769a496ede4d5a2754dd58530df..fe58ea1a5d1779c8b02157e357904ef1fa19277e 100644 (file)
@@ -799,7 +799,8 @@ static void setupColormap (struct state *st, XWindowAttributes *xgwa)
     colors[0].pixel = get_pixel_resource (st->dpy, xgwa->colormap,
                                           "background", "Background");
     
-    make_color_ramp (st->dpy, xgwa->colormap, h1, s1, v1, h2, s2, v2,
+    make_color_ramp (xgwa->screen, xgwa->visual, xgwa->colormap,
+                     h1, s1, v1, h2, s2, v2,
                     colors + 1, &st->colorCount, False, True, False);
 
     if (st->colorCount < 1)
@@ -1324,6 +1325,9 @@ static const char *nerverot_defaults [] = {
     "*maxRadius:        25",
     "*maxNerveRadius:  0.7",
     "*nervousness:     0.3",
+#ifdef USE_IPHONE
+    "*ignoreRotation:   True",
+#endif
     0
 };
 
index 23fb3a1d4d0b743a43fb2e82e5abf0a0649b2a52..57219beed680e98a8fd93d5f807ebe8474c54cd3 100644 (file)
@@ -1779,8 +1779,10 @@ ENTRYPOINT void
 reshape_pacman(ModeInfo * mi, int width, int height)
 {
     pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
-    pp->width = width;
+    pp->width  = width;
     pp->height = height;
+    pp->xb = (pp->width  - pp->ncols * pp->xs) >> 1;
+    pp->yb = (pp->height - pp->nrows * pp->ys) >> 1;
     MI_CLEARWINDOW (mi);
     /* repopulate (mi); */
     drawlevel (mi);
index d617942cf4613c057aa03164052e9a7f5a79ebe7..f26b3bfe120b0e0681f7e833a57cfef0398e5869 100644 (file)
@@ -539,7 +539,7 @@ pacman_is_bonus_dot (pacmangamestruct *pp, int x, int y, int *idx)
 {
     int ret = False;
     int i;
-    for (i = 0; i <= NUM_BONUS_DOTS; i++) {
+    for (i = 0; i < NUM_BONUS_DOTS; i++) {
 /*     fprintf(stderr,"is bonus: passed x (%d, %d) bonus (%d, %d)\n",x,y,bonus_dots[i].x, bonus_dots[i].y); */
         if (x == pp->bonus_dots[i].x && y == pp->bonus_dots[i].y) {
             ret = True;
@@ -553,7 +553,7 @@ pacman_is_bonus_dot (pacmangamestruct *pp, int x, int y, int *idx)
 static void
 check_bonus_idx (int idx)
 {
-    assert (0 <= idx && idx <= NUM_BONUS_DOTS);
+    assert (0 <= idx && idx < NUM_BONUS_DOTS);
 }
 
 int
index 7495aaeba73a2f7ebb845256879c65fdf597a3d2..c38f6f0e7230d6eea1860b10086df1ddf0a2d5fb 100644 (file)
@@ -312,6 +312,9 @@ static const char *pedal_defaults [] = {
   "*fpsSolid:                  true",
   "*delay:                     5",
   "*maxlines:                  1000",
+#ifdef USE_IPHONE
+  "*ignoreRotation:             True",
+#endif
   0
 };
 
index 6b07d8ca65e722e6e462b91681167cf83b890ac8..6910e5f393c974e831958969be5b45549b6bfb24 100644 (file)
@@ -87,6 +87,7 @@ If one of these are hit penrose will reinitialize.
                                        "*size: 40 \n" \
                                        "*ncolors: 64 \n" \
                                        "*fpsSolid: true \n" \
+                                       "*ignoreRotation: True \n" \
 
 # define refresh_penrose 0
 # define penrose_handle_event 0
index 860d0349e95e39cb28a293f2f77086e6641bba77..e08beee377b1d25e57aa497ce5ccad08b0219260 100644 (file)
@@ -141,7 +141,7 @@ static void setup_random_colormap (struct state *st, XWindowAttributes *xgwa)
     colors[0].pixel = get_pixel_resource (st->dpy, xgwa->colormap,
                                           "background", "Background");
     
-    make_random_colormap (st->dpy, xgwa->visual, xgwa->colormap,
+    make_random_colormap (xgwa->screen, xgwa->visual, xgwa->colormap,
                          colors+1, &ncolors, True, True, 0, True);
     if (ncolors < 1)
       {
@@ -732,6 +732,9 @@ static const char *petri_defaults [] = {
   "*originalcolors:    false",
   "*memThrottle:        22M",  /* don't malloc more than this much.
                                    Scale the pixels up if necessary. */
+#ifdef USE_IPHONE
+  "*ignoreRotation:     True",
+#endif
     0
 };
 
index b7ec540725121a6f030358500fb799e275f2e6ca..63df6dfeb1388ee71c5dd96402e46b896a535780 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1999-2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1999-2013 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
@@ -236,7 +236,8 @@ phosphor_init (Display *dpy, Window window)
     /* Now allocate a ramp of colors from the main color to the background. */
     rgb_to_hsv (start.red, start.green, start.blue, &h1, &s1, &v1);
     rgb_to_hsv (end.red, end.green, end.blue, &h2, &s2, &v2);
-    make_color_ramp (state->dpy, state->xgwa.colormap,
+    make_color_ramp (state->xgwa.screen, state->xgwa.visual,
+                     state->xgwa.colormap,
                      h1, s1, v1,
                      h2, s2, v2,
                      colors, &ncolors,
index af01a99d32aa2f5746c35356be54ef0c82893cec..9cfbefdf70c283e581e10aeb9fa92dbae50d51df 100644 (file)
@@ -861,7 +861,9 @@ piecewise_init (Display *dd, Window ww)
       st->colors[0].pixel = get_pixel_resource(st->dpy, st->xgwa.colormap, "foreground", "Foreground");
     }
   else {
-    make_color_loop(st->dpy, st->xgwa.colormap, 0, 1, 1, 120, 1, 1, 240, 1, 1, st->colors, &st->ncolors, True, False);
+    make_color_loop(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+                    0, 1, 1, 120, 1, 1, 240, 1, 1,
+                    st->colors, &st->ncolors, True, False);
     if (st->ncolors < 2)
       goto MONO; 
     }
@@ -975,6 +977,9 @@ static const char *piecewise_defaults [] = {
 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
   "*useDBE:             True",
 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+#ifdef USE_IPHONE
+  "*ignoreRotation:     True",
+#endif
   0
   };
 
index c7b84a74a42146f5a3f9f6409bf42ba402e3551c..a3037d281c381e11ae6130b0cc39973356a7a03c 100644 (file)
@@ -54,6 +54,9 @@ static const char sccsid[] = "@(#)polyominoes.c 5.01 2000/12/18 xlockmore";
 static Bool identical;
 static Bool plain;
 
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
 static XrmOptionDescRec opts[] =
 {
   {"-identical", ".polyominoes.identical", XrmoptionNoArg, "on"},
@@ -791,7 +794,7 @@ static void create_bitmaps(ModeInfo * mi, polyominoesstruct *sp)
   int x,y,n;
   char *data;
 
-  for (n=0;n<256;n++) {
+  for (n=0;n<countof(sp->bitmaps);n++) {
 
 /* Avoid duplication of identical bitmaps. */
     if (IS_LEFT_UP(n) && (IS_LEFT(n) || IS_UP(n)))
@@ -1030,7 +1033,7 @@ static void free_bitmaps(polyominoesstruct *sp)
 {
   int n;
   
-  for (n=0;n<256;n++)
+  for (n=0;n<countof(sp->bitmaps);n++)
 /* Don't bother to free duplicates */
     if (IS_LEFT_UP(n) && (IS_LEFT(n) || IS_UP(n)))
       sp->bitmaps[n] = None;
@@ -1500,7 +1503,7 @@ static void make_one_sided_pentomino(void)
   int i,j,t,u;
 
   j=0;
-  for (i=0;i<18;i++) {
+  for (i=0;i<countof(pentomino);i++) {
     one_sided_pentomino[j] = pentomino[i];
     for (t=0;t<8;t++)
       if (one_sided_pentomino[j].transform_list[t]>=4) {
@@ -1522,7 +1525,7 @@ static void make_one_sided_hexomino(void)
   int i,j,t,u;
 
   j=0;
-  for (i=0;i<35;i++) {
+  for (i=0;i<countof(hexomino);i++) {
     one_sided_hexomino[j] = hexomino[i];
     for (t=0;t<8;t++)
       if (one_sided_hexomino[j].transform_list[t]>=4) {
@@ -1567,9 +1570,10 @@ int set_pentomino_puzzle(polyominoesstruct *sp)
   }
 
   sp->nr_polyominoes = 12;
-  set_allocate(sp->polyomino,polyomino_type,12*sizeof(polyomino_type));
-  random_permutation(12,perm_poly);
-  for (p=0;p<12;p++) {
+  set_allocate(sp->polyomino,polyomino_type,
+               sp->nr_polyominoes*sizeof(polyomino_type));
+  random_permutation(sp->nr_polyominoes,perm_poly);
+  for (p=0;p<sp->nr_polyominoes;p++) {
     copy_polyomino(sp->polyomino[p],pentomino[perm_poly[p]],1);
   }
 
@@ -1615,9 +1619,10 @@ int set_one_sided_pentomino_puzzle(polyominoesstruct *sp)
   }
 
   sp->nr_polyominoes = 18;
-  set_allocate(sp->polyomino,polyomino_type,18*sizeof(polyomino_type));
-  random_permutation(18,perm_poly);
-  for (p=0;p<18;p++) {
+  set_allocate(sp->polyomino,polyomino_type,
+               sp->nr_polyominoes*sizeof(polyomino_type));
+  random_permutation(sp->nr_polyominoes,perm_poly);
+  for (p=0;p<sp->nr_polyominoes;p++) {
     copy_polyomino(sp->polyomino[p],one_sided_pentomino[perm_poly[p]],1);
   }
 
@@ -1674,9 +1679,10 @@ int set_one_sided_hexomino_puzzle(polyominoesstruct *sp)
   }
 
   sp->nr_polyominoes = 60;
-  set_allocate(sp->polyomino,polyomino_type,60*sizeof(polyomino_type));
-  random_permutation(60,perm_poly);
-  for (p=0;p<60;p++) {
+  set_allocate(sp->polyomino,polyomino_type,
+               sp->nr_polyominoes*sizeof(polyomino_type));
+  random_permutation(sp->nr_polyominoes,perm_poly);
+  for (p=0;p<sp->nr_polyominoes;p++) {
     copy_polyomino(sp->polyomino[p],one_sided_hexomino[perm_poly[p]],1);
   }
 
@@ -1711,12 +1717,13 @@ int set_tetr_pentomino_puzzle(polyominoesstruct *sp)
   }
 
   sp->nr_polyominoes = 17;
-  set_allocate(sp->polyomino,polyomino_type,17*sizeof(polyomino_type));
-  random_permutation(17,perm_poly);
-  for (p=0;p<5;p++) {
+  set_allocate(sp->polyomino,polyomino_type,
+               sp->nr_polyominoes*sizeof(polyomino_type));
+  random_permutation(sp->nr_polyominoes,perm_poly);
+  for (p=0;p<countof(tetromino);p++) {
     copy_polyomino(sp->polyomino[perm_poly[p]],tetromino[p],1);
   }
-  for (p=0;p<12;p++) {
+  for (p=0;p<countof(pentomino);p++) {
     copy_polyomino(sp->polyomino[perm_poly[p+5]],pentomino[p],1);
   }
 
@@ -1760,10 +1767,10 @@ int set_pent_hexomino_puzzle(polyominoesstruct *sp)
   sp->nr_polyominoes = 47;
   set_allocate(sp->polyomino,polyomino_type,47*sizeof(polyomino_type));
   random_permutation(47,perm_poly);
-  for (p=0;p<12;p++) {
+  for (p=0;p<countof(pentomino);p++) {
     copy_polyomino(sp->polyomino[perm_poly[p]],pentomino[p],1);
   }
-  for (p=0;p<35;p++) {
+  for (p=0;p<countof(hexomino);p++) {
     copy_polyomino(sp->polyomino[perm_poly[p+12]],hexomino[p],1);
   }
 
@@ -1800,8 +1807,9 @@ int set_pentomino_puzzle1(polyominoesstruct *sp)
   sp->height =5;
 
   sp->nr_polyominoes = 10;
-  set_allocate(sp->polyomino,polyomino_type,10*sizeof(polyomino_type));
-  for (p=0;p<10;p++) {
+  set_allocate(sp->polyomino,polyomino_type,
+               sp->nr_polyominoes*sizeof(polyomino_type));
+  for (p=0;p<sp->nr_polyominoes;p++) {
     copy_polyomino(sp->polyomino[p],pentomino1,1);
   }
 
@@ -1831,8 +1839,9 @@ int set_hexomino_puzzle1(polyominoesstruct *sp)
   sp->height =23;
 
   sp->nr_polyominoes = 92;
-  set_allocate(sp->polyomino,polyomino_type,92*sizeof(polyomino_type));
-  for (p=0;p<92;p++) {
+  set_allocate(sp->polyomino,polyomino_type,
+               sp->nr_polyominoes*sizeof(polyomino_type));
+  for (p=0;p<sp->nr_polyominoes;p++) {
     copy_polyomino(sp->polyomino[p],hexomino1,1);
   }
 
@@ -1866,8 +1875,9 @@ int set_heptomino_puzzle1(polyominoesstruct *sp)
   sp->height =21;
 
   sp->nr_polyominoes = 78;
-  set_allocate(sp->polyomino,polyomino_type,78*sizeof(polyomino_type));
-  for (p=0;p<78;p+=2) {
+  set_allocate(sp->polyomino,polyomino_type,
+               sp->nr_polyominoes*sizeof(polyomino_type));
+  for (p=0;p<sp->nr_polyominoes;p+=2) {
     copy_polyomino(sp->polyomino[p],heptomino1,1);
     copy_polyomino(sp->polyomino[p+1],heptomino1,0);
   }
@@ -1897,8 +1907,9 @@ int set_heptomino_puzzle2(polyominoesstruct *sp)
   sp->height =19;
 
   sp->nr_polyominoes = 76;
-  set_allocate(sp->polyomino,polyomino_type,76*sizeof(polyomino_type));
-  for (p=0;p<76;p++) {
+  set_allocate(sp->polyomino,polyomino_type,
+               sp->nr_polyominoes*sizeof(polyomino_type));
+  for (p=0;p<sp->nr_polyominoes;p++) {
     copy_polyomino(sp->polyomino[p],heptomino1,1);
   }
 
@@ -1933,8 +1944,9 @@ int set_elevenomino_puzzle1(polyominoesstruct *sp)
   sp->height =22;
 
   sp->nr_polyominoes = 50;
-  set_allocate(sp->polyomino,polyomino_type,50*sizeof(polyomino_type));
-  for (p=0;p<50;p+=2) {
+  set_allocate(sp->polyomino,polyomino_type,
+               sp->nr_polyominoes*sizeof(polyomino_type));
+  for (p=0;p<sp->nr_polyominoes;p+=2) {
     copy_polyomino(sp->polyomino[p],elevenomino1,1);
     copy_polyomino(sp->polyomino[p+1],elevenomino1,0);
   }
@@ -1970,8 +1982,9 @@ int set_dekomino_puzzle1(polyominoesstruct *sp)
   sp->height =30;
 
   sp->nr_polyominoes = 96;
-  set_allocate(sp->polyomino,polyomino_type,96*sizeof(polyomino_type));
-  for (p=0;p<96;p++) {
+  set_allocate(sp->polyomino,polyomino_type,
+               sp->nr_polyominoes*sizeof(polyomino_type));
+  for (p=0;p<sp->nr_polyominoes;p++) {
     copy_polyomino(sp->polyomino[p],dekomino1,1);
   }
 
@@ -2004,8 +2017,9 @@ int set_octomino_puzzle1(polyominoesstruct *sp)
   sp->height =26;
 
   sp->nr_polyominoes = 312;
-  set_allocate(sp->polyomino,polyomino_type,312*sizeof(polyomino_type));
-  for (p=0;p<312;p++) {
+  set_allocate(sp->polyomino,polyomino_type,
+               sp->nr_polyominoes*sizeof(polyomino_type));
+  for (p=0;p<sp->nr_polyominoes;p++) {
     copy_polyomino(sp->polyomino[p],octomino1,1);
   }
 
@@ -2030,8 +2044,9 @@ int set_pentomino_puzzle2(polyominoesstruct *sp)
   sp->height =15;
 
   sp->nr_polyominoes = 45;
-  set_allocate(sp->polyomino,polyomino_type,45*sizeof(polyomino_type));
-  for (p=0;p<45;p++) {
+  set_allocate(sp->polyomino,polyomino_type,
+               sp->nr_polyominoes*sizeof(polyomino_type));
+  for (p=0;p<sp->nr_polyominoes;p++) {
     copy_polyomino(sp->polyomino[p],pentomino1,1);
   }
 
@@ -2057,8 +2072,9 @@ int set_elevenomino_puzzle2(polyominoesstruct *sp)
   sp->height =33;
 
   sp->nr_polyominoes = 141;
-  set_allocate(sp->polyomino,polyomino_type,141*sizeof(polyomino_type));
-  for (p=0;p<141;p++) {
+  set_allocate(sp->polyomino,polyomino_type,
+               sp->nr_polyominoes*sizeof(polyomino_type));
+  for (p=0;p<sp->nr_polyominoes;p++) {
     copy_polyomino(sp->polyomino[p],elevenomino1,1);
   }
 
index 15cb61b4a6f36cc1219987811e3c74250f3ecb21..55d3db175e808e3e44577ccd90a123f006159770 100644 (file)
@@ -96,7 +96,7 @@ popsquares_init (Display *dpy, Window window)
 
   rgb_to_hsv (fg.red, fg.green, fg.blue, &h1, &s1, &v1);
   rgb_to_hsv (bg.red, bg.green, bg.blue, &h2, &s2, &v2);
-  make_color_ramp (st->dpy, st->xgwa.colormap,
+  make_color_ramp (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
                    h1, s1, v1,
                    h2, s2, v2,
                    st->colors, &st->ncolors,  /* would this be considered a value-result argument? */
@@ -246,6 +246,9 @@ static const char *popsquares_defaults [] = {
   "*useDBE: True",
   "*useDBEClear: True",
 #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
index ad1e26e7a6ef951834ec60f72b8c2bb37d400f1c..04d0928009e09471495460f6e9218c3558180a6c 100644 (file)
@@ -592,6 +592,9 @@ static const char *qix_defaults [] = {
   "*transparent:true",
   "*gravity:   false",
   "*additive:  true",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
index 0c074ea49f442e928539ab323da3f939e9af6383..3e9acbc50e3a5e95d0d892537fd70adab94af867 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992-2008 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2013 Jamie Zawinski <jwz@jwz.org>
  *
  *  reaction/diffusion textures
  *  Copyright (c) 1997 Scott Draves spot@transmeta.com
@@ -308,6 +308,9 @@ static const char *rd_defaults [] = {
   "*useSHM:    True",
 #else
   "*useSHM:    False",
+#endif
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
 #endif
   0
 };
@@ -333,7 +336,8 @@ static void
 random_colors(struct state *st)
 {
   memset(st->colors, 0, st->ncolors*sizeof(*st->colors));
-  make_smooth_colormap (st->dpy, st->visual, st->cmap, st->colors, &st->ncolors,
+  make_smooth_colormap (st->xgwa.screen, st->visual, st->cmap,
+                        st->colors, &st->ncolors,
                        True, 0, True);
   if (st->ncolors <= 2) {
     mono_p = True;
index e030b1cd1d85f7cba8715e7f7b888803d000983d..bffd2c68014f79a0de17d903f40c9cc909388ff2 100644 (file)
@@ -62,6 +62,7 @@ struct state {
   XImage *orig_map, *buffer_map;
   int ctab[256];
   Colormap colormap;
+  Screen *screen;
   int ncolors;
   int light;
 
@@ -495,6 +496,7 @@ setup_X(struct state *st)
   XGetWindowAttributes(st->dpy, st->window, &xgwa);
   depth = xgwa.depth;
   st->colormap = xgwa.colormap;
+  st->screen = xgwa.screen;
   st->bigwidth = xgwa.width;
   st->bigheight = xgwa.height;
   st->visual = xgwa.visual;
@@ -656,7 +658,8 @@ init_oily_colors(struct state *st)
 
   if (!mono_p) {
     colors = (XColor *)malloc(sizeof(*colors) * (st->ncolors+1));
-    make_smooth_colormap(st->dpy, st->visual, st->colormap, colors, &st->ncolors,
+    make_smooth_colormap(st->screen, st->visual, st->colormap,
+                         colors, &st->ncolors,
                          True, /* allocate */
                          False, /* not writable */
                          True); /* verbose (complain about failure) */
@@ -1104,6 +1107,9 @@ static const char *ripples_defaults[] =
   "*useSHM: True",
 #else
   "*useSHM: False",
+#endif
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
 #endif
   0
 };
index f1c606337124b48eb2da67e042c5a7eefb041ad3..d44e75208fec0778b4443cd0437b6296262fda87 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992-2008 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2013 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
@@ -416,7 +416,8 @@ rocks_init (Display *d, Window w)
   XQueryColor(st->dpy, cmap, &st->colors[0]);
 
   st->ncolors--;
-  make_random_colormap(st->dpy, xgwa.visual, cmap, st->colors+1, &st->ncolors, True,
+  make_random_colormap(xgwa.screen, xgwa.visual, cmap,
+                       st->colors+1, &st->ncolors, True,
                       True, 0, True);
   st->ncolors++;
 
@@ -522,6 +523,9 @@ static const char *rocks_defaults [] = {
   "*left3d:    Blue",
   "*right3d:   Red",
   "*delta3d:   1.5",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
index b4f4aa89068b0aa722146b68bd373d3ed9115b0e..0d352696b71c1e51b5b5c0aa0370021c83e2c455 100644 (file)
@@ -188,6 +188,9 @@ static const char *rorschach_defaults [] = {
   "*iterations:        4000",
   "*offset:    7",
   "*delay:     5",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
index 610b952030c49c8d2eb6e9a84ab2798d23cccd2a..6298b34e0fd1ce8f3ab2a06202fa0e5245d08ddc 100644 (file)
@@ -461,6 +461,9 @@ static const char *rotzoomer_defaults[] = {
   "*numboxes: 2",
   "*delay: 10000",
   "*duration: 120",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
index 52344a35a74a319f09fdbea2c9e8b0e787e6d2ed..089e76b44b9dfed76537cd3ae1a52062c2e59cb6 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992-2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2013 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
@@ -727,13 +727,17 @@ main (int argc, char **argv)
   {
     char *v = (char *) strdup(strchr(screensaver_id, ' '));
     char *s1, *s2, *s3, *s4;
+    const char *ot = get_string_resource (dpy, "title", "Title");
     s1 = (char *) strchr(v,  ' '); s1++;
     s2 = (char *) strchr(s1, ' ');
     s3 = (char *) strchr(v,  '('); s3++;
     s4 = (char *) strchr(s3, ')');
     *s2 = 0;
     *s4 = 0;
-    sprintf (version, "%s: from the XScreenSaver %s distribution (%s.)",
+    if (ot && !*ot) ot = 0;
+    sprintf (version, "%.50s%s%s: from the XScreenSaver %s distribution (%s)",
+             (ot ? ot : ""),
+             (ot ? ": " : ""),
             progclass, s1, s3);
     free(v);
   }
index 881740c9996ed97fc30fbadae4b5b3f838928c4b..64fa82c9772d7e28b3ba7a87d3f74e4fd00fd6e1 100644 (file)
@@ -52,6 +52,9 @@ static const char *shadebobs_defaults [] = {
   "*cycles:   10",
   "*ncolors:  64",    /* changing this doesn't work particularly well */
   "*delay:    10000",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
index 5e7eedae7aa321198355fa28422e956dea637d04..4f1aa34a3051557fabffb46355f19a108c8c2f51 100644 (file)
@@ -39,6 +39,7 @@ static const char sccsid[] = "@(#)sierpinski.c        5.00 2000/11/01 xlockmore";
                                        "*cycles: 100 \n" \
                                        "*ncolors: 64 \n" \
                                        "*fpsSolid: true \n" \
+                                       "*ignoreRotation: True \n" \
 
 # define BRIGHT_COLORS
 # define sierpinski_handle_event 0
index 69aa10fc3723ea7a3a489ab7b7ae8bd0029b5430..23c990c296d13c66bc461a9847919b53e496623c 100644 (file)
@@ -469,6 +469,9 @@ static const char *slidescreen_defaults [] = {
   "*delay:                     50000",
   "*delay2:                    1000000",
   "*duration:                  120",
+#ifdef USE_IPHONE
+  "*ignoreRotation:             True",
+#endif
   0
 };
 
index e0b0ea4fa72c268ce3b3e133816ce52891ae252a..989dbf86301758bc5d5dc39d9afbb783f1f07244 100644 (file)
@@ -31,7 +31,8 @@ static const char sccsid[] = "@(#)slip.c      5.00 2000/11/01 xlockmore";
                                        "*count: 35 \n" \
                                        "*cycles: 50 \n" \
                                        "*ncolors: 200 \n" \
-                                       "*fpsSolid:     true \n"
+                                       "*fpsSolid:     true \n" \
+                                       "*ignoreRotation: True \n" \
 
 # define refresh_slip 0
 # define slip_handle_event 0
index 5c67082dad498be231ed5cdbe16c411be053d737..81c468686760db0eb49c289fc04d204385d54ac0 100644 (file)
@@ -110,6 +110,8 @@ struct state {
 
     Pixmap dbuf, stars_mask;
     Colormap cmap;
+    Visual *visual;
+    Screen *screen;
     unsigned int default_fg_pixel;
     GC draw_gc, erase_gc, tunnelend_gc, stars_gc, stars_erase_gc;
 
@@ -1260,7 +1262,7 @@ speedmine_color_ramp (struct state *st, GC *gcs, XColor * colors,
                h1 = h2 = RAND(360);
        }
 
-       make_color_ramp (st->dpy, st->cmap, 
+       make_color_ramp (st->screen, st->visual, st->cmap, 
                      h1, s1, v1, h2, s2, v2,
                                     colors, ncolors, False, True, False);
 
@@ -1286,9 +1288,9 @@ change_colors (struct state *st)
        double s1, s2;
 
        if (st->psychedelic_flag) {
-               free_colors (st->dpy, st->cmap, st->bonus_colors, st->nr_bonus_colors);
-               free_colors (st->dpy, st->cmap, st->wall_colors, st->nr_wall_colors);
-               free_colors (st->dpy, st->cmap, st->ground_colors, st->nr_ground_colors);
+               free_colors (st->screen, st->cmap, st->bonus_colors, st->nr_bonus_colors);
+               free_colors (st->screen, st->cmap, st->wall_colors, st->nr_wall_colors);
+               free_colors (st->screen, st->cmap, st->ground_colors, st->nr_ground_colors);
                s1 = 0.4; s2 = 0.9;
 
                st->ncolors = MAX_COLORS;
@@ -1296,8 +1298,8 @@ change_colors (struct state *st)
                                                          &st->ncolors, 0.0, 0.8, 0.0, 0.9);
                st->nr_ground_colors = st->ncolors;
        } else {
-               free_colors (st->dpy, st->cmap, st->bonus_colors, st->nr_bonus_colors);
-               free_colors (st->dpy, st->cmap, st->wall_colors, st->nr_wall_colors);
+               free_colors (st->screen, st->cmap, st->bonus_colors, st->nr_bonus_colors);
+               free_colors (st->screen, st->cmap, st->wall_colors, st->nr_wall_colors);
                st->ncolors = st->nr_ground_colors;
 
                s1 = 0.0; s2 = 0.6;
@@ -1371,7 +1373,8 @@ init_colors (struct state *st)
 
   rgb_to_hsv (dark.red, dark.green, dark.blue, &h1, &s1, &v1);
   rgb_to_hsv (light.red, light.green, light.blue, &h2, &s2, &v2);
-  make_color_ramp (st->dpy, st->cmap, h1, s1, v1, h2, s2, v2,
+  make_color_ramp (st->screen, st->visual, st->cmap,
+                   h1, s1, v1, h2, s2, v2,
                                  st->ground_colors, &st->ncolors, False, True, False);
   st->nr_ground_colors = st->ncolors;
 
@@ -1432,6 +1435,8 @@ speedmine_init (Display *dpy, Window window)
 
   XGetWindowAttributes (st->dpy, st->window, &xgwa);
   st->cmap = xgwa.colormap;
+  st->visual = xgwa.visual;
+  st->screen = xgwa.screen;
   st->width = xgwa.width;
   st->height = xgwa.height;
 
index 014fff6543a525faaea2212f2ebd563db55c05bb..cbd33f2a2e43857e584ea76f18ac583ff5214377 100644 (file)
@@ -320,6 +320,9 @@ static const char *spotlight_defaults [] = {
   "*delay:                     10000",
   "*duration:                  120",
   "*radius:                    125",
+#ifdef USE_IPHONE
+  "*ignoreRotation:             True",
+#endif
   0
 };
 
index 2a0b0fd29bb61016afe8abe1ed8dddb8925c8f38..e261f59a8226a49566211748bf55945910a541ad 100644 (file)
@@ -156,7 +156,7 @@ squiral_init (Display *dpy, Window window)
     st->erase_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
     cmap = xgwa.colormap;
     if( st->ncolors ) {
-        free_colors(st->dpy, cmap, st->colors, st->ncolors);
+        free_colors(xgwa.screen, cmap, st->colors, st->ncolors);
         st->ncolors = 0;
     }
     if( mono_p ) {
@@ -166,7 +166,8 @@ squiral_init (Display *dpy, Window window)
       st->ncolors = get_integer_resource(st->dpy, "ncolors", "Integer");
       if (st->ncolors < 0 || st->ncolors > NCOLORSMAX)
         st->ncolors = NCOLORSMAX;
-      make_uniform_colormap(st->dpy, xgwa.visual, cmap, st->colors, &st->ncolors, True,
+      make_uniform_colormap(xgwa.screen, xgwa.visual, cmap,
+                            st->colors, &st->ncolors, True,
          &writeable, False);
       if (st->ncolors <= 0) {
         st->ncolors = 1;
@@ -260,6 +261,9 @@ static const char *squiral_defaults[] = {
   "*disorder:   0.005",
   "*cycle:      False",
   "*handedness: 0.5",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
index 071dccb6f83819f4f60d37f6d911b5691cd74eed..6cfee31db8ddcb89a46fdb174cfd36c180056e53 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1997-2008 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1997-2013 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
@@ -341,7 +341,7 @@ reset_starfish (struct state *st)
   if (st->done_once)
     {
       if (st->colors && st->ncolors)
-       free_colors (st->dpy, st->cmap, st->colors, st->ncolors);
+       free_colors (xgwa.screen, st->cmap, st->colors, st->ncolors);
       if (st->colors)
        free (st->colors);
       st->colors = 0;
@@ -361,10 +361,12 @@ reset_starfish (struct state *st)
   if (mono_p)
     ;
   else if (random() % 3)
-    make_smooth_colormap (st->dpy, xgwa.visual, st->cmap, st->colors, &st->ncolors,
+    make_smooth_colormap (xgwa.screen, xgwa.visual, st->cmap,
+                          st->colors, &st->ncolors,
                          True, 0, True);
   else
-    make_uniform_colormap (st->dpy, xgwa.visual, st->cmap, st->colors, &st->ncolors,
+    make_uniform_colormap (xgwa.screen, xgwa.visual, st->cmap,
+                           st->colors, &st->ncolors,
                           True, 0, True);
 
   if (st->ncolors < 2) st->ncolors = 2;
@@ -526,6 +528,9 @@ static const char *starfish_defaults [] = {
   "*duration:          30",
   "*delay2:            5",
   "*mode:              random",
+#ifdef USE_IPHONE
+  "*ignoreRotation:     True",
+#endif
   0
 };
 
index 604f471b9af5d7e6125f55e10d3e066b15122d85..632d347a49c14af1d93fad503796a160272c9c76 100644 (file)
@@ -38,7 +38,8 @@ static const char sccsid[] = "@(#)strange.c   5.00 2000/11/01 xlockmore";
 # define MODE_strange
 # define DEFAULTS      "*delay: 10000 \n" \
                                        "*ncolors: 100 \n" \
-                                       "*fpsSolid: True \n"
+                                       "*fpsSolid: True \n" \
+                                       "*ignoreRotation: True \n" \
 
 # define SMOOTH_COLORS
 # define refresh_strange 0
index 517c4977e9ec489ef4d72b95da2c93318d1d4d2a..82ea6d9ee81bedf4b2dc720de28e6ae64ad134d9 100644 (file)
@@ -720,6 +720,9 @@ static const char *substrate_defaults[] = {
     "*maxCracks: 100",
     "*sandGrains: 64",
     "*circlePercent: 33",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
     0
 };
 
index ba959ac692045fc483901291d73a469433863312..efe2f8d1d89b3b57d87c35a0373792294d515c01 100644 (file)
@@ -35,6 +35,7 @@ static const char sccsid[] = "@(#)swirl.c     4.00 97/01/01 xlockmore";
                                        "*ncolors:              200     \n"                     \
                                        "*useSHM:               True    \n" \
                                        "*fpsSolid:             true    \n" \
+                                       "*ignoreRotation: True \n" \
 
 # define SMOOTH_COLORS
 # define WRITABLE_COLORS
@@ -1352,7 +1353,7 @@ draw_swirl(ModeInfo * mi)
                if (swirl->drawing) {
 #ifdef STANDALONE
                  if (mi->writable_p)
-                       rotate_colors(MI_DISPLAY(mi), MI_COLORMAP(mi),
+                       rotate_colors(mi->xgwa.screen, MI_COLORMAP(mi),
                                                  swirl->rgb_values, swirl->colours, 1);
 #else  /* !STANDALONE */
                        /* rotate the colours */
@@ -1374,7 +1375,7 @@ draw_swirl(ModeInfo * mi)
                } else {
 #ifdef STANDALONE
                  if (mi->writable_p)
-                       rotate_colors(MI_DISPLAY(mi), MI_COLORMAP(mi),
+                       rotate_colors(mi->xgwa.screen, MI_COLORMAP(mi),
                                                  swirl->rgb_values, swirl->colours, 1);
 #else  /* !STANDALONE */
                        /* rotate the colours */
@@ -1412,10 +1413,9 @@ draw_swirl(ModeInfo * mi)
 #ifdef STANDALONE
                                        /* Pick a new colormap! */
                                        XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
-                                       free_colors (MI_DISPLAY(mi), MI_COLORMAP(mi),
+                                       free_colors (mi->xgwa.screen, MI_COLORMAP(mi),
                                                                 mi->colors, mi->npixels);
-                                       make_smooth_colormap (MI_DISPLAY(mi),
-                                                                                 MI_VISUAL(mi),
+                                       make_smooth_colormap (mi->xgwa.screen, MI_VISUAL(mi),
                                                                                  MI_COLORMAP(mi),
                                                                                  mi->colors, &mi->npixels, True,
                                                                                  &mi->writable_p, True);
index e7bbf6ddf360b24935a98aeee59750b3077ae945..cb5541de2e99b9bc12e3c697f558c7971a03e997 100644 (file)
@@ -36,6 +36,7 @@ static const char sccsid[] = "@(#)thornbird.c 5.00 2000/11/01 xlockmore";
                                         "*cycles:  400   \n" \
                                         "*ncolors: 64    \n" \
                                         "*fpsSolid: true    \n" \
+                                       "*ignoreRotation: True \n" \
 
 # define BRIGHT_COLORS
 # define thornbird_handle_event 0
index 1a93de257dd59fa4aba3d9e6cb363dec9d45e973..79fe819ce77b4c27f27ea573669bd0d28c9ce3c5 100644 (file)
@@ -298,11 +298,11 @@ draw_triangle (ModeInfo * mi)
                                XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
                                if (!mono_p)
                                  {
-                                       free_colors(mi->dpy, mi->xgwa.colormap, mi->colors,
+                                       free_colors(mi->xgwa.screen, mi->xgwa.colormap, mi->colors,
                                                                mi->npixels);
                     mi->npixels = 
                       get_integer_resource (mi->dpy, "ncolors", "Integer");
-                                       make_smooth_colormap (mi->dpy,
+                                       make_smooth_colormap (mi->xgwa.screen,
                                                                                  mi->xgwa.visual, mi->xgwa.colormap,
                                                                                  mi->colors, &mi->npixels,
                                                                                  True, &mi->writable_p, True);
index 16836543b7b2e97a809610f7b7ea27cc7f77c745..dda5ac8cf5081bfaf6c7598d52275cd73f009862 100644 (file)
@@ -61,6 +61,9 @@ static const char *truchet_defaults [] = {
   "*anim-delay:               100",
   "*anim-step-size:           3",
   "*randomize:               true",
+#ifdef USE_IPHONE
+  "*ignoreRotation:           True",
+#endif
    0
 };
 
index 7a606b129399a1adc38d4248cee83836cd4acee8..dec8fbe14b8b5ca91f0fa51fddaedeebeff97203 100644 (file)
@@ -766,6 +766,9 @@ static const char *twang_defaults [] = {
     "*useSHM: True",
 #else
     "*useSHM: False",
+#endif
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
 #endif
     0
 };
index d1ef57198af245212cfc971fa17e2c4998507e67..c50785afda811afd6510ef267b9a2977ded15a6a 100644 (file)
@@ -209,9 +209,8 @@ static void
 randpal (struct state *st)
 {
   int ncolors = tailmax - 1;
-  make_random_colormap (st->dpy,
-                       st->xgwa.visual,
-                       st->mycmap, &st->mycolors[1], &ncolors, True, True, 0, True);
+  make_random_colormap (st->xgwa.screen, st->xgwa.visual, st->mycmap,
+                        &st->mycolors[1], &ncolors, True, True, 0, True);
   if (ncolors < tailmax - 1)
     {
       int c;
@@ -1206,6 +1205,9 @@ static const char *vermiculate_defaults[] = {
   "*fpsSolid:  true",
   "*speed: 0",
   "*instring: ",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
index 8fa8995ae043b9eec72b5473c8356b3c57b378c2..881b92cc0b479c10de751670b5e0a66cf5b3d895 100644 (file)
@@ -64,12 +64,13 @@ wander_init (Display *dpy, Window window)
     st->color_map = attributes.colormap;
     if (st->color_count)
     {
-        free_colors (st->dpy, st->color_map, st->colors, st->color_count);
+        free_colors (attributes.screen, st->color_map,
+                     st->colors, st->color_count);
         st->color_count = 0;
     }
     st->context = XCreateGC (st->dpy, st->window, 0, &values);
     st->color_count = MAXIMUM_COLOR_COUNT;
-    make_color_loop (st->dpy, st->color_map,
+    make_color_loop (attributes.screen, attributes.visual, st->color_map,
                     0,   1, 1,
                     120, 1, 1,
                     240, 1, 1,
@@ -240,6 +241,9 @@ static const char *wander_defaults [] =
     ".reset:      2500000",
     ".circles:    False",
     ".size:       1",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
     0
 };
 
index 566c4187fd87287080e7b0ad4b40d1846809cd05..843a1cfbbcf4f4e1a419183ac8cff2502a8ff16b 100644 (file)
@@ -489,6 +489,9 @@ static const char *whirlwindwarp_defaults [] = {
   "*points:    400",
   "*tails:     8",
   "*meters:    false",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
index e5eb9d554c251da78c72459142780bbd39af433c..5ae36ed0e2c6f7c1ef43a6758361086f53258bcb 100644 (file)
@@ -389,7 +389,9 @@ whirlygig_init (Display *dpy, Window window)
 
     {
       Bool writable_p = False;
-    make_uniform_colormap (st->dpy, st->xgwa.visual, st->xgwa.colormap, st->colors, &st->ncolors, True, &writable_p, True);
+    make_uniform_colormap (st->xgwa.screen, st->xgwa.visual,
+                           st->xgwa.colormap, st->colors, &st->ncolors,
+                           True, &writable_p, True);
     }
 
     if (st->ba) XFillRectangle (st->dpy, st->ba, st->bgc, 0, 0, st->xgwa.width, st->xgwa.height);
index 86a6dcd54a7c6de513a7fc2cbf531ae45b64c46e..4529d5d68b1f37eb0a61714af48287a5b7b845a8 100644 (file)
@@ -708,6 +708,9 @@ static const char *wormhole_defaults [] = {
   "*delay:     10000",
   "*zspeed:    10",
   "*stars:     20",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
index 2785fb816a49964161c9cdee4b4ae719d3307bc9..0a3739b567b51af172a91b1e657d98c36b2045ae 100644 (file)
@@ -125,6 +125,10 @@ MakeImage(struct state *st)
 {
   XGCValues gcv;
 
+  /* #### This probably leaks SHM every time the window is resized. */
+  if (st->xim)
+    XDestroyImage (st->xim);
+
 #ifdef HAVE_XSHM_EXTENSION
   st->shared = True;
   st->xim = create_xshm_image (st->dpy, st->visual, st->depth, ZPixmap, NULL,
@@ -147,8 +151,8 @@ MakeImage(struct state *st)
         }
     }
 
-  st->gc = XCreateGC(st->dpy,st->window,0,&gcv);
-  if (!st->gc) exit (1);
+  if (! st->gc)
+    st->gc = XCreateGC(st->dpy,st->window,0,&gcv);
 }
 
 
@@ -215,6 +219,8 @@ InitFlame(struct state *st)
 {
   st->fwidth  = st->width / 2;
   st->fheight = st->height / 2;
+
+  if (st->flame) free (st->flame);
   st->flame   = (unsigned char *) malloc((st->fwidth + 2) * (st->fheight + 2)
                                      * sizeof(unsigned char));
 
@@ -621,7 +627,7 @@ loadBitmap(struct state *st, int *w, int *h)
       unsigned char *result, *o;
       char *bits = (char *) malloc (sizeof(bob_bits));
       int x, y;
-      int scale = ((st->width > bob_width * 11) ? 2 : 1);
+      int scale = ((st->width > bob_width * 10) ? 2 : 1);
  
       memcpy (bits, bob_bits, sizeof(bob_bits));
       ximage = XCreateImage (st->dpy, st->visual, 1, XYBitmap, 0, bits,
@@ -721,12 +727,6 @@ xflame_init (Display *dpy, Window win)
   InitColors(st);
   st->theim = loadBitmap(st, &st->theimx, &st->theimy);
 
-  /* utils/xshm.c doesn't provide a way to free the shared-memory image, which
-     makes it hard for us to react to window resizing.  So, punt for now.  The
-     size of the window at startup is the size it will stay.
-  */
-  GetXInfo(st);
-
   MakeImage(st);
   InitFlame(st);
   FlameFill(st,0);
@@ -755,6 +755,12 @@ static void
 xflame_reshape (Display *dpy, Window window, void *closure, 
                  unsigned int w, unsigned int h)
 {
+  struct state *st = (struct state *) closure;
+  GetXInfo(st);
+  MakeImage(st);
+  InitFlame(st);
+  FlameFill(st,0);
+  XClearWindow (dpy, window);
 }
 
 static Bool
index 1765243cba111240466aa8045a2f238c39a49c66..da913c724fada1f2e238610feb61b911d21c13e2 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1997-2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1997-2013 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
@@ -126,13 +126,13 @@ xjack_init (Display *dpy, Window window)
 
   xjack_reshape (dpy, window, st, st->xgwa.width, st->xgwa.height);
 
-  if (st->columns >= 21)
-    {
-      st->left = 0xFF & (random() % ((st->columns / 2)+1));
-      st->right = st->left + (0xFF & (random() % (st->columns - st->left - 10)
-                                      + 10));
-    }
-  st->x = 0;
+  st->left = 0xFF & (random() % ((st->columns / 2)+1));
+  st->right = st->left + (0xFF & (random() % (st->columns - st->left)
+                                  + 10));
+  if (st->right < st->left + 10) st->right = st->left + 10;
+  if (st->right > st->columns)   st->right = st->columns;
+
+  st->x = st->left;
   st->y = 0;
 
   if (st->xgwa.width > 200 && st->xgwa.height > 200)
@@ -250,6 +250,8 @@ xjack_draw (Display *dpy, Window window, void *closure)
       if (st->break_para)
         st->y++;
 
+      st->break_para = 0;
+
       if (st->mode == 1 || st->mode == 2)
         {
           /* 1 = left margin goes southwest; 2 = southeast */
@@ -282,14 +284,20 @@ xjack_draw (Display *dpy, Window window, void *closure)
 
       if (st->y >= st->rows-1) /* bottom of page */
         {
+# if 0    /* Nah, this looks bad. */
+
           /* scroll by 1-5 lines */
           st->scrolling = (random() % 5 ? 0 : (0xFF & (random() % 5))) + 1;
+
           if (st->break_para)
             st->scrolling++;
 
           /* but sometimes scroll by a whole page */
           if (0 == (random() % 100))
             st->scrolling += st->rows;
+# else
+          st->scrolling = 1;
+# endif
 
           return xjack_scroll (st);
         }
@@ -349,7 +357,7 @@ xjack_draw (Display *dpy, Window window, void *closure)
         }
 
       if ((tolower(c) != tolower(*st->s))
-          ? (0 == (random() % 10))             /* backup to correct */
+          ? (0 == (random() % 10))     /* backup to correct */
           : (0 == (random() % 400)))   /* fail to advance */
         {
           st->x--;
@@ -420,6 +428,13 @@ xjack_draw (Display *dpy, Window window, void *closure)
               if (st->right > st->columns)
                 st->left -= (st->right - st->columns);
             }
+
+          if (st->right - st->left < 5)
+            st->left = st->right - 5;
+          if (st->left < 0)
+            st->left = 0;
+          if (st->right - st->left < 5)
+            st->right = st->left + 5;
         }
       st->s = source;
     }
index 0c0b2c921b007679fc003cb1711869c9b279f8d1..23c12b6dc33fb1d75f412609fe6a77dac461a6a3 100644 (file)
@@ -1,5 +1,5 @@
 /* xlockmore.c --- xscreensaver compatibility layer for xlockmore modules.
- * xscreensaver, Copyright (c) 1997-2011 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1997-2013 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
@@ -382,18 +382,21 @@ xlockmore_init (Display *dpy, Window window,
       switch (mi->xlmft->desired_color_scheme)
         {
         case color_scheme_uniform:
-          make_uniform_colormap (dpy, mi->xgwa.visual, mi->xgwa.colormap,
+          make_uniform_colormap (mi->xgwa.screen, mi->xgwa.visual,
+                                 mi->xgwa.colormap,
                                  mi->colors, &mi->npixels,
                                  True, &mi->writable_p, True);
           break;
         case color_scheme_smooth:
-          make_smooth_colormap (dpy, mi->xgwa.visual, mi->xgwa.colormap,
+          make_smooth_colormap (mi->xgwa.screen, mi->xgwa.visual,
+                                mi->xgwa.colormap,
                                 mi->colors, &mi->npixels,
                                 True, &mi->writable_p, True);
           break;
         case color_scheme_bright:
         case color_scheme_default:
-          make_random_colormap (dpy, mi->xgwa.visual, mi->xgwa.colormap,
+          make_random_colormap (mi->xgwa.screen, mi->xgwa.visual,
+                                mi->xgwa.colormap,
                                 mi->colors, &mi->npixels,
                                 (mi->xlmft->desired_color_scheme ==
                                  color_scheme_bright),
index 02587f00b37d12dd7d1ccac1f1b360e17b16f69d..f12b354775e4ac75ad2dc8f45ca68d8672eef57b 100644 (file)
@@ -78,6 +78,9 @@ static const char *xlyap_defaults [] = {
   "*delay:              10000",
   "*linger:             5",
   "*colors:             200",
+#ifdef USE_IPHONE
+  "*ignoreRotation:     True",
+#endif
   0
 };
 
@@ -178,8 +181,8 @@ typedef double (*PFD)(double,double);
 /*#define BACKING_PIXMAP*/
 
 struct state {
-  int screen;
   Display *dpy;
+  Screen *screen;
   Visual *visual;
   Colormap cmap;
 
@@ -552,15 +555,15 @@ init_color(struct state *st)
 {
   int i;
   if (st->ncolors)
-    free_colors (st->dpy, st->cmap, st->colors, st->ncolors);
+    free_colors (st->screen, st->cmap, st->colors, st->ncolors);
   st->ncolors = st->maxcolor;
-  make_smooth_colormap(st->dpy, st->visual, st->cmap,
+  make_smooth_colormap(st->screen, st->visual, st->cmap,
                        st->colors, &st->ncolors, True, NULL, True);
 
   for (i = 0; i < st->maxcolor; i++) {
     if (! st->Data_GC[i]) {
       XGCValues gcv;
-      gcv.background = BlackPixel(st->dpy, st->screen);
+      gcv.background = BlackPixelOfScreen(st->screen);
       st->Data_GC[i] = XCreateGC(st->dpy, st->canvas, GCBackground, &gcv);
     }
     XSetForeground(st->dpy, st->Data_GC[i],
@@ -1782,6 +1785,7 @@ xlyap_init (Display *d, Window window)
   st->width = xgwa.width;
   st->height = xgwa.height;
   st->visual = xgwa.visual;
+  st->screen = xgwa.screen;
   st->cmap = xgwa.colormap;
 
   do_defaults(st);
@@ -1799,14 +1803,13 @@ xlyap_init (Display *d, Window window)
   if (builtin >= 0)
     do_preset (st, builtin);
 
-  st->screen = DefaultScreen(st->dpy);
-  st->background = BlackPixel(st->dpy, st->screen);
+  st->background = BlackPixelOfScreen(st->screen);
   setupmem(st);
   init_data(st);
   if (!mono_p)
     st->foreground = st->startcolor;
   else
-    st->foreground = WhitePixel(st->dpy, st->screen);
+    st->foreground = WhitePixelOfScreen(st->screen);
 
   /*
    * Create the window to display the Lyapunov exponents
index 2e2ba16201b6994a36429394452b6f6a4a3cab1d..c0090711fa52d579ce0bacc16fc6c08c20349941 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/perl -w
-# Copyright Â© 2002, 2005 Jamie Zawinski <jwz@jwz.org>
+# Copyright Â© 2002-2013 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
@@ -24,7 +24,7 @@ use strict;
 use Text::Wrap;
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.3 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.4 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 
 my $verbose = 0;
 
@@ -60,7 +60,7 @@ my $man_suffix = (".SH ENVIRONMENT\n" .
                   ".BR X (1),\n" .
                   ".BR xscreensaver (1)\n" .
                   ".SH COPYRIGHT\n" .
-                  "Copyright \\(co 2002 by %AUTHOR%.  " .
+                  "Copyright \\(co %YEAR% by %AUTHOR%.  " .
                   "Permission to use, copy, modify, \n" .
                   "distribute, and sell this software and its " .
                   "documentation for any purpose is \n" .
@@ -118,6 +118,7 @@ sub xml2man($) {
                          
     my $carg = $arg;
     my $boolp = m/^<boolean/;
+    my $novalsp = 0;
 
     if ($arg && $arg =~ m/^-no(-.*)/) {
       $arg = "$1 | \\$arg";
@@ -146,8 +147,12 @@ sub xml2man($) {
       $label = "Render in wireframe instead of solid.";
     } elsif ($carg =~ m/^-delay/ && $hi && $hi >= 10000) {
       $label = "Per-frame delay, in microseconds.";
-      $def = sprintf ("%d (%0.2f seconds.)", $def, ($def/1000000.0));
+      $def = sprintf ("%d (%0.2f seconds)", $def, ($def/1000000.0));
       $low = $hi = undef;
+    } elsif ($carg eq '-speed \fInumber\fP') {
+      $label = "Animation speed.  2.0 means twice as fast, " .
+               "0.5 means half as fast.";
+      $novalsp = 1;
     } elsif ($boolp) {
       $label .= ".  Boolean.";
     } elsif ($label) {
@@ -164,8 +169,10 @@ sub xml2man($) {
 
       $args .= "[\\$carg]\n";
 
-      $label .= "  $low - $hi." if (defined($low) && defined($hi));
-      $label .= "  Default: $def." if (defined ($def));
+      if (! $novalsp) {
+        $label .= "  $low - $hi." if (defined($low) && defined($hi));
+        $label .= "  Default: $def." if (defined ($def));
+      }
       $label = wrap ("", "", $label);
 
       $body .= ".TP 8\n.B \\$arg\n$label";
@@ -192,6 +199,8 @@ sub xml2man($) {
     $author = "UNKNOWN";
   }
 
+  $desc =~ s@http://en\.wikipedia\.org/[^\s]+@@gs;
+
   $desc = wrap ("", "", $desc);
 
   $body = (".TH XScreenSaver 1 \"\" \"X Version 11\"\n" .
@@ -208,7 +217,11 @@ sub xml2man($) {
            $body .
            $man_suffix);
 
+  my $year = $1 if ($author =~ s/; (\d{4})$//s);
+  $year = (localtime)[5] + 1900 unless $year;
+
   $body =~ s/%AUTHOR%/$author/g;
+  $body =~ s/%YEAR%/$year/g;
 
 #print $body; exit 0;
 
index f3b8184800ee07973e504d548b565e148eb867d0..d36055de7608386a99912173d7309626dc4fb647 100644 (file)
@@ -63,6 +63,9 @@ static const char *xrayswarm_defaults [] ={
        ".background:           black",
        "*delay:                20000",
        "*fpsSolid:             true",
+#ifdef USE_IPHONE
+        "*ignoreRotation:       True",
+#endif
        0
 };
 
index 17ef55343f339c457d66ee7a1fe341dcdb73bd80..3c241fc36fdc7ee36051931a3bcf4b3f379b3017 100644 (file)
@@ -315,6 +315,9 @@ static const char *xspirograph_defaults [] = {
   "*subdelay:          20000",
   "*layers:            2",
   "*alwaysfinish:      false",
+#ifdef USE_IPHONE
+  "*ignoreRotation:     True",
+#endif
   0
 };
 
index 73b27b05f3e417f25f1eca51fbd34c7c1a85fbb4..439b8a1f04d62f59f6a7f949a31995bed3adbb21 100644 (file)
@@ -249,6 +249,9 @@ static const char *zoom_defaults[] = {
   "*pixspacey:   2",
   "*lensoffsetx: 5",
   "*lensoffsety: 5",
+#ifdef USE_IPHONE
+  "*ignoreRotation: True",
+#endif
   0
 };
 
index 11f9de0a6fa2a9c06bcaa5316961a899ade1bffc..c43c5e57099270ec075a390ec30c430bf071c2a8 100644 (file)
@@ -1,4 +1,4 @@
-# Auto-generated: Mon Feb  4 22:38:23 PST 2013
+# Auto-generated: Tue Jul 16 02:23:37 PDT 2013
 driver/demo-Gtk-conf.c
 driver/demo-Gtk-support.c
 driver/demo-Gtk-widgets.c
@@ -101,6 +101,7 @@ hacks/config/greynetic.xml
 hacks/config/halftone.xml
 hacks/config/halo.xml
 hacks/config/helix.xml
+hacks/config/hexadrop.xml
 hacks/config/hilbert.xml
 hacks/config/hopalong.xml
 hacks/config/hyperball.xml
@@ -118,6 +119,7 @@ hacks/config/juggle.xml
 hacks/config/juggler3d.xml
 hacks/config/julia.xml
 hacks/config/kaleidescope.xml
+hacks/config/kaleidocycle.xml
 hacks/config/klein.xml
 hacks/config/kumppa.xml
 hacks/config/lament.xml
@@ -167,6 +169,7 @@ hacks/config/providence.xml
 hacks/config/pulsar.xml
 hacks/config/pyro.xml
 hacks/config/qix.xml
+hacks/config/quasicrystal.xml
 hacks/config/queens.xml
 hacks/config/rd-bomb.xml
 hacks/config/rdbomb.xml
@@ -210,6 +213,7 @@ hacks/config/triangle.xml
 hacks/config/tronbit.xml
 hacks/config/truchet.xml
 hacks/config/twang.xml
+hacks/config/unknownpleasures.xml
 hacks/config/vermiculate.xml
 hacks/config/vidwhacker.xml
 hacks/config/vines.xml
index 462a850a042aeeebaf8b3f0cb76b86fa3e743dd1..d858b2affaecda1890e8157c86ca12a1bc370143 100644 (file)
--- a/setup.com
+++ b/setup.com
@@ -50,6 +50,7 @@ $ greynetic   :== $'mydir'greynetic
 $ halftone     :== $'mydir'halftone
 $ halo         :== $'mydir'halo
 $ helix                :== $'mydir'helix
+$ hexadrop     :== $'mydir'hexadrop
 $ hopalong     :== $'mydir'hopalong
 $ ifs          :== $'mydir'ifs
 $ imsmap       :== $'mydir'imsmap
index e06359c72db811738959df9bc1f733e359485a4d..e6abd4861bdcd85e1a422fbc9745c6c0f58a106c 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1997, 2002 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1997-2013 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
@@ -22,8 +22,9 @@
 extern char *progname;
 
 void
-free_colors(Display *dpy, Colormap cmap, XColor *colors, int ncolors)
+free_colors (Screen *screen, Colormap cmap, XColor *colors, int ncolors)
 {
+  Display *dpy = screen ? DisplayOfScreen (screen) : 0;
   int i;
   if (ncolors > 0)
     {
@@ -38,9 +39,10 @@ free_colors(Display *dpy, Colormap cmap, XColor *colors, int ncolors)
 
 
 void
-allocate_writable_colors (Display *dpy, Colormap cmap,
+allocate_writable_colors (Screen *screen, Colormap cmap,
                          unsigned long *pixels, int *ncolorsP)
 {
+  Display *dpy = screen ? DisplayOfScreen (screen) : 0;
   int desired = *ncolorsP;
   int got = 0;
   int requested = desired;
@@ -94,25 +96,31 @@ complain (int wanted_colors, int got_colors,
 
 
 void
-make_color_ramp (Display *dpy, Colormap cmap,
+make_color_ramp (Screen *screen, Visual *visual, Colormap cmap,
                 int h1, double s1, double v1,   /* 0-360, 0-1.0, 0-1.0 */
                 int h2, double s2, double v2,   /* 0-360, 0-1.0, 0-1.0 */
                 XColor *colors, int *ncolorsP,
                 Bool closed_p,
                 Bool allocate_p,
-                Bool writable_p)
+                Bool *writable_pP)
 {
+  Display *dpy = screen ? DisplayOfScreen (screen) : 0;
   Bool verbose_p = True;  /* argh. */
   int i;
   int total_ncolors = *ncolorsP;
   int ncolors, wanted;
-  Bool wanted_writable = (allocate_p && writable_p);
+  Bool wanted_writable = (allocate_p && writable_pP && *writable_pP);
   double dh, ds, dv;           /* deltas */
 
   wanted = total_ncolors;
   if (closed_p)
     wanted = (wanted / 2) + 1;
 
+  /* If this visual doesn't support writable cells, don't bother trying.
+   */
+  if (wanted_writable && !has_writable_cells(screen, visual))
+    *writable_pP = False;
+
  AGAIN:
   ncolors = total_ncolors;
 
@@ -144,7 +152,7 @@ make_color_ramp (Display *dpy, Colormap cmap,
   if (!allocate_p)
     return;
 
-  if (writable_p)
+  if (writable_pP && *writable_pP)
     {
       unsigned long *pixels = (unsigned long *)
        malloc(sizeof(*pixels) * ((*ncolorsP) + 1));
@@ -175,7 +183,7 @@ make_color_ramp (Display *dpy, Colormap cmap,
            }
          else
            {
-             free_colors (dpy, cmap, colors, i);
+             free_colors (screen, cmap, colors, i);
              goto FAIL;
            }
        }
@@ -204,7 +212,8 @@ make_color_ramp (Display *dpy, Colormap cmap,
   if (verbose_p &&
       /* don't warn if we got 0 writable colors -- probably TrueColor. */
       (ncolors != 0 || !wanted_writable))
-    complain (wanted, ncolors, wanted_writable, wanted_writable && writable_p);
+    complain (wanted, ncolors, wanted_writable, 
+              (wanted_writable && writable_pP && *writable_pP));
 }
 
 
@@ -212,12 +221,13 @@ make_color_ramp (Display *dpy, Colormap cmap,
 
 
 static void
-make_color_path (Display *dpy, Colormap cmap,
+make_color_path (Screen *screen, Visual *visual, Colormap cmap,
                 int npoints, int *h, double *s, double *v,
                 XColor *colors, int *ncolorsP,
                 Bool allocate_p,
-                Bool writable_p)
+                Bool *writable_pP)
 {
+  Display *dpy = screen ? DisplayOfScreen (screen) : 0;
   int i, j, k;
   int total_ncolors = *ncolorsP;
 
@@ -233,11 +243,11 @@ make_color_path (Display *dpy, Colormap cmap,
     }
   else if (npoints == 2)       /* using make_color_ramp() will be faster */
     {
-      make_color_ramp (dpy, cmap,
+      make_color_ramp (screen, visual, cmap,
                       h[0], s[0], v[0], h[1], s[1], v[1],
                       colors, ncolorsP,
                       True,  /* closed_p */
-                      allocate_p, writable_p);
+                      allocate_p, writable_pP);
       return;
     }
   else if (npoints >= MAXPOINTS)
@@ -381,7 +391,7 @@ make_color_path (Display *dpy, Colormap cmap,
   if (!allocate_p)
     return;
 
-  if (writable_p)
+  if (writable_pP && *writable_pP)
     {
       unsigned long *pixels = (unsigned long *)
        malloc(sizeof(*pixels) * ((*ncolorsP) + 1));
@@ -412,7 +422,7 @@ make_color_path (Display *dpy, Colormap cmap,
            }
          else
            {
-             free_colors (dpy, cmap, colors, i);
+             free_colors (screen, cmap, colors, i);
              goto FAIL;
            }
        }
@@ -438,28 +448,36 @@ make_color_path (Display *dpy, Colormap cmap,
 
 
 void
-make_color_loop (Display *dpy, Colormap cmap,
+make_color_loop (Screen *screen, Visual *visual, Colormap cmap,
                 int h0, double s0, double v0,   /* 0-360, 0-1.0, 0-1.0 */
                 int h1, double s1, double v1,   /* 0-360, 0-1.0, 0-1.0 */
                 int h2, double s2, double v2,   /* 0-360, 0-1.0, 0-1.0 */
                 XColor *colors, int *ncolorsP,
                 Bool allocate_p,
-                Bool writable_p)
+                Bool *writable_pP)
 {
+  Bool wanted_writable = (allocate_p && writable_pP && *writable_pP);
+
   int h[3];
   double s[3], v[3];
   h[0] = h0; h[1] = h1; h[2] = h2;
   s[0] = s0; s[1] = s1; s[2] = s2;
   v[0] = v0; v[1] = v1; v[2] = v2;
-  make_color_path(dpy, cmap,
-                 3, h, s, v,
-                 colors, ncolorsP,
-                 allocate_p, writable_p);
+
+  /* If this visual doesn't support writable cells, don't bother trying.
+   */
+  if (wanted_writable && !has_writable_cells(screen, visual))
+    *writable_pP = False;
+
+  make_color_path (screen, visual, cmap,
+                   3, h, s, v,
+                   colors, ncolorsP,
+                   allocate_p, writable_pP);
 }
 
 
 void
-make_smooth_colormap (Display *dpy, Visual *visual, Colormap cmap,
+make_smooth_colormap (Screen *screen, Visual *visual, Colormap cmap,
                      XColor *colors, int *ncolorsP,
                      Bool allocate_p,
                      Bool *writable_pP,
@@ -474,7 +492,6 @@ make_smooth_colormap (Display *dpy, Visual *visual, Colormap cmap,
   double v[MAXPOINTS];
   double total_s = 0;
   double total_v = 0;
-  Screen *screen = (dpy ? DefaultScreenOfDisplay(dpy) : 0); /* #### WRONG! */
   int loop = 0;
 
   if (*ncolorsP <= 0) return;
@@ -532,8 +549,8 @@ make_smooth_colormap (Display *dpy, Visual *visual, Colormap cmap,
     *writable_pP = False;
 
  RETRY_NON_WRITABLE:
-  make_color_path (dpy, cmap, npoints, h, s, v, colors, &ncolors,
-                  allocate_p, (writable_pP && *writable_pP));
+  make_color_path (screen, visual, cmap, npoints, h, s, v, colors, &ncolors,
+                  allocate_p, writable_pP);
 
   /* If we tried for writable cells and got none, try for non-writable. */
   if (allocate_p && *ncolorsP == 0 && writable_pP && *writable_pP)
@@ -551,7 +568,7 @@ make_smooth_colormap (Display *dpy, Visual *visual, Colormap cmap,
 
 
 void
-make_uniform_colormap (Display *dpy, Visual *visual, Colormap cmap,
+make_uniform_colormap (Screen *screen, Visual *visual, Colormap cmap,
                       XColor *colors, int *ncolorsP,
                       Bool allocate_p,
                       Bool *writable_pP,
@@ -559,7 +576,6 @@ make_uniform_colormap (Display *dpy, Visual *visual, Colormap cmap,
 {
   int ncolors = *ncolorsP;
   Bool wanted_writable = (allocate_p && writable_pP && *writable_pP);
-  Screen *screen = (dpy ? DefaultScreenOfDisplay(dpy) : 0); /* #### WRONG! */
 
   double S = ((double) (random() % 34) + 66) / 100.0;  /* range 66%-100% */
   double V = ((double) (random() % 34) + 66) / 100.0;  /* range 66%-100% */
@@ -571,12 +587,11 @@ make_uniform_colormap (Display *dpy, Visual *visual, Colormap cmap,
     *writable_pP = False;
 
  RETRY_NON_WRITABLE:
-  make_color_ramp(dpy, cmap,
+  make_color_ramp(screen, visual, cmap,
                  0,   S, V,
                  359, S, V,
                  colors, &ncolors,
-                 False, allocate_p,
-                  (writable_pP && *writable_pP));
+                 False, allocate_p, writable_pP);
 
   /* If we tried for writable cells and got none, try for non-writable. */
   if (allocate_p && *ncolorsP == 0 && writable_pP && *writable_pP)
@@ -595,17 +610,17 @@ make_uniform_colormap (Display *dpy, Visual *visual, Colormap cmap,
 
 
 void
-make_random_colormap (Display *dpy, Visual *visual, Colormap cmap,
+make_random_colormap (Screen *screen, Visual *visual, Colormap cmap,
                      XColor *colors, int *ncolorsP,
                      Bool bright_p,
                      Bool allocate_p,
                      Bool *writable_pP,
                      Bool verbose_p)
 {
+  Display *dpy = screen ? DisplayOfScreen (screen) : 0;
   Bool wanted_writable = (allocate_p && writable_pP && *writable_pP);
   int ncolors = *ncolorsP;
   int i;
-  Screen *screen = (dpy ? DefaultScreenOfDisplay(dpy) : 0); /* #### WRONG! */
 
   if (*ncolorsP <= 0) return;
 
@@ -613,6 +628,7 @@ make_random_colormap (Display *dpy, Visual *visual, Colormap cmap,
   if (wanted_writable && !has_writable_cells(screen, visual))
     *writable_pP = False;
 
+ RETRY_ALL:
   for (i = 0; i < ncolors; i++)
     {
       colors[i].flags = DoRed|DoGreen|DoBlue;
@@ -632,6 +648,19 @@ make_random_colormap (Display *dpy, Visual *visual, Colormap cmap,
        }
     }
 
+  /* If there are a small number of colors, make sure at least the first
+     two contrast well.
+  */
+  if (!bright_p && ncolors <= 4)
+    {
+      int h0, h1;
+      double s0, s1, v0, v1;
+      rgb_to_hsv (colors[0].red, colors[0].green, colors[0].blue, &h0,&s0,&v0);
+      rgb_to_hsv (colors[1].red, colors[1].green, colors[1].blue, &h1,&s1,&v1);
+      if (fabs (v1-v0) < 0.5)
+        goto RETRY_ALL;
+    }
+
   if (!allocate_p)
     return;
 
@@ -641,7 +670,7 @@ make_random_colormap (Display *dpy, Visual *visual, Colormap cmap,
       unsigned long *pixels = (unsigned long *)
        malloc(sizeof(*pixels) * (ncolors + 1));
 
-      allocate_writable_colors (dpy, cmap, pixels, &ncolors);
+      allocate_writable_colors (screen, cmap, pixels, &ncolors);
       if (ncolors > 0)
        for (i = 0; i < ncolors; i++)
          colors[i].pixel = pixels[i];
@@ -679,12 +708,14 @@ make_random_colormap (Display *dpy, Visual *visual, Colormap cmap,
 
 
 void
-rotate_colors (Display *dpy, Colormap cmap,
+rotate_colors (Screen *screen, Colormap cmap,
               XColor *colors, int ncolors, int distance)
 {
+  Display *dpy = screen ? DisplayOfScreen (screen) : 0;
   int i;
-  XColor *colors2 = (XColor *) malloc(sizeof(*colors2) * ncolors);
+  XColor *colors2;
   if (ncolors < 2) return;
+  colors2 = (XColor *) malloc(sizeof(*colors2) * ncolors);
   distance = distance % ncolors;
   for (i = 0; i < ncolors; i++)
     {
index 61421cf5c37f26b60071a423470e9aa5eb5ee47c..526a38a09b16061de07c19ea80a00997279f163e 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992, 1997 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2013 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
@@ -14,7 +14,7 @@
 
 /* Like XFreeColors, but works on `XColor *' instead of `unsigned long *'
  */
-extern void free_colors (Display *, Colormap, XColor *, int ncolors);
+extern void free_colors (Screen *, Colormap, XColor *, int ncolors);
 
 
 /* Allocates writable, non-contiguous color cells.  The number requested is
@@ -22,7 +22,7 @@ extern void free_colors (Display *, Colormap, XColor *, int ncolors);
    (Unlike XAllocColorCells(), this will allocate as many as it can, instead
    of failing if they can't all be allocated.)
  */
-extern void allocate_writable_colors (Display *dpy, Colormap cmap,
+extern void allocate_writable_colors (Screen *, Colormap,
                                      unsigned long *pixels, int *ncolorsP);
 
 
@@ -38,14 +38,16 @@ extern void allocate_writable_colors (Display *dpy, Colormap cmap,
 
    If writable_p is true, writable color cells will be allocated;
    otherwise, read-only cells will be allocated.
+
+   If allocate_p is false, screen and cmap are unused (OpenGL usage).
  */
-extern void make_color_ramp (Display *dpy, Colormap cmap,
+extern void make_color_ramp (Screen *, Visual *, Colormap,
                             int h1, double s1, double v1,
                             int h2, double s2, double v2,
                             XColor *colors, int *ncolorsP,
                             Bool closed_p,
                             Bool allocate_p,
-                            Bool writable_p);
+                            Bool *writable_pP);
 
 /* Generates a sequence of colors evenly spaced around the triangle
    indicated by the thee HSV coordinates.
@@ -56,14 +58,16 @@ extern void make_color_ramp (Display *dpy, Colormap cmap,
 
    If writable_p is true, writable color cells will be allocated;
    otherwise, read-only cells will be allocated.
+
+   If allocate_p is false, screen, visual and cmap are unused (OpenGL usage).
  */
-extern void make_color_loop (Display *, Colormap,
+extern void make_color_loop (Screen *, Visual *, Colormap,
                             int h1, double s1, double v1,
                             int h2, double s2, double v2,
                             int h3, double s3, double v3,
                             XColor *colors, int *ncolorsP,
                             Bool allocate_p,
-                            Bool writable_p);
+                            Bool *writable_pP);
 
 
 /* Allocates a hopefully-interesting colormap, which will be a closed loop
@@ -78,9 +82,10 @@ extern void make_color_loop (Display *, Colormap,
    otherwise, read-only cells will be allocated.  If no writable cells
    cannot be allocated, we will try to allocate unwritable cells
    instead, and print a message on stderr to that effect (if verbose_p).
+
+   If allocate_p is false, screen, visual and cmap are unused (OpenGL usage).
  */
-extern void make_smooth_colormap (Display *dpy, Visual *visual,
-                                 Colormap cmap,
+extern void make_smooth_colormap (Screen *, Visual *, Colormap,
                                  XColor *colors, int *ncolorsP,
                                  Bool allocate_p,
                                  Bool *writable_pP,
@@ -99,9 +104,10 @@ extern void make_smooth_colormap (Display *dpy, Visual *visual,
    otherwise, read-only cells will be allocated.  If no writable cells
    cannot be allocated, we will try to allocate unwritable cells
    instead, and print a message on stderr to that effect (if verbose_p).
+
+   If allocate_p is false, screen, visual and cmap are unused (OpenGL usage).
  */
-extern void make_uniform_colormap (Display *dpy, Visual *visual,
-                                  Colormap cmap,
+extern void make_uniform_colormap (Screen *, Visual *, Colormap,
                                   XColor *colors, int *ncolorsP,
                                   Bool allocate_p,
                                   Bool *writable_pP,
@@ -120,9 +126,10 @@ extern void make_uniform_colormap (Display *dpy, Visual *visual,
    otherwise, read-only cells will be allocated.  If no writable cells
    cannot be allocated, we will try to allocate unwritable cells
    instead, and print a message on stderr to that effect (if verbose_p).
+
+   If allocate_p is false, screen, visual and cmap are unused (OpenGL usage).
  */
-extern void make_random_colormap (Display *dpy, Visual *visual,
-                                 Colormap cmap,
+extern void make_random_colormap (Screen *, Visual *, Colormap,
                                  XColor *colors, int *ncolorsP,
                                  Bool bright_p,
                                  Bool allocate_p,
@@ -134,7 +141,7 @@ extern void make_random_colormap (Display *dpy, Visual *visual,
    of writable color cells, this rotates the contents of the array by
    `distance' steps, moving the colors of cell N to cell (N - distance).
  */
-extern void rotate_colors (Display *, Colormap,
+extern void rotate_colors (Screen *, Colormap,
                           XColor *, int ncolors, int distance);
 
 #endif /* __COLORS_H__ */
index 58d506efd888ac9a3b7c7a06fdbd91aacad72ab5..082f1f167a7e5a62dafda935e156b4a9da99e510 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992-2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2013 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
@@ -619,6 +619,19 @@ pipe_cb (XtPointer closure, int *source, XtInputId *id)
     geom.height = h;
   }
 
+  /* Take the extension off of the file name. */
+  /* Duplicated in driver/xscreensaver-getimage.c. */
+  if (buf && *buf)
+    {
+      char *slash = strrchr (buf, '/');
+      char *dot = strrchr ((slash ? slash : buf), '.');
+      if (dot) *dot = 0;
+      /* Replace slashes with newlines */
+      /* while (dot = strchr(buf, '/')) *dot = '\n'; */
+      /* Replace slashes with spaces */
+      while ((dot = strchr(buf, '/'))) *dot = ' ';
+    }
+
   if (absfile) free (absfile);
   clo2->callback (clo2->screen, clo2->xwindow, clo2->drawable, buf, &geom,
                   clo2->closure);
@@ -810,6 +823,7 @@ load_random_image_1 (Screen *screen, Window window, Drawable drawable,
     /* If we got here, we loaded synchronously even though they wanted async.
      */
     callback (screen, window, drawable, name_ret_2, &geom_ret_2, closure);
+    if (name_ret_2) free (name_ret_2);
   }
 }
 
index 00a96de4c91ef70a45be0ff207ec2194412db8fc..23f40aad9b98122db39454075c5eafffd79c4106 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992-2006 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2013 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
@@ -477,7 +477,7 @@ copy_default_colormap_contents (Screen *screen,
   XQueryColors (dpy, from_cmap, old_colors, max_cells);
 
   got_cells = max_cells;
-  allocate_writable_colors (dpy, to_cmap, pixels, &got_cells);
+  allocate_writable_colors (screen, to_cmap, pixels, &got_cells);
 
   if (grab_verbose_p && got_cells != max_cells)
     fprintf(stderr, "%s: got only %d of %d cells\n", progname,
index 247eca89efc723ac05c7455e855ffaab1a91c317..8fe3eac64a28a8c1efbe89e7bb23f2e3384f2eb9 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2001-2006 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2001-2013 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
@@ -190,17 +190,23 @@ minixpm_to_ximage (Display *dpy, Visual *visual, Colormap colormap, int depth,
   ximage = XCreateImage (dpy, visual, depth,
                          (depth == 1 ? XYBitmap : ZPixmap),
                          0, 0, w, h, 8, 0);
-  if (! ximage) return 0;
+  if (! ximage)
+    {
+      if (pixels) free (pixels);
+      return 0;
+    }
 
   ximage->bitmap_bit_order =
     ximage->byte_order =
     (bigendian() ? MSBFirst : LSBFirst);
 
   ximage->data = (char *) calloc (ximage->height, ximage->bytes_per_line);
-  if (!ximage->data) {
-    XDestroyImage (ximage);
-    return 0;
-  }
+  if (!ximage->data)
+    {
+      XDestroyImage (ximage);
+      if (pixels) free (pixels);
+      return 0;
+    }
 
   w8 = (w + 7) / 8;
   if (mask_ret)
index d2d447771ae6a98469b18b6a3af6161f83a4ec81..1a73ea61b3edb0df1b526758a9e22123d9b1dc7f 100644 (file)
@@ -66,7 +66,7 @@ make_spline (unsigned int size)
 static void
 grow_spline_points (spline *s)
 {
-  s->allocated_points *= 2;
+  s->allocated_points = 10 + (s->allocated_points * 1.3);
   s->points =
     (XPoint*)realloc (s->points, s->allocated_points * sizeof (XPoint));
   if (!s->points) abort();
index d902a784a3b4c4bce5696a9c9d866363d4bea766..e1c7e1cd1eec8369238af60d1493bf6553efc647 100644 (file)
@@ -1,2 +1,2 @@
 static const char screensaver_id[] =
-       "@(#)xscreensaver 5.21 (04-Feb-2013), by Jamie Zawinski (jwz@jwz.org)";
+       "@(#)xscreensaver 5.22 (16-Jul-2013), by Jamie Zawinski (jwz@jwz.org)";
index aa9fefc387be1809a2e106c4aec7e1f1c240f5ee..5145ce1af1dbefd7696a3fba0e78ed3a6b78a46e 100644 (file)
@@ -1,5 +1,5 @@
 %define        name xscreensaver
-%define        version 5.21
+%define        version 5.22
 
 Summary:       X screen saver and locker
 Name:          %{name}
index 89eeb852e7fb16883a6231740a3f334f046c491c..0d64f2395494d380f3d54f1779b85a14deed4cba 100644 (file)
@@ -48,7 +48,7 @@
                                AF77798F09B6604C00EA3033 /* PBXTargetDependency */,
                                AF77798D09B6604C00EA3033 /* PBXTargetDependency */,
                                AF77798B09B6604C00EA3033 /* PBXTargetDependency */,
-                               AF2D4F8B13E91108002AA818 /* PBXTargetDependency */,
+                               AFBFE785178648E600432B21 /* PBXTargetDependency */,
                                AF77798909B6604C00EA3033 /* PBXTargetDependency */,
                                AF77798709B6604B00EA3033 /* PBXTargetDependency */,
                                AF77798509B6604B00EA3033 /* PBXTargetDependency */,
@@ -79,6 +79,7 @@
                                AF77795109B6604900EA3033 /* PBXTargetDependency */,
                                AF77794F09B6604900EA3033 /* PBXTargetDependency */,
                                AF77794D09B6604900EA3033 /* PBXTargetDependency */,
+                               AFB591C3178B821E00EA4005 /* PBXTargetDependency */,
                                AF77794709B6604900EA3033 /* PBXTargetDependency */,
                                AF77794509B6604900EA3033 /* PBXTargetDependency */,
                                AF77794309B6604900EA3033 /* PBXTargetDependency */,
                                AF77792109B6604800EA3033 /* PBXTargetDependency */,
                                AF77791F09B6604800EA3033 /* PBXTargetDependency */,
                                AF77791D09B6604800EA3033 /* PBXTargetDependency */,
-                               AF2D4F8D13E9111D002AA818 /* PBXTargetDependency */,
+                               AFBFE787178648F500432B21 /* PBXTargetDependency */,
                                AF77791B09B6604700EA3033 /* PBXTargetDependency */,
                                AF77791909B6604700EA3033 /* PBXTargetDependency */,
                                AF77791709B6604700EA3033 /* PBXTargetDependency */,
                                AF777A1509B660B300EA3033 /* PBXTargetDependency */,
                                AF35E8A30E63825600691F2F /* PBXTargetDependency */,
                                AF777A1309B660B300EA3033 /* PBXTargetDependency */,
+                               AFBFE7421786407000432B21 /* PBXTargetDependency */,
                                AF777A1109B660B300EA3033 /* PBXTargetDependency */,
                                AF777A0F09B660B200EA3033 /* PBXTargetDependency */,
                                AF777A0D09B660B200EA3033 /* PBXTargetDependency */,
                                AF7779F909B660B100EA3033 /* PBXTargetDependency */,
                                AF7779F709B660B100EA3033 /* PBXTargetDependency */,
                                AF7779F509B660B100EA3033 /* PBXTargetDependency */,
+                               AFBFE7401786405E00432B21 /* PBXTargetDependency */,
                                AF7779F309B660B000EA3033 /* PBXTargetDependency */,
                                AF7779F109B660B000EA3033 /* PBXTargetDependency */,
                                AF32D9F90F3AD0D90080F535 /* PBXTargetDependency */,
                                AF7779DD09B660AF00EA3033 /* PBXTargetDependency */,
                                AF998EF70A083E1D0051049D /* PBXTargetDependency */,
                                AF4F10F2143450C300E34F3F /* PBXTargetDependency */,
+                               AFDA65AA178A54690070D24B /* PBXTargetDependency */,
                                AF0DCA5C0C4CBB4300D76972 /* PBXTargetDependency */,
                        );
                        name = "All Savers (OpenGL)";
                AF1FD721158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
                AF1FD722158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
                AF1FD723158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
-               AF1FD724158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
-               AF1FD725158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
-               AF1FD726158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
                AF1FD727158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
                AF1FD728158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
                AF1FD729158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
                AF1FD7F1158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
                AF1FD7F2158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
                AF1FD7F3158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
-               AF1FD7F4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
-               AF1FD7F5158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
-               AF1FD7F6158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
                AF1FD7F7158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
                AF1FD7F8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
                AF1FD7F9158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
                AF2C31EB15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
                AF2C31EC15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
                AF2C31ED15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
-               AF2C31EE15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
                AF2C31EF15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
                AF2C31F015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
                AF2C31F115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
                AF2C321F15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
                AF2C322015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
                AF2C322115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
-               AF2C322215C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
                AF2C322315C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
                AF2C322415C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
                AF2C322515C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
                AF2C32C615C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
                AF2C32C715C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
                AF2C32C815C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
-               AF2D4D8413E902F5002AA818 /* SaverRunner.nib in Resources */ = {isa = PBXBuildFile; fileRef = AF9772E10989DFC6001F8B92 /* SaverRunner.nib */; };
                AF2D4D8613E902F5002AA818 /* SaverRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD400981E32E00F7970E /* SaverRunner.m */; };
                AF2D4D8713E902F5002AA818 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
-               AF2D4DBD13E90372002AA818 /* Phosphor.saver in Copy Plugins */ = {isa = PBXBuildFile; fileRef = AF7776F609B63ABF00EA3033 /* Phosphor.saver */; };
-               AF2D4F7113E91093002AA818 /* SaverRunner.nib in Resources */ = {isa = PBXBuildFile; fileRef = AF9772E10989DFC6001F8B92 /* SaverRunner.nib */; };
                AF2D4F7513E91093002AA818 /* SaverRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD400981E32E00F7970E /* SaverRunner.m */; };
                AF2D4F7613E91093002AA818 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
-               AF2D4FA913E9115E002AA818 /* Apple2.saver in Copy Plugins */ = {isa = PBXBuildFile; fileRef = AF9D4DFE09B5BB19006E59CF /* Apple2.saver */; };
-               AF2D522613E954A0002AA818 /* SaverRunner.icns in Resources */ = {isa = PBXBuildFile; fileRef = AF2D522513E954A0002AA818 /* SaverRunner.icns */; };
                AF32D9E70F3AD0B40080F535 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
                AF32D9FB0F3AD1200080F535 /* rubikblocks.c in Sources */ = {isa = PBXBuildFile; fileRef = AF32D9FA0F3AD1200080F535 /* rubikblocks.c */; };
                AF32D9FD0F3AD1330080F535 /* rubikblocks.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF32D9FC0F3AD1330080F535 /* rubikblocks.xml */; };
                AF3581C61431D47B00E09C51 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
                AF3581C71431D47B00E09C51 /* voronoi.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0DCA5F0C4CBB7300D76972 /* voronoi.c */; };
                AF3581C81431D47B00E09C51 /* hilbert.c in Sources */ = {isa = PBXBuildFile; fileRef = AF78D18A142DD96E002AAF77 /* hilbert.c */; };
-               AF3581DA1431D5FC00E09C51 /* companion_disc.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D61431D5FC00E09C51 /* companion_disc.c */; };
-               AF3581DB1431D5FC00E09C51 /* companion_disc.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D61431D5FC00E09C51 /* companion_disc.c */; };
                AF3581DC1431D5FC00E09C51 /* companion_disc.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D61431D5FC00E09C51 /* companion_disc.c */; };
-               AF3581DD1431D5FC00E09C51 /* companion_heart.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D71431D5FC00E09C51 /* companion_heart.c */; };
-               AF3581DE1431D5FC00E09C51 /* companion_heart.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D71431D5FC00E09C51 /* companion_heart.c */; };
                AF3581DF1431D5FC00E09C51 /* companion_heart.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D71431D5FC00E09C51 /* companion_heart.c */; };
-               AF3581E01431D5FC00E09C51 /* companion_quad.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D81431D5FC00E09C51 /* companion_quad.c */; };
-               AF3581E11431D5FC00E09C51 /* companion_quad.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D81431D5FC00E09C51 /* companion_quad.c */; };
                AF3581E21431D5FC00E09C51 /* companion_quad.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D81431D5FC00E09C51 /* companion_quad.c */; };
-               AF3581E31431D5FC00E09C51 /* companion.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D91431D5FC00E09C51 /* companion.c */; };
-               AF3581E41431D5FC00E09C51 /* companion.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D91431D5FC00E09C51 /* companion.c */; };
                AF3581E51431D5FC00E09C51 /* companion.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D91431D5FC00E09C51 /* companion.c */; };
                AF3581E81431D61D00E09C51 /* companioncube.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF3581E61431D61D00E09C51 /* companioncube.xml */; };
                AF3581FF143330F900E09C51 /* voronoi.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF0DCA610C4CBB8E00D76972 /* voronoi.xml */; };
                AF4FF4C10D52CBDE00666F98 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
                AF4FF4D10D52CC8400666F98 /* cubicgrid.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4FF4D00D52CC8400666F98 /* cubicgrid.c */; };
                AF4FF4D40D52CCAA00666F98 /* cubicgrid.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF4FF4D30D52CCAA00666F98 /* cubicgrid.xml */; };
-               AF51FD3315845CC900E5741F /* apple2.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2586F0988A468000655EE /* apple2.xml */; };
                AF51FD3415845CD500E5741F /* phosphor.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F30988A469000655EE /* phosphor.xml */; };
                AF51FD3515845D1400E5741F /* SaverListController.m in Sources */ = {isa = PBXBuildFile; fileRef = AF84AF1E15829AF000607E4C /* SaverListController.m */; };
                AF51FD3615845F9900E5741F /* iSaverRunner.xib in Resources */ = {isa = PBXBuildFile; fileRef = AF56019B157DAA3D00DB2055 /* iSaverRunner.xib */; };
                AF51FD3715845F9F00E5741F /* iSaverRunner.xib in Resources */ = {isa = PBXBuildFile; fileRef = AF56019B157DAA3D00DB2055 /* iSaverRunner.xib */; };
-               AF51FD3815845FC300E5741F /* SaverRunner.icns in Resources */ = {isa = PBXBuildFile; fileRef = AF2D522513E954A0002AA818 /* SaverRunner.icns */; };
                AF51FD3915845FCB00E5741F /* SaverRunner.icns in Resources */ = {isa = PBXBuildFile; fileRef = AF2D522513E954A0002AA818 /* SaverRunner.icns */; };
                AF51FD3A15845FD300E5741F /* iSaverRunner29.png in Resources */ = {isa = PBXBuildFile; fileRef = AF01295A157D5C2C00C396E1 /* iSaverRunner29.png */; };
                AF51FD3B15845FD800E5741F /* iSaverRunner29.png in Resources */ = {isa = PBXBuildFile; fileRef = AF01295A157D5C2C00C396E1 /* iSaverRunner29.png */; };
                AF6427BE09A2DF47000F4CD4 /* bubbles-default.c in Sources */ = {isa = PBXBuildFile; fileRef = AF6427BB09A2DF47000F4CD4 /* bubbles-default.c */; };
                AF6427BF09A2DF47000F4CD4 /* bubbles.c in Sources */ = {isa = PBXBuildFile; fileRef = AF6427BC09A2DF47000F4CD4 /* bubbles.c */; };
                AF69640B0E4FE3470085DBCE /* teapot.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC211930E4E30C800D87B6E /* teapot.c */; };
-               AF6D7ED4158567240080DDC4 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
-               AF6D7ED7158567420080DDC4 /* xscreensaver-text in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */; };
-               AF6D7ED81585674C0080DDC4 /* xscreensaver-text in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */; };
+               AF7511051782B5B900380EA1 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+               AF7511081782B5B900380EA1 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+               AF7511091782B5B900380EA1 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+               AF75110A1782B5B900380EA1 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+               AF75110B1782B5B900380EA1 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+               AF75110C1782B5B900380EA1 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+               AF7511151782B64300380EA1 /* kaleidocycle.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7511141782B64300380EA1 /* kaleidocycle.c */; };
                AF7776EA09B63ABF00EA3033 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
                AF77770209B63B3900EA3033 /* phosphor.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F30988A469000655EE /* phosphor.xml */; };
                AF77770409B63B5F00EA3033 /* phosphor.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77770309B63B5F00EA3033 /* phosphor.c */; };
                AF78D179142DD8F3002AAF77 /* voronoi.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF0DCA610C4CBB8E00D76972 /* voronoi.xml */; };
                AF78D17B142DD8F3002AAF77 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
                AF78D17C142DD8F3002AAF77 /* voronoi.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0DCA5F0C4CBB7300D76972 /* voronoi.c */; };
-               AF78D18B142DD96E002AAF77 /* hilbert.c in Sources */ = {isa = PBXBuildFile; fileRef = AF78D18A142DD96E002AAF77 /* hilbert.c */; };
-               AF78D18C142DD96E002AAF77 /* hilbert.c in Sources */ = {isa = PBXBuildFile; fileRef = AF78D18A142DD96E002AAF77 /* hilbert.c */; };
                AF78D18D142DD96E002AAF77 /* hilbert.c in Sources */ = {isa = PBXBuildFile; fileRef = AF78D18A142DD96E002AAF77 /* hilbert.c */; };
                AF78D191142DD99B002AAF77 /* hilbert.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF78D18E142DD99A002AAF77 /* hilbert.xml */; };
                AF794F6A099748450059A8B0 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
                AFA5638F0993980D00F3E977 /* timetunnel.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5638E0993980D00F3E977 /* timetunnel.c */; };
                AFA563B8099398F700F3E977 /* juggler3d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D10988A468000655EE /* juggler3d.xml */; };
                AFA563BA0993991300F3E977 /* juggler3d.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA563B90993991300F3E977 /* juggler3d.c */; };
+               AFAA6B2B1773863000DE720C /* iSaverRunner29t.png in Resources */ = {isa = PBXBuildFile; fileRef = AF7E080315932A1600D81407 /* iSaverRunner29t.png */; };
+               AFAA6B2C1773866200DE720C /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AFC6BBC1161CE07E0084EDB1 /* Default-568h@2x.png */; };
+               AFAA6B2D1773870700DE720C /* apple2-main.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4E0509B5BC9D006E59CF /* apple2-main.c */; };
+               AFAA6B2E1773870700DE720C /* apple2.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4DD309B5B990006E59CF /* apple2.c */; };
+               AFAA6B2F1773871900DE720C /* analogtv.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4CFA09B5AC94006E59CF /* analogtv.c */; };
+               AFAA6B301773876900DE720C /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3A1590054B003974F3 /* OpenGLES.framework */; };
+               AFAA6B311773876E00DE720C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3815900514003974F3 /* UIKit.framework */; };
+               AFAA6B321773877300DE720C /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF561DF715969C5B007CA5ED /* AssetsLibrary.framework */; };
+               AFAA6B331773877800DE720C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3C15900558003974F3 /* Foundation.framework */; };
+               AFAA6B341773877C00DE720C /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3E1590056A003974F3 /* CoreGraphics.framework */; };
+               AFAA6B351773878000DE720C /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF0FAF3B159BAC7B00BCE2F7 /* CoreText.framework */; };
+               AFAA6B361773878400DE720C /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3F1590056A003974F3 /* QuartzCore.framework */; };
+               AFAA6B391773923900DE720C /* iSaverRunner29t.png in Resources */ = {isa = PBXBuildFile; fileRef = AF7E080315932A1600D81407 /* iSaverRunner29t.png */; };
+               AFAA6B3A1773923D00DE720C /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AFC6BBC1161CE07E0084EDB1 /* Default-568h@2x.png */; };
+               AFAA6B3B1773926C00DE720C /* phosphor.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77770309B63B5F00EA3033 /* phosphor.c */; };
+               AFAA6B3D177392DD00DE720C /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3A1590054B003974F3 /* OpenGLES.framework */; };
+               AFAA6B3E177392E000DE720C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3815900514003974F3 /* UIKit.framework */; };
+               AFAA6B3F177392E400DE720C /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF561DF715969C5B007CA5ED /* AssetsLibrary.framework */; };
+               AFAA6B40177392E800DE720C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3C15900558003974F3 /* Foundation.framework */; };
+               AFAA6B41177392EC00DE720C /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3E1590056A003974F3 /* CoreGraphics.framework */; };
+               AFAA6B42177392F000DE720C /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF0FAF3B159BAC7B00BCE2F7 /* CoreText.framework */; };
+               AFAA6B43177392F600DE720C /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3F1590056A003974F3 /* QuartzCore.framework */; };
+               AFAA6B451773F07800DE720C /* ios-function-table.m in Sources */ = {isa = PBXBuildFile; fileRef = AFAA6B441773F07700DE720C /* ios-function-table.m */; };
+               AFAA6B461773F30500DE720C /* ios-function-table.m in Sources */ = {isa = PBXBuildFile; fileRef = AFAA6B441773F07700DE720C /* ios-function-table.m */; };
+               AFAA6B471773F35600DE720C /* ios-function-table.m in Sources */ = {isa = PBXBuildFile; fileRef = AFAA6B441773F07700DE720C /* ios-function-table.m */; };
                AFAD462309D5F4DA00AB5F95 /* grabclient.c in Sources */ = {isa = PBXBuildFile; fileRef = AFAD462209D5F4DA00AB5F95 /* grabclient.c */; };
+               AFB591AE178B812C00EA4005 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+               AFB591B0178B812C00EA4005 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+               AFB591B1178B812C00EA4005 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+               AFB591B2178B812C00EA4005 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+               AFB591B3178B812C00EA4005 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+               AFB591B4178B812C00EA4005 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+               AFB591BE178B81E600EA4005 /* hexadrop.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFB591BC178B81E600EA4005 /* hexadrop.xml */; };
+               AFB591BF178B81E600EA4005 /* hexadrop.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFB591BC178B81E600EA4005 /* hexadrop.xml */; };
+               AFB591C0178B81E600EA4005 /* hexadrop.c in Sources */ = {isa = PBXBuildFile; fileRef = AFB591BD178B81E600EA4005 /* hexadrop.c */; };
+               AFB591C1178B81E600EA4005 /* hexadrop.c in Sources */ = {isa = PBXBuildFile; fileRef = AFB591BD178B81E600EA4005 /* hexadrop.c */; };
+               AFB8A69B1782BA34004EDB85 /* kaleidocycle.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFB8A69A1782BA34004EDB85 /* kaleidocycle.xml */; };
+               AFB8A69C1782BF6C004EDB85 /* kaleidocycle.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFB8A69A1782BA34004EDB85 /* kaleidocycle.xml */; };
+               AFB8A69D1782BFA6004EDB85 /* kaleidocycle.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7511141782B64300380EA1 /* kaleidocycle.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
                AFBF893E0E41D930006A2D66 /* fps.c in Sources */ = {isa = PBXBuildFile; fileRef = AFBF893C0E41D930006A2D66 /* fps.c */; };
                AFBF893F0E41D930006A2D66 /* fps.h in Headers */ = {isa = PBXBuildFile; fileRef = AFBF893D0E41D930006A2D66 /* fps.h */; };
                AFBF89AF0E423FC3006A2D66 /* fps-gl.c in Sources */ = {isa = PBXBuildFile; fileRef = AFBF89AE0E423FC3006A2D66 /* fps-gl.c */; };
                AFBF89B20E424036006A2D66 /* fpsI.h in Headers */ = {isa = PBXBuildFile; fileRef = AFBF89B10E424036006A2D66 /* fpsI.h */; };
+               AFBFE74F178642DC00432B21 /* SaverRunner.nib in Resources */ = {isa = PBXBuildFile; fileRef = AF9772E10989DFC6001F8B92 /* SaverRunner.nib */; };
+               AFBFE750178642DC00432B21 /* SaverRunner.icns in Resources */ = {isa = PBXBuildFile; fileRef = AF2D522513E954A0002AA818 /* SaverRunner.icns */; };
+               AFBFE752178642DC00432B21 /* SaverRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD400981E32E00F7970E /* SaverRunner.m */; };
+               AFBFE753178642DC00432B21 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
+               AFBFE754178642DC00432B21 /* SaverListController.m in Sources */ = {isa = PBXBuildFile; fileRef = AF84AF1E15829AF000607E4C /* SaverListController.m */; };
+               AFBFE756178642DC00432B21 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+               AFBFE757178642DC00432B21 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+               AFBFE758178642DC00432B21 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+               AFBFE759178642DC00432B21 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+               AFBFE765178643B200432B21 /* Apple2.saver in Resources */ = {isa = PBXBuildFile; fileRef = AF9D4DFE09B5BB19006E59CF /* Apple2.saver */; };
+               AFBFE76F178647FE00432B21 /* SaverRunner.nib in Resources */ = {isa = PBXBuildFile; fileRef = AF9772E10989DFC6001F8B92 /* SaverRunner.nib */; };
+               AFBFE770178647FE00432B21 /* SaverRunner.icns in Resources */ = {isa = PBXBuildFile; fileRef = AF2D522513E954A0002AA818 /* SaverRunner.icns */; };
+               AFBFE772178647FE00432B21 /* SaverRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD400981E32E00F7970E /* SaverRunner.m */; };
+               AFBFE773178647FE00432B21 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
+               AFBFE774178647FE00432B21 /* SaverListController.m in Sources */ = {isa = PBXBuildFile; fileRef = AF84AF1E15829AF000607E4C /* SaverListController.m */; };
+               AFBFE776178647FE00432B21 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+               AFBFE777178647FE00432B21 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+               AFBFE778178647FE00432B21 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+               AFBFE779178647FE00432B21 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+               AFBFE7831786483B00432B21 /* Phosphor.saver in Resources */ = {isa = PBXBuildFile; fileRef = AF7776F609B63ABF00EA3033 /* Phosphor.saver */; };
+               AFBFE78B17895CD000432B21 /* apple2.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2586F0988A468000655EE /* apple2.xml */; };
                AFC211950E4E30C800D87B6E /* teapot.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC211930E4E30C800D87B6E /* teapot.c */; };
                AFC6BBC2161CE07E0084EDB1 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AFC6BBC1161CE07E0084EDB1 /* Default-568h@2x.png */; };
                AFC7592D158D8E8B00C5458E /* textclient.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC7592B158D8E8B00C5458E /* textclient.c */; };
                AFD573630997411200BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
                AFD573700997418D00BA26F7 /* strange.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2591D0988A469000655EE /* strange.xml */; };
                AFD57372099741A200BA26F7 /* strange.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD57371099741A200BA26F7 /* strange.c */; };
+               AFDA6595178A52B70070D24B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+               AFDA6597178A52B70070D24B /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+               AFDA6598178A52B70070D24B /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+               AFDA6599178A52B70070D24B /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+               AFDA659A178A52B70070D24B /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+               AFDA659B178A52B70070D24B /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+               AFDA65A5178A541A0070D24B /* unknownpleasures.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFDA65A3178A541A0070D24B /* unknownpleasures.xml */; };
+               AFDA65A6178A541A0070D24B /* unknownpleasures.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFDA65A3178A541A0070D24B /* unknownpleasures.xml */; };
+               AFDA65A7178A541A0070D24B /* unknownpleasures.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDA65A4178A541A0070D24B /* unknownpleasures.c */; };
+               AFDA65A8178A541A0070D24B /* unknownpleasures.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDA65A4178A541A0070D24B /* unknownpleasures.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
                AFE2A45C0E2E904600ADB298 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
                AFE2A4730E2E90E300ADB298 /* skytentacles.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE2A4720E2E90E300ADB298 /* skytentacles.c */; };
                AFE2A4750E2E911200ADB298 /* skytentacles.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFE2A4740E2E911200ADB298 /* skytentacles.xml */; };
                AFEB9C3D15900558003974F3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3C15900558003974F3 /* Foundation.framework */; };
                AFEB9C401590056A003974F3 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3E1590056A003974F3 /* CoreGraphics.framework */; };
                AFEB9C411590056A003974F3 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3F1590056A003974F3 /* QuartzCore.framework */; };
+               AFF2868617860E830050A578 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+               AFF2868817860E830050A578 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+               AFF2868917860E830050A578 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+               AFF2868A17860E830050A578 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+               AFF2868B17860E830050A578 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+               AFF2868C17860E830050A578 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+               AFF28696178611720050A578 /* quasicrystal.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFF28694178611720050A578 /* quasicrystal.xml */; };
+               AFF28697178611720050A578 /* quasicrystal.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFF28694178611720050A578 /* quasicrystal.xml */; };
+               AFF28698178611720050A578 /* quasicrystal.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF28695178611720050A578 /* quasicrystal.c */; };
+               AFF28699178611720050A578 /* quasicrystal.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF28695178611720050A578 /* quasicrystal.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
                AFF4633C0C4403E400EE6509 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
                AFF4634A0C44044F00EE6509 /* cwaves.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF463490C44044E00EE6509 /* cwaves.c */; };
                AFF4634C0C44046500EE6509 /* cwaves.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFF4634B0C44046500EE6509 /* cwaves.xml */; };
                        remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
                        remoteInfo = jwxyz;
                };
-               AF2D4F8A13E91108002AA818 /* PBXContainerItemProxy */ = {
-                       isa = PBXContainerItemProxy;
-                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
-                       proxyType = 1;
-                       remoteGlobalIDString = AF2D4F6A13E91093002AA818;
-                       remoteInfo = Apple2App;
-               };
-               AF2D4F8C13E9111D002AA818 /* PBXContainerItemProxy */ = {
-                       isa = PBXContainerItemProxy;
-                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
-                       proxyType = 1;
-                       remoteGlobalIDString = AF2D4D7F13E902F5002AA818;
-                       remoteInfo = PhosphorApp;
-               };
                AF2D4F8E13E91127002AA818 /* PBXContainerItemProxy */ = {
                        isa = PBXContainerItemProxy;
                        containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
                        remoteGlobalIDString = AFD570C90996B9F800BA26F7;
                        remoteInfo = Ant;
                };
+               AF7511011782B5B900380EA1 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+                       remoteInfo = jwxyz;
+               };
                AF7776E609B63ABF00EA3033 /* PBXContainerItemProxy */ = {
                        isa = PBXContainerItemProxy;
                        containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
                        remoteGlobalIDString = AFD571B50996D9DC00BA26F7;
                        remoteInfo = Juggle;
                };
+               AFB591A9178B812C00EA4005 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+                       remoteInfo = jwxyz;
+               };
+               AFB591C2178B821E00EA4005 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AFB591A7178B812C00EA4005;
+                       remoteInfo = Hexadrop;
+               };
+               AFBFE73F1786405E00432B21 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AFF2867F17860E830050A578;
+                       remoteInfo = QuasiCrystal;
+               };
+               AFBFE7411786407000432B21 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AF7510FF1782B5B900380EA1;
+                       remoteInfo = Kaleidocycle;
+               };
+               AFBFE74D178642DC00432B21 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+                       remoteInfo = jwxyz;
+               };
+               AFBFE7631786438900432B21 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AF9D4DEC09B5BB19006E59CF;
+                       remoteInfo = Apple2;
+               };
+               AFBFE76B178647FE00432B21 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+                       remoteInfo = jwxyz;
+               };
+               AFBFE7801786482B00432B21 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AF7776E409B63ABF00EA3033;
+                       remoteInfo = Phosphor;
+               };
+               AFBFE784178648E600432B21 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AFBFE74B178642DC00432B21;
+                       remoteInfo = "Apple2-OSX";
+               };
+               AFBFE786178648F500432B21 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AFBFE767178647FE00432B21;
+                       remoteInfo = "Phosphor-OSX";
+               };
                AFCAD5F80992DFE00009617A /* PBXContainerItemProxy */ = {
                        isa = PBXContainerItemProxy;
                        containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
                        remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
                        remoteInfo = jwxyz;
                };
+               AFDA6590178A52B70070D24B /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+                       remoteInfo = jwxyz;
+               };
+               AFDA65A9178A54690070D24B /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AFDA658E178A52B70070D24B;
+                       remoteInfo = "Unknown Pleasures";
+               };
                AFE2A4580E2E904600ADB298 /* PBXContainerItemProxy */ = {
                        isa = PBXContainerItemProxy;
                        containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
                        remoteGlobalIDString = AFE6A41B0CDD7FAA002805BF;
                        remoteInfo = Abstractile;
                };
+               AFF2868117860E830050A578 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+                       remoteInfo = jwxyz;
+               };
                AFF463380C4403E400EE6509 /* PBXContainerItemProxy */ = {
                        isa = PBXContainerItemProxy;
                        containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
                };
 /* End PBXContainerItemProxy section */
 
-/* Begin PBXCopyFilesBuildPhase section */
-               AF2D4DDE13E903F2002AA818 /* Copy Plugins */ = {
-                       isa = PBXCopyFilesBuildPhase;
-                       buildActionMask = 2147483647;
-                       dstPath = "";
-                       dstSubfolderSpec = 13;
-                       files = (
-                               AF2D4DBD13E90372002AA818 /* Phosphor.saver in Copy Plugins */,
-                       );
-                       name = "Copy Plugins";
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               AF2D4F7213E91093002AA818 /* Copy Plugins */ = {
-                       isa = PBXCopyFilesBuildPhase;
-                       buildActionMask = 2147483647;
-                       dstPath = "";
-                       dstSubfolderSpec = 13;
-                       files = (
-                               AF2D4FA913E9115E002AA818 /* Apple2.saver in Copy Plugins */,
-                       );
-                       name = "Copy Plugins";
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-/* End PBXCopyFilesBuildPhase section */
-
 /* Begin PBXFileReference section */
                089C165DFE840E0CC02AAC07 /* InfoPlist.strings */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = InfoPlist.strings; path = OSX/English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
                1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
                AF6427BB09A2DF47000F4CD4 /* bubbles-default.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "bubbles-default.c"; path = "hacks/bubbles-default.c"; sourceTree = "<group>"; };
                AF6427BC09A2DF47000F4CD4 /* bubbles.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = bubbles.c; path = hacks/bubbles.c; sourceTree = "<group>"; };
                AF6427BD09A2DF47000F4CD4 /* bubbles.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = bubbles.h; path = hacks/bubbles.h; sourceTree = "<group>"; };
+               AF7511121782B5B900380EA1 /* Kaleidocycle.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Kaleidocycle.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+               AF7511141782B64300380EA1 /* kaleidocycle.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = kaleidocycle.c; path = hacks/glx/kaleidocycle.c; sourceTree = "<group>"; };
+               AF7511161782B66400380EA1 /* kaleidescope.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = kaleidescope.xml; sourceTree = "<group>"; };
                AF7776F609B63ABF00EA3033 /* Phosphor.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Phosphor.saver; sourceTree = BUILT_PRODUCTS_DIR; };
                AF77770309B63B5F00EA3033 /* phosphor.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = phosphor.c; path = hacks/phosphor.c; sourceTree = "<group>"; };
                AF77772A09B6416100EA3033 /* Pacman.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Pacman.saver; sourceTree = BUILT_PRODUCTS_DIR; };
                AFA5638E0993980D00F3E977 /* timetunnel.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = timetunnel.c; path = hacks/glx/timetunnel.c; sourceTree = "<group>"; };
                AFA563B6099398BB00F3E977 /* Juggler3D.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Juggler3D.saver; sourceTree = BUILT_PRODUCTS_DIR; };
                AFA563B90993991300F3E977 /* juggler3d.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = juggler3d.c; path = hacks/glx/juggler3d.c; sourceTree = "<group>"; };
+               AFAA6B441773F07700DE720C /* ios-function-table.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "ios-function-table.m"; path = "OSX/ios-function-table.m"; sourceTree = "<group>"; };
                AFAD462209D5F4DA00AB5F95 /* grabclient.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = grabclient.c; path = utils/grabclient.c; sourceTree = "<group>"; };
+               AFB591BA178B812C00EA4005 /* Hexadrop.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Hexadrop.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+               AFB591BC178B81E600EA4005 /* hexadrop.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = hexadrop.xml; sourceTree = "<group>"; };
+               AFB591BD178B81E600EA4005 /* hexadrop.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hexadrop.c; path = hacks/hexadrop.c; sourceTree = "<group>"; };
                AFB5A06B0981F4C600871B16 /* screenhack.h */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.h; name = screenhack.h; path = hacks/screenhack.h; sourceTree = "<group>"; };
                AFB5A0ED0981FF8B00871B16 /* usleep.c */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.c; name = usleep.c; path = utils/usleep.c; sourceTree = "<group>"; };
                AFB5A0EE0981FF8B00871B16 /* usleep.h */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.h; name = usleep.h; path = utils/usleep.h; sourceTree = "<group>"; };
+               AFB8A69A1782BA34004EDB85 /* kaleidocycle.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = kaleidocycle.xml; sourceTree = "<group>"; };
                AFBF893C0E41D930006A2D66 /* fps.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = fps.c; path = hacks/fps.c; sourceTree = "<group>"; };
                AFBF893D0E41D930006A2D66 /* fps.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = fps.h; path = hacks/fps.h; sourceTree = "<group>"; };
                AFBF89AE0E423FC3006A2D66 /* fps-gl.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "fps-gl.c"; path = "hacks/glx/fps-gl.c"; sourceTree = "<group>"; };
                AFBF89B10E424036006A2D66 /* fpsI.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = fpsI.h; path = hacks/fpsI.h; sourceTree = "<group>"; };
+               AFBFE75E178642DC00432B21 /* Apple2.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Apple2.app; sourceTree = BUILT_PRODUCTS_DIR; };
+               AFBFE77E178647FE00432B21 /* Phosphor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Phosphor.app; sourceTree = BUILT_PRODUCTS_DIR; };
                AFC211930E4E30C800D87B6E /* teapot.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = teapot.c; path = hacks/glx/teapot.c; sourceTree = "<group>"; };
                AFC211940E4E30C800D87B6E /* teapot.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = teapot.h; path = hacks/glx/teapot.h; sourceTree = "<group>"; };
                AFC254B909873AF9000655EE /* screenhackI.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = screenhackI.h; path = hacks/screenhackI.h; sourceTree = "<group>"; };
                AFD5730C099702C800BA26F7 /* julia.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = julia.c; path = hacks/julia.c; sourceTree = "<group>"; };
                AFD5736D0997411200BA26F7 /* Strange.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Strange.saver; sourceTree = BUILT_PRODUCTS_DIR; };
                AFD57371099741A200BA26F7 /* strange.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = strange.c; path = hacks/strange.c; sourceTree = "<group>"; };
+               AFDA65A1178A52B70070D24B /* UnknownPleasures.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnknownPleasures.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+               AFDA65A3178A541A0070D24B /* unknownpleasures.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = unknownpleasures.xml; sourceTree = "<group>"; };
+               AFDA65A4178A541A0070D24B /* unknownpleasures.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = unknownpleasures.c; path = hacks/glx/unknownpleasures.c; sourceTree = "<group>"; };
                AFE1FD3F0981E32E00F7970E /* SaverRunner.h */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.h; name = SaverRunner.h; path = OSX/SaverRunner.h; sourceTree = "<group>"; };
                AFE1FD400981E32E00F7970E /* SaverRunner.m */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.objc; name = SaverRunner.m; path = OSX/SaverRunner.m; sourceTree = "<group>"; };
                AFE1FD410981E32E00F7970E /* InvertedSlider.h */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.h; name = InvertedSlider.h; path = OSX/InvertedSlider.h; sourceTree = "<group>"; };
                AFEB9C3C15900558003974F3 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
                AFEB9C3E1590056A003974F3 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; };
                AFEB9C3F1590056A003974F3 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };
+               AFF2869217860E830050A578 /* QuasiCrystal.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = QuasiCrystal.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+               AFF28694178611720050A578 /* quasicrystal.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = quasicrystal.xml; sourceTree = "<group>"; };
+               AFF28695178611720050A578 /* quasicrystal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = quasicrystal.c; path = hacks/glx/quasicrystal.c; sourceTree = "<group>"; };
                AFF463470C4403E400EE6509 /* CWaves.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CWaves.saver; sourceTree = BUILT_PRODUCTS_DIR; };
                AFF463490C44044E00EE6509 /* cwaves.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = cwaves.c; path = hacks/cwaves.c; sourceTree = "<group>"; };
                AFF4634B0C44046500EE6509 /* cwaves.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = cwaves.xml; sourceTree = "<group>"; };
                        buildActionMask = 2147483647;
                        files = (
                                AF1FD7F3158FF96500C40F17 /* libjwxyz.a in Frameworks */,
-                               AF1FD7F4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
-                               AF2C322215C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
-                               AF1FD7F5158FF96500C40F17 /* Cocoa.framework in Frameworks */,
-                               AF1FD7F6158FF96500C40F17 /* Carbon.framework in Frameworks */,
+                               AFAA6B3D177392DD00DE720C /* OpenGLES.framework in Frameworks */,
+                               AFAA6B3E177392E000DE720C /* UIKit.framework in Frameworks */,
+                               AFAA6B3F177392E400DE720C /* AssetsLibrary.framework in Frameworks */,
+                               AFAA6B40177392E800DE720C /* Foundation.framework in Frameworks */,
+                               AFAA6B41177392EC00DE720C /* CoreGraphics.framework in Frameworks */,
+                               AFAA6B42177392F000DE720C /* CoreText.framework in Frameworks */,
+                               AFAA6B43177392F600DE720C /* QuartzCore.framework in Frameworks */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        buildActionMask = 2147483647;
                        files = (
                                AF1FD723158FF96500C40F17 /* libjwxyz.a in Frameworks */,
-                               AF1FD724158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
-                               AF2C31EE15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
-                               AF1FD725158FF96500C40F17 /* Cocoa.framework in Frameworks */,
-                               AF1FD726158FF96500C40F17 /* Carbon.framework in Frameworks */,
+                               AFAA6B301773876900DE720C /* OpenGLES.framework in Frameworks */,
+                               AFAA6B311773876E00DE720C /* UIKit.framework in Frameworks */,
+                               AFAA6B321773877300DE720C /* AssetsLibrary.framework in Frameworks */,
+                               AFAA6B331773877800DE720C /* Foundation.framework in Frameworks */,
+                               AFAA6B341773877C00DE720C /* CoreGraphics.framework in Frameworks */,
+                               AFAA6B351773878000DE720C /* CoreText.framework in Frameworks */,
+                               AFAA6B361773878400DE720C /* QuartzCore.framework in Frameworks */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AF7511071782B5B900380EA1 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AF7511081782B5B900380EA1 /* libjwxyz.a in Frameworks */,
+                               AF7511091782B5B900380EA1 /* ScreenSaver.framework in Frameworks */,
+                               AF75110A1782B5B900380EA1 /* QuartzCore.framework in Frameworks */,
+                               AF75110B1782B5B900380EA1 /* Cocoa.framework in Frameworks */,
+                               AF75110C1782B5B900380EA1 /* Carbon.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AF7776EE09B63ABF00EA3033 /* Frameworks */ = {
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AFB591AF178B812C00EA4005 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AFB591B0178B812C00EA4005 /* libjwxyz.a in Frameworks */,
+                               AFB591B1178B812C00EA4005 /* ScreenSaver.framework in Frameworks */,
+                               AFB591B2178B812C00EA4005 /* QuartzCore.framework in Frameworks */,
+                               AFB591B3178B812C00EA4005 /* Cocoa.framework in Frameworks */,
+                               AFB591B4178B812C00EA4005 /* Carbon.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               AFBFE755178642DC00432B21 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AFBFE756178642DC00432B21 /* ScreenSaver.framework in Frameworks */,
+                               AFBFE757178642DC00432B21 /* QuartzCore.framework in Frameworks */,
+                               AFBFE758178642DC00432B21 /* Cocoa.framework in Frameworks */,
+                               AFBFE759178642DC00432B21 /* Carbon.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               AFBFE775178647FE00432B21 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AFBFE776178647FE00432B21 /* ScreenSaver.framework in Frameworks */,
+                               AFBFE777178647FE00432B21 /* QuartzCore.framework in Frameworks */,
+                               AFBFE778178647FE00432B21 /* Cocoa.framework in Frameworks */,
+                               AFBFE779178647FE00432B21 /* Carbon.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AFD51B240F063B4A00471C02 /* Frameworks */ = {
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AFDA6596178A52B70070D24B /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AFDA6597178A52B70070D24B /* libjwxyz.a in Frameworks */,
+                               AFDA6598178A52B70070D24B /* ScreenSaver.framework in Frameworks */,
+                               AFDA6599178A52B70070D24B /* QuartzCore.framework in Frameworks */,
+                               AFDA659A178A52B70070D24B /* Cocoa.framework in Frameworks */,
+                               AFDA659B178A52B70070D24B /* Carbon.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AFE2A45E0E2E904600ADB298 /* Frameworks */ = {
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AFF2868717860E830050A578 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AFF2868817860E830050A578 /* libjwxyz.a in Frameworks */,
+                               AFF2868917860E830050A578 /* ScreenSaver.framework in Frameworks */,
+                               AFF2868A17860E830050A578 /* QuartzCore.framework in Frameworks */,
+                               AFF2868B17860E830050A578 /* Cocoa.framework in Frameworks */,
+                               AFF2868C17860E830050A578 /* Carbon.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AFF4633E0C4403E400EE6509 /* Frameworks */ = {
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                                AF3581D51431D47B00E09C51 /* CompanionCube.saver */,
                                AF358216143330F900E09C51 /* TronBit.saver */,
                                AF91898F158FC00A002B5D1E /* XScreenSaver.app */,
+                               AF7511121782B5B900380EA1 /* Kaleidocycle.saver */,
+                               AFF2869217860E830050A578 /* QuasiCrystal.saver */,
+                               AFBFE75E178642DC00432B21 /* Apple2.app */,
+                               AFBFE77E178647FE00432B21 /* Phosphor.app */,
+                               AFDA65A1178A52B70070D24B /* UnknownPleasures.saver */,
+                               AFB591BA178B812C00EA4005 /* Hexadrop.saver */,
                        );
                        name = Products;
                        sourceTree = "<group>";
                                AF84AF1E15829AF000607E4C /* SaverListController.m */,
                                AFE1FD3F0981E32E00F7970E /* SaverRunner.h */,
                                AFE1FD400981E32E00F7970E /* SaverRunner.m */,
+                               AFAA6B441773F07700DE720C /* ios-function-table.m */,
                        );
                        name = SaverRunner;
                        sourceTree = "<group>";
                                AF477266099D5768001F091E /* halftone.c */,
                                AF480C29098E295D00FB32B8 /* halo.c */,
                                AF480C2F098E2A6700FB32B8 /* helix.c */,
+                               AFB591BD178B81E600EA4005 /* hexadrop.c */,
                                AF64262209A18E1E000F4CD4 /* hyperball.c */,
                                AF6425DF09A188FB000F4CD4 /* hypercube.c */,
                                AF47743A099D7CEA001F091E /* ifs.c */,
                                AF35EB250E6382BA00691F2F /* jigsaw.c */,
                                AFA55F210993620200F3E977 /* jigglypuff.c */,
                                AFA563B90993991300F3E977 /* juggler3d.c */,
+                               AF7511141782B64300380EA1 /* kaleidocycle.c */,
                                AFA55F3F0993626E00F3E977 /* klein.c */,
                                AFA55A8E0993369100F3E977 /* lament.c */,
                                AFA55DDD09935DB600F3E977 /* lavalite.c */,
                                AFA560C3099371D500F3E977 /* polytopes.c */,
                                AFA5621C099384F600F3E977 /* providence.c */,
                                AFA55B3F09933EC600F3E977 /* pulsar.c */,
+                               AFF28695178611720050A578 /* quasicrystal.c */,
                                AFA55E0609935EB800F3E977 /* queens.c */,
                                AFA559EA0993335C00F3E977 /* rubik.c */,
                                AF32D9FA0F3AD1200080F535 /* rubikblocks.c */,
                                AF998EF80A083E750051049D /* topblock.c */,
                                AF083A58099312B000277BE9 /* tunnel_draw.c */,
                                AF083A5D099312DB00277BE9 /* tunnel_draw.h */,
+                               AFDA65A4178A541A0070D24B /* unknownpleasures.c */,
                                AF0DCA5F0C4CBB7300D76972 /* voronoi.c */,
                                AF0839AD09930C4900277BE9 /* whale.c */,
                        );
                                AFC258C20988A468000655EE /* halftone.xml */,
                                AFC258C30988A468000655EE /* halo.xml */,
                                AFC258C40988A468000655EE /* helix.xml */,
+                               AFB591BC178B81E600EA4005 /* hexadrop.xml */,
                                AF78D18E142DD99A002AAF77 /* hilbert.xml */,
                                AFC258C50988A468000655EE /* hopalong.xml */,
                                AFC258C60988A468000655EE /* hyperball.xml */,
                                AFC258D10988A468000655EE /* juggler3d.xml */,
                                AFC258D20988A468000655EE /* julia.xml */,
                                AFC258D30988A468000655EE /* kaleidescope.xml */,
+                               AF7511161782B66400380EA1 /* kaleidescope.xml */,
+                               AFB8A69A1782BA34004EDB85 /* kaleidocycle.xml */,
                                AFC258D40988A468000655EE /* klein.xml */,
                                AFC258D50988A468000655EE /* kumppa.xml */,
                                AFC258D60988A468000655EE /* lament.xml */,
                                AFC258FD0988A469000655EE /* pulsar.xml */,
                                AFC258FE0988A469000655EE /* pyro.xml */,
                                AFC258FF0988A469000655EE /* qix.xml */,
+                               AFF28694178611720050A578 /* quasicrystal.xml */,
                                AFC259000988A469000655EE /* queens.xml */,
                                AFCCCBAD09BFE4B000353F4D /* rdbomb.xml */,
                                AFC259030988A469000655EE /* ripples.xml */,
                                AFC259280988A469000655EE /* vermiculate.xml */,
                                AFC259290988A469000655EE /* vidwhacker.xml */,
                                AFC2592A0988A469000655EE /* vines.xml */,
+                               AFDA65A3178A541A0070D24B /* unknownpleasures.xml */,
                                AF0DCA610C4CBB8E00D76972 /* voronoi.xml */,
                                AFC2592B0988A469000655EE /* wander.xml */,
                                AFC2592C0988A469000655EE /* webcollage.xml */,
                        productReference = AF1A17730D6D6EE3008AF328 /* LCDscrub.saver */;
                        productType = "com.apple.product-type.bundle";
                };
-               AF2D4D7F13E902F5002AA818 /* PhosphorApp */ = {
+               AF2D4D7F13E902F5002AA818 /* Phosphor-iOS */ = {
                        isa = PBXNativeTarget;
-                       buildConfigurationList = AF2D4D8C13E902F5002AA818 /* Build configuration list for PBXNativeTarget "PhosphorApp" */;
+                       buildConfigurationList = AF2D4D8C13E902F5002AA818 /* Build configuration list for PBXNativeTarget "Phosphor-iOS" */;
                        buildPhases = (
                                AF2D4D8213E902F5002AA818 /* Resources */,
-                               AF2D4DDE13E903F2002AA818 /* Copy Plugins */,
                                AF2D4D8513E902F5002AA818 /* Sources */,
                                AF2D4D8813E902F5002AA818 /* Frameworks */,
                                AF2D51F413E94AC4002AA818 /* Run Update Info Plist */,
                                AF2D4D8013E902F5002AA818 /* PBXTargetDependency */,
                                AF2D4D9E13E90347002AA818 /* PBXTargetDependency */,
                        );
-                       name = PhosphorApp;
+                       name = "Phosphor-iOS";
                        productName = PhosphorApp;
                        productReference = AF2D4D8F13E902F5002AA818 /* Phosphor.app */;
                        productType = "com.apple.product-type.application";
                };
-               AF2D4F6A13E91093002AA818 /* Apple2App */ = {
+               AF2D4F6A13E91093002AA818 /* Apple2-iOS */ = {
                        isa = PBXNativeTarget;
-                       buildConfigurationList = AF2D4F7B13E91093002AA818 /* Build configuration list for PBXNativeTarget "Apple2App" */;
+                       buildConfigurationList = AF2D4F7B13E91093002AA818 /* Build configuration list for PBXNativeTarget "Apple2-iOS" */;
                        buildPhases = (
                                AF2D4F6F13E91093002AA818 /* Resources */,
-                               AF2D4F7213E91093002AA818 /* Copy Plugins */,
                                AF2D4F7413E91093002AA818 /* Sources */,
                                AF2D4F7713E91093002AA818 /* Frameworks */,
                                AF2D51FD13E94B2D002AA818 /* Run Update Info Plist */,
                        buildRules = (
                        );
                        dependencies = (
-                               AF2D4F8F13E91127002AA818 /* PBXTargetDependency */,
                                AF2D4F6B13E91093002AA818 /* PBXTargetDependency */,
+                               AF2D4F8F13E91127002AA818 /* PBXTargetDependency */,
                        );
-                       name = Apple2App;
+                       name = "Apple2-iOS";
                        productName = Apple2App;
                        productReference = AF2D4F7E13E91093002AA818 /* Apple2.app */;
                        productType = "com.apple.product-type.application";
                        productReference = AF6427B809A2DE36000F4CD4 /* Bubbles.saver */;
                        productType = "com.apple.product-type.bundle";
                };
+               AF7510FF1782B5B900380EA1 /* Kaleidocycle */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = AF75110F1782B5B900380EA1 /* Build configuration list for PBXNativeTarget "Kaleidocycle" */;
+                       buildPhases = (
+                               AF7511021782B5B900380EA1 /* Resources */,
+                               AF7511041782B5B900380EA1 /* Sources */,
+                               AF7511071782B5B900380EA1 /* Frameworks */,
+                               AF75110D1782B5B900380EA1 /* Rez */,
+                               AF75110E1782B5B900380EA1 /* Run Update Info Plist */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               AF7511001782B5B900380EA1 /* PBXTargetDependency */,
+                       );
+                       name = Kaleidocycle;
+                       productName = Voronoi;
+                       productReference = AF7511121782B5B900380EA1 /* Kaleidocycle.saver */;
+                       productType = "com.apple.product-type.bundle";
+               };
                AF7776E409B63ABF00EA3033 /* Phosphor */ = {
                        isa = PBXNativeTarget;
                        buildConfigurationList = AF7776F309B63ABF00EA3033 /* Build configuration list for PBXNativeTarget "Phosphor" */;
                        productReference = AFA563B6099398BB00F3E977 /* Juggler3D.saver */;
                        productType = "com.apple.product-type.bundle";
                };
+               AFB591A7178B812C00EA4005 /* Hexadrop */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = AFB591B7178B812C00EA4005 /* Build configuration list for PBXNativeTarget "Hexadrop" */;
+                       buildPhases = (
+                               AFB591AA178B812C00EA4005 /* Resources */,
+                               AFB591AC178B812C00EA4005 /* Sources */,
+                               AFB591AF178B812C00EA4005 /* Frameworks */,
+                               AFB591B5178B812C00EA4005 /* Rez */,
+                               AFB591B6178B812C00EA4005 /* Run Update Info Plist */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               AFB591A8178B812C00EA4005 /* PBXTargetDependency */,
+                       );
+                       name = Hexadrop;
+                       productName = Attraction;
+                       productReference = AFB591BA178B812C00EA4005 /* Hexadrop.saver */;
+                       productType = "com.apple.product-type.bundle";
+               };
+               AFBFE74B178642DC00432B21 /* Apple2-OSX */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = AFBFE75B178642DC00432B21 /* Build configuration list for PBXNativeTarget "Apple2-OSX" */;
+                       buildPhases = (
+                               AFBFE74E178642DC00432B21 /* Resources */,
+                               AFBFE751178642DC00432B21 /* Sources */,
+                               AFBFE755178642DC00432B21 /* Frameworks */,
+                               AFBFE78817894FFA00432B21 /* Copy Standalone Preferences XML File */,
+                               AFBFE75A178642DC00432B21 /* Run Update Info Plist */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               AFBFE7641786438900432B21 /* PBXTargetDependency */,
+                               AFBFE74C178642DC00432B21 /* PBXTargetDependency */,
+                       );
+                       name = "Apple2-OSX";
+                       productName = SaverTester;
+                       productReference = AFBFE75E178642DC00432B21 /* Apple2.app */;
+                       productType = "com.apple.product-type.application";
+               };
+               AFBFE767178647FE00432B21 /* Phosphor-OSX */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = AFBFE77B178647FE00432B21 /* Build configuration list for PBXNativeTarget "Phosphor-OSX" */;
+                       buildPhases = (
+                               AFBFE76C178647FE00432B21 /* Resources */,
+                               AFBFE771178647FE00432B21 /* Sources */,
+                               AFBFE775178647FE00432B21 /* Frameworks */,
+                               AFBFE78917895AAF00432B21 /* Copy Standalone Preferences XML File */,
+                               AFBFE77A178647FE00432B21 /* Run Update Info Plist */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               AFBFE7811786482B00432B21 /* PBXTargetDependency */,
+                               AFBFE76A178647FE00432B21 /* PBXTargetDependency */,
+                       );
+                       name = "Phosphor-OSX";
+                       productName = SaverTester;
+                       productReference = AFBFE77E178647FE00432B21 /* Phosphor.app */;
+                       productType = "com.apple.product-type.application";
+               };
                AFD51B1B0F063B4A00471C02 /* Photopile */ = {
                        isa = PBXNativeTarget;
                        buildConfigurationList = AFD51B2D0F063B4A00471C02 /* Build configuration list for PBXNativeTarget "Photopile" */;
                        productReference = AFD5736D0997411200BA26F7 /* Strange.saver */;
                        productType = "com.apple.product-type.bundle";
                };
+               AFDA658E178A52B70070D24B /* Unknown Pleasures */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = AFDA659E178A52B70070D24B /* Build configuration list for PBXNativeTarget "Unknown Pleasures" */;
+                       buildPhases = (
+                               AFDA6591178A52B70070D24B /* Resources */,
+                               AFDA6593178A52B70070D24B /* Sources */,
+                               AFDA6596178A52B70070D24B /* Frameworks */,
+                               AFDA659C178A52B70070D24B /* Rez */,
+                               AFDA659D178A52B70070D24B /* Run Update Info Plist */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               AFDA658F178A52B70070D24B /* PBXTargetDependency */,
+                       );
+                       name = "Unknown Pleasures";
+                       productName = DangerBall;
+                       productReference = AFDA65A1178A52B70070D24B /* UnknownPleasures.saver */;
+                       productType = "com.apple.product-type.bundle";
+               };
                AFE2A4560E2E904600ADB298 /* SkyTentacles */ = {
                        isa = PBXNativeTarget;
                        buildConfigurationList = AFE2A4670E2E904600ADB298 /* Build configuration list for PBXNativeTarget "SkyTentacles" */;
                        productReference = AFE6A42D0CDD7FAA002805BF /* Abstractile.saver */;
                        productType = "com.apple.product-type.bundle";
                };
+               AFF2867F17860E830050A578 /* QuasiCrystal */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = AFF2868F17860E830050A578 /* Build configuration list for PBXNativeTarget "QuasiCrystal" */;
+                       buildPhases = (
+                               AFF2868217860E830050A578 /* Resources */,
+                               AFF2868417860E830050A578 /* Sources */,
+                               AFF2868717860E830050A578 /* Frameworks */,
+                               AFF2868D17860E830050A578 /* Rez */,
+                               AFF2868E17860E830050A578 /* Run Update Info Plist */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               AFF2868017860E830050A578 /* PBXTargetDependency */,
+                       );
+                       name = QuasiCrystal;
+                       productName = DangerBall;
+                       productReference = AFF2869217860E830050A578 /* QuasiCrystal.saver */;
+                       productType = "com.apple.product-type.bundle";
+               };
                AFF463360C4403E400EE6509 /* CWaves */ = {
                        isa = PBXNativeTarget;
                        buildConfigurationList = AFF463440C4403E400EE6509 /* Build configuration list for PBXNativeTarget "CWaves" */;
                                AF47721E099D4F67001F091E /* Anemone */,
                                AF4773C1099D67B9001F091E /* Anemotaxis */,
                                AF9D4DEC09B5BB19006E59CF /* Apple2 */,
-                               AF2D4F6A13E91093002AA818 /* Apple2App */,
+                               AF2D4F6A13E91093002AA818 /* Apple2-iOS */,
+                               AFBFE74B178642DC00432B21 /* Apple2-OSX */,
                                AF9770660989D2F6001F8B92 /* Attraction */,
                                AF975A86099C6BC300B05160 /* Barcode */,
                                AF47768F099DAA6F001F091E /* Blaster */,
                                AF477253099D5717001F091E /* Halftone */,
                                AF975C12099C8C1500B05160 /* Halo */,
                                AF480C49098E301400FB32B8 /* Helix */,
+                               AFB591A7178B812C00EA4005 /* Hexadrop */,
                                AF477426099D7C70001F091E /* IFS */,
                                AF97572D099C317000B05160 /* IMSMap */,
                                AF477752099DB61E001F091E /* Interaggregate */,
                                AF4778AB099DDB79001F091E /* Penetrate */,
                                AF477670099DA849001F091E /* Petri */,
                                AF7776E409B63ABF00EA3033 /* Phosphor */,
-                               AF2D4D7F13E902F5002AA818 /* PhosphorApp */,
+                               AF2D4D7F13E902F5002AA818 /* Phosphor-iOS */,
+                               AFBFE767178647FE00432B21 /* Phosphor-OSX */,
                                AF477283099D5926001F091E /* Piecewise */,
                                AF9D4CE709B5AA8E006E59CF /* Pong */,
                                AF47726B099D57B9001F091E /* PopSquares */,
                                AFA55F06099361B700F3E977 /* JigglyPuff */,
                                AF35E88A0E63823600691F2F /* Jigsaw */,
                                AFA563A4099398BB00F3E977 /* Juggler3D */,
+                               AF7510FF1782B5B900380EA1 /* Kaleidocycle */,
                                AFA55F2A0993622F00F3E977 /* Klein */,
                                AFA55A790993364300F3E977 /* Lament */,
                                AFA55DC809935D7000F3E977 /* Lavalite */,
                                AFA560AE0993718D00F3E977 /* Polytopes */,
                                AFA562060993849F00F3E977 /* Providence */,
                                AFA55B2509933E8D00F3E977 /* Pulsar */,
+                               AFF2867F17860E830050A578 /* QuasiCrystal */,
                                AFA55DF009935E4900F3E977 /* Queens */,
                                AFA559CF0993330600F3E977 /* Rubik */,
                                AF32D9E00F3AD0B40080F535 /* RubikBlocks */,
                                AFA56379099397B300F3E977 /* TimeTunnel */,
                                AF998EDA0A083DB30051049D /* TopBlock */,
                                AF3581FB143330F900E09C51 /* TronBit */,
+                               AFDA658E178A52B70070D24B /* Unknown Pleasures */,
                                AF0DCA420C4CBB0D00D76972 /* Voronoi */,
                                AF137D410F075C9B004DE3B2 /* Obsolete */,
                                AFA55CCC09934CE400F3E977 /* GLForestFire */,
                        isa = PBXResourcesBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
-                               AF2D4D8413E902F5002AA818 /* SaverRunner.nib in Resources */,
-                               AF2D522613E954A0002AA818 /* SaverRunner.icns in Resources */,
-                               AF51FD3415845CD500E5741F /* phosphor.xml in Resources */,
                                AF51FD3715845F9F00E5741F /* iSaverRunner.xib in Resources */,
+                               AFAA6B3A1773923D00DE720C /* Default-568h@2x.png in Resources */,
                                AF51FD3B15845FD800E5741F /* iSaverRunner29.png in Resources */,
+                               AFAA6B391773923900DE720C /* iSaverRunner29t.png in Resources */,
                                AF51FD3C15845FDB00E5741F /* iSaverRunner50.png in Resources */,
                                AF51FD3F15845FF700E5741F /* iSaverRunner57.png in Resources */,
                                AF51FD4015845FF900E5741F /* iSaverRunner72.png in Resources */,
                                AF51FD431584600300E5741F /* iSaverRunner114.png in Resources */,
-                               AF6D7ED7158567420080DDC4 /* xscreensaver-text in Resources */,
+                               AF51FD3415845CD500E5741F /* phosphor.xml in Resources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        isa = PBXResourcesBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
-                               AF2D4F7113E91093002AA818 /* SaverRunner.nib in Resources */,
-                               AF51FD3315845CC900E5741F /* apple2.xml in Resources */,
                                AF51FD3615845F9900E5741F /* iSaverRunner.xib in Resources */,
-                               AF51FD3815845FC300E5741F /* SaverRunner.icns in Resources */,
+                               AFAA6B2C1773866200DE720C /* Default-568h@2x.png in Resources */,
                                AF51FD3A15845FD300E5741F /* iSaverRunner29.png in Resources */,
+                               AFAA6B2B1773863000DE720C /* iSaverRunner29t.png in Resources */,
                                AF51FD3D15845FDE00E5741F /* iSaverRunner50.png in Resources */,
                                AF51FD3E15845FE200E5741F /* iSaverRunner57.png in Resources */,
                                AF51FD4115845FFC00E5741F /* iSaverRunner72.png in Resources */,
                                AF51FD4215845FFF00E5741F /* iSaverRunner114.png in Resources */,
-                               AF6D7ED4158567240080DDC4 /* xscreensaver-getimage-file in Resources */,
-                               AF6D7ED81585674C0080DDC4 /* xscreensaver-text in Resources */,
+                               AFBFE78B17895CD000432B21 /* apple2.xml in Resources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AF7511021782B5B900380EA1 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AFB8A69B1782BA34004EDB85 /* kaleidocycle.xml in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AF7776E709B63ABF00EA3033 /* Resources */ = {
                        isa = PBXResourcesBuildPhase;
                        buildActionMask = 2147483647;
                        isa = PBXResourcesBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
+                               AF918983158FC00A002B5D1E /* iSaverRunner.xib in Resources */,
+                               AFC6BBC2161CE07E0084EDB1 /* Default-568h@2x.png in Resources */,
                                AF91897E158FC00A002B5D1E /* iSaverRunner29.png in Resources */,
                                AF7E080415932A1600D81407 /* iSaverRunner29t.png in Resources */,
                                AF91897F158FC00A002B5D1E /* iSaverRunner50.png in Resources */,
                                AF918980158FC00A002B5D1E /* iSaverRunner57.png in Resources */,
                                AF918981158FC00A002B5D1E /* iSaverRunner72.png in Resources */,
                                AF918982158FC00A002B5D1E /* iSaverRunner114.png in Resources */,
-                               AF918983158FC00A002B5D1E /* iSaverRunner.xib in Resources */,
                                AF918AB4158FC53D002B5D1E /* abstractile.xml in Resources */,
                                AF918AB5158FC53D002B5D1E /* anemone.xml in Resources */,
                                AF918AB6158FC53D002B5D1E /* anemotaxis.xml in Resources */,
                                AF918B11158FC53D002B5D1E /* halftone.xml in Resources */,
                                AF918B12158FC53D002B5D1E /* halo.xml in Resources */,
                                AF918B13158FC53D002B5D1E /* helix.xml in Resources */,
+                               AFB591BF178B81E600EA4005 /* hexadrop.xml in Resources */,
                                AF918B14158FC53D002B5D1E /* hilbert.xml in Resources */,
                                AF918B15158FC53D002B5D1E /* hopalong.xml in Resources */,
                                AF918B18158FC53D002B5D1E /* hypertorus.xml in Resources */,
                                AF39483F15A1647A0000FFCD /* jigsaw.xml in Resources */,
                                AF918B22158FC53D002B5D1E /* juggler3d.xml in Resources */,
                                AF918B23158FC53D002B5D1E /* julia.xml in Resources */,
+                               AFB8A69C1782BF6C004EDB85 /* kaleidocycle.xml in Resources */,
                                AF918B24158FC53D002B5D1E /* kaleidescope.xml in Resources */,
                                AF918B25158FC53D002B5D1E /* klein.xml in Resources */,
                                AF918B26158FC53D002B5D1E /* kumppa.xml in Resources */,
                                AF918B53158FC53E002B5D1E /* pulsar.xml in Resources */,
                                AF918B54158FC53E002B5D1E /* pyro.xml in Resources */,
                                AF918B55158FC53E002B5D1E /* qix.xml in Resources */,
+                               AFF28697178611720050A578 /* quasicrystal.xml in Resources */,
                                AF918B56158FC53E002B5D1E /* queens.xml in Resources */,
                                AF918B57158FC53E002B5D1E /* rdbomb.xml in Resources */,
                                AF918B58158FC53E002B5D1E /* ripples.xml in Resources */,
                                AF918B7E158FC53E002B5D1E /* truchet.xml in Resources */,
                                AF918B7F158FC53E002B5D1E /* twang.xml in Resources */,
                                AF918B80158FC53E002B5D1E /* vermiculate.xml in Resources */,
+                               AFDA65A6178A541A0070D24B /* unknownpleasures.xml in Resources */,
                                AF918B83158FC53E002B5D1E /* voronoi.xml in Resources */,
                                AF918B84158FC53E002B5D1E /* wander.xml in Resources */,
                                AF918B86158FC53E002B5D1E /* whirlwindwarp.xml in Resources */,
                                AF918B8F158FC53E002B5D1E /* xrayswarm.xml in Resources */,
                                AF918B90158FC53E002B5D1E /* xspirograph.xml in Resources */,
                                AF918B91158FC554002B5D1E /* zoom.xml in Resources */,
-                               AFC6BBC2161CE07E0084EDB1 /* Default-568h@2x.png in Resources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AFB591AA178B812C00EA4005 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AFB591BE178B81E600EA4005 /* hexadrop.xml in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               AFBFE74E178642DC00432B21 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AFBFE765178643B200432B21 /* Apple2.saver in Resources */,
+                               AFBFE74F178642DC00432B21 /* SaverRunner.nib in Resources */,
+                               AFBFE750178642DC00432B21 /* SaverRunner.icns in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               AFBFE76C178647FE00432B21 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AFBFE7831786483B00432B21 /* Phosphor.saver in Resources */,
+                               AFBFE76F178647FE00432B21 /* SaverRunner.nib in Resources */,
+                               AFBFE770178647FE00432B21 /* SaverRunner.icns in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AFD51B1E0F063B4A00471C02 /* Resources */ = {
                        isa = PBXResourcesBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AFDA6591178A52B70070D24B /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AFDA65A5178A541A0070D24B /* unknownpleasures.xml in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AFE2A4590E2E904600ADB298 /* Resources */ = {
                        isa = PBXResourcesBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AFF2868217860E830050A578 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AFF28696178611720050A578 /* quasicrystal.xml in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AFF463390C4403E400EE6509 /* Resources */ = {
                        isa = PBXResourcesBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AF75110D1782B5B900380EA1 /* Rez */ = {
+                       isa = PBXRezBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AF7776F209B63ABF00EA3033 /* Rez */ = {
                        isa = PBXRezBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AFB591B5178B812C00EA4005 /* Rez */ = {
+                       isa = PBXRezBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AFD51B2B0F063B4A00471C02 /* Rez */ = {
                        isa = PBXRezBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AFDA659C178A52B70070D24B /* Rez */ = {
+                       isa = PBXRezBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AFE2A4650E2E904600ADB298 /* Rez */ = {
                        isa = PBXRezBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AFF2868D17860E830050A578 /* Rez */ = {
+                       isa = PBXRezBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AFF463420C4403E400EE6509 /* Rez */ = {
                        isa = PBXRezBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                        shellPath = /bin/sh;
-                       shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q `/bin/ls -d $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX/{Contents/,}PlugIns/*.saver 2>&-`\n$SOURCE_ROOT/OSX/update-info-plist.pl -q `/bin/ls -d $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX 2>&-`\n";
+                       shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
                        showEnvVarsInLog = 0;
                };
                AF2D51FD13E94B2D002AA818 /* Run Update Info Plist */ = {
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                        shellPath = /bin/sh;
-                       shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q `/bin/ls -d $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX/{Contents/,}PlugIns/*.saver 2>&-`\n$SOURCE_ROOT/OSX/update-info-plist.pl -q `/bin/ls -d $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX 2>&-`\n";
+                       shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
                        showEnvVarsInLog = 0;
                };
                AF32D9F00F3AD0B40080F535 /* Run Update Info Plist */ = {
                        shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
                        showEnvVarsInLog = 0;
                };
+               AF75110E1782B5B900380EA1 /* Run Update Info Plist */ = {
+                       isa = PBXShellScriptBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       inputPaths = (
+                       );
+                       name = "Run Update Info Plist";
+                       outputPaths = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+                       shellPath = /bin/sh;
+                       shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+                       showEnvVarsInLog = 0;
+               };
                AF78D185142DD8F3002AAF77 /* Run Update Info Plist */ = {
                        isa = PBXShellScriptBuildPhase;
                        buildActionMask = 2147483647;
                        shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
                        showEnvVarsInLog = 0;
                };
+               AFB591B6178B812C00EA4005 /* Run Update Info Plist */ = {
+                       isa = PBXShellScriptBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       inputPaths = (
+                       );
+                       name = "Run Update Info Plist";
+                       outputPaths = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+                       shellPath = /bin/sh;
+                       shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+                       showEnvVarsInLog = 0;
+               };
+               AFBFE75A178642DC00432B21 /* Run Update Info Plist */ = {
+                       isa = PBXShellScriptBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       inputPaths = (
+                       );
+                       name = "Run Update Info Plist";
+                       outputPaths = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+                       shellPath = /bin/sh;
+                       shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+                       showEnvVarsInLog = 0;
+               };
+               AFBFE77A178647FE00432B21 /* Run Update Info Plist */ = {
+                       isa = PBXShellScriptBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       inputPaths = (
+                       );
+                       name = "Run Update Info Plist";
+                       outputPaths = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+                       shellPath = /bin/sh;
+                       shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+                       showEnvVarsInLog = 0;
+               };
+               AFBFE78817894FFA00432B21 /* Copy Standalone Preferences XML File */ = {
+                       isa = PBXShellScriptBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       inputPaths = (
+                       );
+                       name = "Copy Standalone Preferences XML File";
+                       outputPaths = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+                       shellPath = /bin/sh;
+                       shellScript = "SRC=$SRCROOT/OSX/$PRODUCT_NAME-app.xml\nDST=$BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX/Contents/Resources\nNAME=`echo $PRODUCT_NAME.xml | tr A-Z a-z`\ncp -p $SRC $DST/$NAME\nln -sf ../../../$NAME $DST/$PRODUCT_NAME.saver/Contents/Resources/";
+               };
+               AFBFE78917895AAF00432B21 /* Copy Standalone Preferences XML File */ = {
+                       isa = PBXShellScriptBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       inputPaths = (
+                       );
+                       name = "Copy Standalone Preferences XML File";
+                       outputPaths = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+                       shellPath = /bin/sh;
+                       shellScript = "SRC=$SRCROOT/OSX/$PRODUCT_NAME-app.xml\nDST=$BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX/Contents/Resources\nNAME=`echo $PRODUCT_NAME.xml | tr A-Z a-z`\ncp -p $SRC $DST/$NAME\nln -sf ../../../$NAME $DST/$PRODUCT_NAME.saver/Contents/Resources/";
+               };
                AFCCCBB509C033DF00353F4D /* Run Update Info Plist */ = {
                        isa = PBXShellScriptBuildPhase;
                        buildActionMask = 2147483647;
                        shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
                        showEnvVarsInLog = 0;
                };
+               AFDA659D178A52B70070D24B /* Run Update Info Plist */ = {
+                       isa = PBXShellScriptBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       inputPaths = (
+                       );
+                       name = "Run Update Info Plist";
+                       outputPaths = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+                       shellPath = /bin/sh;
+                       shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+                       showEnvVarsInLog = 0;
+               };
                AFE2A4660E2E904600ADB298 /* Run Update Info Plist */ = {
                        isa = PBXShellScriptBuildPhase;
                        buildActionMask = 2147483647;
                        shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
                        showEnvVarsInLog = 0;
                };
+               AFF2868E17860E830050A578 /* Run Update Info Plist */ = {
+                       isa = PBXShellScriptBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       inputPaths = (
+                       );
+                       name = "Run Update Info Plist";
+                       outputPaths = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+                       shellPath = /bin/sh;
+                       shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+                       showEnvVarsInLog = 0;
+               };
                AFF463430C4403E400EE6509 /* Run Update Info Plist */ = {
                        isa = PBXShellScriptBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
                                AF2D4D8613E902F5002AA818 /* SaverRunner.m in Sources */,
                                AF2D4D8713E902F5002AA818 /* main.m in Sources */,
-                               AF78D18C142DD96E002AAF77 /* hilbert.c in Sources */,
-                               AF3581DB1431D5FC00E09C51 /* companion_disc.c in Sources */,
-                               AF3581DE1431D5FC00E09C51 /* companion_heart.c in Sources */,
-                               AF3581E11431D5FC00E09C51 /* companion_quad.c in Sources */,
-                               AF3581E41431D5FC00E09C51 /* companion.c in Sources */,
                                AF84AF1F15829AF000607E4C /* SaverListController.m in Sources */,
+                               AFAA6B461773F30500DE720C /* ios-function-table.m in Sources */,
+                               AFAA6B3B1773926C00DE720C /* phosphor.c in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        files = (
                                AF2D4F7513E91093002AA818 /* SaverRunner.m in Sources */,
                                AF2D4F7613E91093002AA818 /* main.m in Sources */,
-                               AF78D18B142DD96E002AAF77 /* hilbert.c in Sources */,
-                               AF3581DA1431D5FC00E09C51 /* companion_disc.c in Sources */,
-                               AF3581DD1431D5FC00E09C51 /* companion_heart.c in Sources */,
-                               AF3581E01431D5FC00E09C51 /* companion_quad.c in Sources */,
-                               AF3581E31431D5FC00E09C51 /* companion.c in Sources */,
                                AF51FD3515845D1400E5741F /* SaverListController.m in Sources */,
+                               AFAA6B471773F35600DE720C /* ios-function-table.m in Sources */,
+                               AFAA6B2F1773871900DE720C /* analogtv.c in Sources */,
+                               AFAA6B2D1773870700DE720C /* apple2-main.c in Sources */,
+                               AFAA6B2E1773870700DE720C /* apple2.c in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AF7511041782B5B900380EA1 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AF7511151782B64300380EA1 /* kaleidocycle.c in Sources */,
+                               AF7511051782B5B900380EA1 /* XScreenSaverSubclass.m in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AF7776E909B63ABF00EA3033 /* Sources */ = {
                        isa = PBXSourcesBuildPhase;
                        buildActionMask = 2147483647;
                                AF918A0A158FC38A002B5D1E /* flow.c in Sources */,
                                AF918A0C158FC38A002B5D1E /* galaxy.c in Sources */,
                                AF918A0D158FC38A002B5D1E /* grav.c in Sources */,
+                               AFB591C1178B81E600EA4005 /* hexadrop.c in Sources */,
                                AF918A0E158FC38A002B5D1E /* hopalong.c in Sources */,
                                AF918A11158FC38A002B5D1E /* julia.c in Sources */,
                                AF918A16158FC38A002B5D1E /* loop.c in Sources */,
                                AF918A6E158FC417002B5D1E /* jigglypuff.c in Sources */,
                                AF39483E15A164680000FFCD /* jigsaw.c in Sources */,
                                AF918A6F158FC417002B5D1E /* juggler3d.c in Sources */,
+                               AFB8A69D1782BFA6004EDB85 /* kaleidocycle.c in Sources */,
                                AF918A70158FC417002B5D1E /* klein.c in Sources */,
                                AF918A71158FC417002B5D1E /* lament.c in Sources */,
                                AF918A72158FC417002B5D1E /* lavalite.c in Sources */,
                                AF918A82158FC417002B5D1E /* polytopes.c in Sources */,
                                AF918A83158FC417002B5D1E /* providence.c in Sources */,
                                AF918A84158FC417002B5D1E /* pulsar.c in Sources */,
+                               AFF28699178611720050A578 /* quasicrystal.c in Sources */,
                                AF918A85158FC417002B5D1E /* queens.c in Sources */,
                                AF918A86158FC417002B5D1E /* rubik.c in Sources */,
                                AF918A87158FC417002B5D1E /* rubikblocks.c in Sources */,
                                AF9189ED158FC35D002B5D1E /* tronbit_no.c in Sources */,
                                AF9189EE158FC35D002B5D1E /* tronbit_yes.c in Sources */,
                                AF918AB1158FC47B002B5D1E /* tunnel_draw.c in Sources */,
+                               AFDA65A8178A541A0070D24B /* unknownpleasures.c in Sources */,
                                AF918AB2158FC47B002B5D1E /* voronoi.c in Sources */,
                                AF918AB3158FC47B002B5D1E /* whale.c in Sources */,
+                               AFAA6B451773F07800DE720C /* ios-function-table.m in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AFB591AC178B812C00EA4005 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AFB591AE178B812C00EA4005 /* XScreenSaverSubclass.m in Sources */,
+                               AFB591C0178B81E600EA4005 /* hexadrop.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               AFBFE751178642DC00432B21 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AFBFE752178642DC00432B21 /* SaverRunner.m in Sources */,
+                               AFBFE753178642DC00432B21 /* main.m in Sources */,
+                               AFBFE754178642DC00432B21 /* SaverListController.m in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               AFBFE771178647FE00432B21 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AFBFE772178647FE00432B21 /* SaverRunner.m in Sources */,
+                               AFBFE773178647FE00432B21 /* main.m in Sources */,
+                               AFBFE774178647FE00432B21 /* SaverListController.m in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AFD51B210F063B4A00471C02 /* Sources */ = {
                        isa = PBXSourcesBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AFDA6593178A52B70070D24B /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AFDA6595178A52B70070D24B /* XScreenSaverSubclass.m in Sources */,
+                               AFDA65A7178A541A0070D24B /* unknownpleasures.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AFE2A45B0E2E904600ADB298 /* Sources */ = {
                        isa = PBXSourcesBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AFF2868417860E830050A578 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AFF2868617860E830050A578 /* XScreenSaverSubclass.m in Sources */,
+                               AFF28698178611720050A578 /* quasicrystal.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AFF4633B0C4403E400EE6509 /* Sources */ = {
                        isa = PBXSourcesBuildPhase;
                        buildActionMask = 2147483647;
                        target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
                        targetProxy = AF2D4F6C13E91093002AA818 /* PBXContainerItemProxy */;
                };
-               AF2D4F8B13E91108002AA818 /* PBXTargetDependency */ = {
-                       isa = PBXTargetDependency;
-                       target = AF2D4F6A13E91093002AA818 /* Apple2App */;
-                       targetProxy = AF2D4F8A13E91108002AA818 /* PBXContainerItemProxy */;
-               };
-               AF2D4F8D13E9111D002AA818 /* PBXTargetDependency */ = {
-                       isa = PBXTargetDependency;
-                       target = AF2D4D7F13E902F5002AA818 /* PhosphorApp */;
-                       targetProxy = AF2D4F8C13E9111D002AA818 /* PBXContainerItemProxy */;
-               };
                AF2D4F8F13E91127002AA818 /* PBXTargetDependency */ = {
                        isa = PBXTargetDependency;
                        target = AF9D4DEC09B5BB19006E59CF /* Apple2 */;
                        target = AFD570C90996B9F800BA26F7 /* Ant */;
                        targetProxy = AF714E50105613580046AB1D /* PBXContainerItemProxy */;
                };
+               AF7511001782B5B900380EA1 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+                       targetProxy = AF7511011782B5B900380EA1 /* PBXContainerItemProxy */;
+               };
                AF7776E509B63ABF00EA3033 /* PBXTargetDependency */ = {
                        isa = PBXTargetDependency;
                        target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
                        target = AFD571B50996D9DC00BA26F7 /* Juggle */;
                        targetProxy = AFB581AF102F363300342B11 /* PBXContainerItemProxy */;
                };
+               AFB591A8178B812C00EA4005 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+                       targetProxy = AFB591A9178B812C00EA4005 /* PBXContainerItemProxy */;
+               };
+               AFB591C3178B821E00EA4005 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AFB591A7178B812C00EA4005 /* Hexadrop */;
+                       targetProxy = AFB591C2178B821E00EA4005 /* PBXContainerItemProxy */;
+               };
+               AFBFE7401786405E00432B21 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AFF2867F17860E830050A578 /* QuasiCrystal */;
+                       targetProxy = AFBFE73F1786405E00432B21 /* PBXContainerItemProxy */;
+               };
+               AFBFE7421786407000432B21 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AF7510FF1782B5B900380EA1 /* Kaleidocycle */;
+                       targetProxy = AFBFE7411786407000432B21 /* PBXContainerItemProxy */;
+               };
+               AFBFE74C178642DC00432B21 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+                       targetProxy = AFBFE74D178642DC00432B21 /* PBXContainerItemProxy */;
+               };
+               AFBFE7641786438900432B21 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AF9D4DEC09B5BB19006E59CF /* Apple2 */;
+                       targetProxy = AFBFE7631786438900432B21 /* PBXContainerItemProxy */;
+               };
+               AFBFE76A178647FE00432B21 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+                       targetProxy = AFBFE76B178647FE00432B21 /* PBXContainerItemProxy */;
+               };
+               AFBFE7811786482B00432B21 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AF7776E409B63ABF00EA3033 /* Phosphor */;
+                       targetProxy = AFBFE7801786482B00432B21 /* PBXContainerItemProxy */;
+               };
+               AFBFE785178648E600432B21 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AFBFE74B178642DC00432B21 /* Apple2-OSX */;
+                       targetProxy = AFBFE784178648E600432B21 /* PBXContainerItemProxy */;
+               };
+               AFBFE787178648F500432B21 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AFBFE767178647FE00432B21 /* Phosphor-OSX */;
+                       targetProxy = AFBFE786178648F500432B21 /* PBXContainerItemProxy */;
+               };
                AFCAD5F90992DFE00009617A /* PBXTargetDependency */ = {
                        isa = PBXTargetDependency;
                        target = AF9771D60989DC4A001F8B92 /* SaverTester */;
                        target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
                        targetProxy = AFD5735F0997411200BA26F7 /* PBXContainerItemProxy */;
                };
+               AFDA658F178A52B70070D24B /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+                       targetProxy = AFDA6590178A52B70070D24B /* PBXContainerItemProxy */;
+               };
+               AFDA65AA178A54690070D24B /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AFDA658E178A52B70070D24B /* Unknown Pleasures */;
+                       targetProxy = AFDA65A9178A54690070D24B /* PBXContainerItemProxy */;
+               };
                AFE2A4570E2E904600ADB298 /* PBXTargetDependency */ = {
                        isa = PBXTargetDependency;
                        target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
                        target = AFE6A41B0CDD7FAA002805BF /* Abstractile */;
                        targetProxy = AFE6A42F0CDD7FEE002805BF /* PBXContainerItemProxy */;
                };
+               AFF2868017860E830050A578 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+                       targetProxy = AFF2868117860E830050A578 /* PBXContainerItemProxy */;
+               };
                AFF463370C4403E400EE6509 /* PBXTargetDependency */ = {
                        isa = PBXTargetDependency;
                        target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
                AF0839A009930B6B00277BE9 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF0839A109930B6B00277BE9 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF083A46099311D700277BE9 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF083A47099311D700277BE9 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF0DC7BB0C4C73F600D76972 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF0DC7BC0C4C73F600D76972 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF0DCA540C4CBB0D00D76972 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF0DCA550C4CBB0D00D76972 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF137D420F075C9C004DE3B2 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                PRODUCT_NAME = Obsolete;
                        };
                        name = Debug;
                AF137D430F075C9C004DE3B2 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                PRODUCT_NAME = Obsolete;
                        };
                        name = Release;
                AF1A17710D6D6EE3008AF328 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF1A17720D6D6EE3008AF328 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF2D4D8D13E902F5002AA818 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Jamie Zawinski (Y5M82TL69N)";
-                               COMBINE_HIDPI_IMAGES = YES;
-                               DEAD_CODE_STRIPPING = YES;
-                               "DEAD_CODE_STRIPPING[sdk=iphoneos*]" = NO;
-                               "DEAD_CODE_STRIPPING[sdk=iphonesimulator*]" = NO;
-                               "GCC_PREPROCESSOR_DEFINITIONS[sdk=iphoneos*]" = (
-                                       "USE_IPHONE=1",
-                                       "$(inherited)",
-                               );
-                               "GCC_PREPROCESSOR_DEFINITIONS[sdk=iphonesimulator*]" = (
+                               GCC_PREPROCESSOR_DEFINITIONS = (
                                        "USE_IPHONE=1",
+                                       "PHOSPHOR_ONLY=1",
                                        "$(inherited)",
                                );
-                               GCC_SYMBOLS_PRIVATE_EXTERN = NO;
-                               GCC_WARN_UNINITIALIZED_AUTOS = YES;
-                               INFOPLIST_FILE = OSX/SaverRunner.plist;
-                               "INFOPLIST_FILE[sdk=iphoneos*]" = OSX/iSaverRunner.plist;
-                               "INFOPLIST_FILE[sdk=iphonesimulator*]" = OSX/iSaverRunner.plist;
+                               INFOPLIST_FILE = OSX/iSaverRunner.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
-                               IPHONEOS_DEPLOYMENT_TARGET = 5.0;
-                               "OTHER_LDFLAGS[sdk=iphoneos*]" = (
-                                       "-ljwxyz",
-                                       "-framework",
-                                       OpenGLES,
-                                       "-framework",
-                                       Foundation,
-                                       "-framework",
-                                       UIKit,
-                                       "-framework",
-                                       CoreGraphics,
-                                       "-framework",
-                                       QuartzCore,
-                               );
-                               "OTHER_LDFLAGS[sdk=iphonesimulator*]" = (
-                                       "-ljwxyz",
-                                       "-framework",
-                                       OpenGLES,
-                                       "-framework",
-                                       Foundation,
-                                       "-framework",
-                                       UIKit,
-                                       "-framework",
-                                       CoreGraphics,
-                                       "-framework",
-                                       QuartzCore,
-                               );
                                PRODUCT_NAME = Phosphor;
-                               "PROVISIONING_PROFILE[sdk=iphoneos*]" = "AC8EDA6B-E061-4508-B2BA-129DD6D2AF72";
-                               TARGETED_DEVICE_FAMILY = "1,2";
+                               SDKROOT = iphoneos;
                                WRAPPER_EXTENSION = app;
                        };
                        name = Debug;
                AF2D4D8E13E902F5002AA818 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Jamie Zawinski (Y5M82TL69N)";
-                               COMBINE_HIDPI_IMAGES = YES;
-                               COPY_PHASE_STRIP = YES;
-                               DEAD_CODE_STRIPPING = YES;
-                               "DEAD_CODE_STRIPPING[sdk=iphoneos*]" = NO;
-                               "DEAD_CODE_STRIPPING[sdk=iphonesimulator*]" = NO;
-                               "GCC_PREPROCESSOR_DEFINITIONS[sdk=iphoneos*]" = (
-                                       "USE_IPHONE=1",
-                                       "$(inherited)",
-                               );
-                               "GCC_PREPROCESSOR_DEFINITIONS[sdk=iphonesimulator*]" = (
+                               GCC_PREPROCESSOR_DEFINITIONS = (
                                        "USE_IPHONE=1",
+                                       "PHOSPHOR_ONLY=1",
                                        "$(inherited)",
                                );
-                               GCC_WARN_UNINITIALIZED_AUTOS = YES;
-                               INFOPLIST_FILE = OSX/SaverRunner.plist;
-                               "INFOPLIST_FILE[sdk=iphoneos*]" = OSX/iSaverRunner.plist;
-                               "INFOPLIST_FILE[sdk=iphonesimulator*]" = OSX/iSaverRunner.plist;
+                               INFOPLIST_FILE = OSX/iSaverRunner.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
-                               IPHONEOS_DEPLOYMENT_TARGET = 5.0;
-                               "OTHER_LDFLAGS[sdk=iphoneos*]" = (
-                                       "-ljwxyz",
-                                       "-framework",
-                                       OpenGLES,
-                                       "-framework",
-                                       Foundation,
-                                       "-framework",
-                                       UIKit,
-                                       "-framework",
-                                       CoreGraphics,
-                                       "-framework",
-                                       QuartzCore,
-                               );
-                               "OTHER_LDFLAGS[sdk=iphonesimulator*]" = (
-                                       "-ljwxyz",
-                                       "-framework",
-                                       OpenGLES,
-                                       "-framework",
-                                       Foundation,
-                                       "-framework",
-                                       UIKit,
-                                       "-framework",
-                                       CoreGraphics,
-                                       "-framework",
-                                       QuartzCore,
-                               );
                                PRODUCT_NAME = Phosphor;
-                               "PROVISIONING_PROFILE[sdk=iphoneos*]" = "AC8EDA6B-E061-4508-B2BA-129DD6D2AF72";
-                               TARGETED_DEVICE_FAMILY = "1,2";
-                               VALIDATE_PRODUCT = YES;
+                               SDKROOT = iphoneos;
                                WRAPPER_EXTENSION = app;
                        };
                        name = Release;
                AF2D4F7C13E91093002AA818 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Jamie Zawinski (Y5M82TL69N)";
-                               COMBINE_HIDPI_IMAGES = YES;
-                               DEAD_CODE_STRIPPING = YES;
-                               "DEAD_CODE_STRIPPING[sdk=iphoneos*]" = NO;
-                               "DEAD_CODE_STRIPPING[sdk=iphonesimulator*]" = NO;
-                               "GCC_PREPROCESSOR_DEFINITIONS[sdk=iphoneos*]" = (
-                                       "USE_IPHONE=1",
-                                       "$(inherited)",
-                               );
-                               "GCC_PREPROCESSOR_DEFINITIONS[sdk=iphonesimulator*]" = (
+                               GCC_PREPROCESSOR_DEFINITIONS = (
                                        "USE_IPHONE=1",
+                                       "APPLE2_ONLY=1",
                                        "$(inherited)",
                                );
-                               GCC_SYMBOLS_PRIVATE_EXTERN = NO;
-                               GCC_WARN_UNINITIALIZED_AUTOS = YES;
-                               INFOPLIST_FILE = OSX/SaverRunner.plist;
-                               "INFOPLIST_FILE[sdk=iphoneos*]" = OSX/iSaverRunner.plist;
-                               "INFOPLIST_FILE[sdk=iphonesimulator*]" = OSX/iSaverRunner.plist;
+                               INFOPLIST_FILE = OSX/iSaverRunner.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
-                               IPHONEOS_DEPLOYMENT_TARGET = 5.0;
-                               "OTHER_LDFLAGS[sdk=iphoneos*]" = (
-                                       "-ljwxyz",
-                                       "-framework",
-                                       OpenGLES,
-                                       "-framework",
-                                       Foundation,
-                                       "-framework",
-                                       UIKit,
-                                       "-framework",
-                                       CoreGraphics,
-                                       "-framework",
-                                       QuartzCore,
-                               );
-                               "OTHER_LDFLAGS[sdk=iphonesimulator*]" = (
-                                       "-ljwxyz",
-                                       "-framework",
-                                       OpenGLES,
-                                       "-framework",
-                                       Foundation,
-                                       "-framework",
-                                       UIKit,
-                                       "-framework",
-                                       CoreGraphics,
-                                       "-framework",
-                                       QuartzCore,
-                               );
                                PRODUCT_NAME = Apple2;
-                               "PROVISIONING_PROFILE[sdk=iphoneos*]" = "AC8EDA6B-E061-4508-B2BA-129DD6D2AF72";
-                               TARGETED_DEVICE_FAMILY = "1,2";
+                               SDKROOT = iphoneos;
                                WRAPPER_EXTENSION = app;
                        };
                        name = Debug;
                AF2D4F7D13E91093002AA818 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Jamie Zawinski (Y5M82TL69N)";
-                               COMBINE_HIDPI_IMAGES = YES;
-                               COPY_PHASE_STRIP = YES;
-                               DEAD_CODE_STRIPPING = YES;
-                               "DEAD_CODE_STRIPPING[sdk=iphoneos*]" = NO;
-                               "DEAD_CODE_STRIPPING[sdk=iphonesimulator*]" = NO;
-                               "GCC_PREPROCESSOR_DEFINITIONS[sdk=iphoneos*]" = (
-                                       "USE_IPHONE=1",
-                                       "$(inherited)",
-                               );
-                               "GCC_PREPROCESSOR_DEFINITIONS[sdk=iphonesimulator*]" = (
+                               GCC_PREPROCESSOR_DEFINITIONS = (
                                        "USE_IPHONE=1",
+                                       "APPLE2_ONLY=1",
                                        "$(inherited)",
                                );
-                               GCC_WARN_UNINITIALIZED_AUTOS = YES;
-                               INFOPLIST_FILE = OSX/SaverRunner.plist;
-                               "INFOPLIST_FILE[sdk=iphoneos*]" = OSX/iSaverRunner.plist;
-                               "INFOPLIST_FILE[sdk=iphonesimulator*]" = OSX/iSaverRunner.plist;
+                               INFOPLIST_FILE = OSX/iSaverRunner.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
-                               IPHONEOS_DEPLOYMENT_TARGET = 5.0;
-                               "OTHER_LDFLAGS[sdk=iphoneos*]" = (
-                                       "-ljwxyz",
-                                       "-framework",
-                                       OpenGLES,
-                                       "-framework",
-                                       Foundation,
-                                       "-framework",
-                                       UIKit,
-                                       "-framework",
-                                       CoreGraphics,
-                                       "-framework",
-                                       QuartzCore,
-                               );
-                               "OTHER_LDFLAGS[sdk=iphonesimulator*]" = (
-                                       "-ljwxyz",
-                                       "-framework",
-                                       OpenGLES,
-                                       "-framework",
-                                       Foundation,
-                                       "-framework",
-                                       UIKit,
-                                       "-framework",
-                                       CoreGraphics,
-                                       "-framework",
-                                       QuartzCore,
-                               );
                                PRODUCT_NAME = Apple2;
-                               "PROVISIONING_PROFILE[sdk=iphoneos*]" = "AC8EDA6B-E061-4508-B2BA-129DD6D2AF72";
-                               TARGETED_DEVICE_FAMILY = "1,2";
-                               VALIDATE_PRODUCT = YES;
+                               SDKROOT = iphoneos;
                                WRAPPER_EXTENSION = app;
                        };
                        name = Release;
                AF32D9F20F3AD0B40080F535 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF32D9F30F3AD0B40080F535 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF3581D31431D47B00E09C51 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF3581D41431D47B00E09C51 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF358214143330F900E09C51 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF358215143330F900E09C51 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF35E89E0E63823600691F2F /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF35E89F0E63823600691F2F /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF3C71570D624BF50030CC0D /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF3C71580D624BF50030CC0D /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF476FC4099D154F001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF476FC5099D154F001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF476FE9099D1686001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF476FEA099D1686001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF47705A099D4385001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF47705B099D4385001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477177099D4786001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477178099D4786001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF47718D099D4803001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF47718E099D4803001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF4771B5099D4949001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF4771B6099D4949001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF4771E9099D4D9A001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF4771EA099D4D9A001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477200099D4E63001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477201099D4E63001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477216099D4EE8001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477217099D4EE8001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF47722C099D4F67001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
-                               GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                        };
                        name = Debug;
                };
                AF47722D099D4F67001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
-                               GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                        };
                        name = Release;
                };
                AF477261099D5717001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477262099D5717001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477279099D57B9001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF47727A099D57B9001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477291099D5926001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477292099D5926001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477390099D65A1001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477391099D65A1001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF4773A8099D6648001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF4773A9099D6648001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF4773CF099D67B9001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF4773D0099D67B9001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477410099D69E7001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477411099D69E7001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477435099D7C70001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477436099D7C70001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477450099D7D33001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477451099D7D33001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477491099D89E4001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477492099D89E4001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF4774A7099D8A74001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF4774A8099D8A74001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF4774C2099D8B5F001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF4774C3099D8B5F001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF4774DC099D8BFF001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF4774DD099D8BFF001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF47756B099D9A1A001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF47756C099D9A1A001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477591099D9C28001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477592099D9C28001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF4775AD099D9CF7001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF4775AE099D9CF7001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF4775E6099D9F69001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF4775E7099D9F69001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477600099DA030001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477601099DA030001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477621099DA26C001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477622099DA26C001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477652099DA6D0001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477653099DA6D0001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477668099DA78E001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477669099DA78E001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF47767E099DA849001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF47767F099DA849001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF47769D099DAA6F001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF47769E099DAA6F001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF4776B8099DABDD001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF4776B9099DABDD001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF4776CE099DAC8A001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF4776CF099DAC8A001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF4776E9099DADDF001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF4776EA099DADDF001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF4776FF099DAE7A001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477700099DAE7A001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF47771B099DAF9F001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF47771C099DAF9F001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477731099DB044001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477732099DB044001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477760099DB61E001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477761099DB61E001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477782099DB965001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477783099DB965001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF47779E099DBA90001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF47779F099DBA90001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF4777DF099DC183001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF4777E0099DC183001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF4778B9099DDB79001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF4778BA099DDB79001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF4778D5099DDCAE001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF4778D6099DDCAE001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF4778F6099DDDC8001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF4778F7099DDDC8001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477917099DE379001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477918099DE379001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF477938099DE4C7001F091E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF477939099DE4C7001F091E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF4808C3098C3B8B00FB32B8 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               ARCHS = (
-                                       "$(ARCHS_STANDARD_32_64_BIT)",
-                                       armv6,
-                                       armv7,
-                               );
-                               COMBINE_HIDPI_IMAGES = YES;
                                INSTALL_PATH = /usr/local/lib;
-                               SDKROOT = macosx;
-                               "SDKROOT[arch=armv6]" = iphoneos;
-                               "SDKROOT[arch=armv7]" = iphoneos;
                                SKIP_INSTALL = YES;
                                SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos";
-                               VALID_ARCHS = "i386 x86_64 armv7 armv7s";
+                               VALID_ARCHS = "i386 x86_64 armv6 armv7 armv7s";
                        };
                        name = Debug;
                };
                AF4808C4098C3B8B00FB32B8 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               ARCHS = (
-                                       "$(ARCHS_STANDARD_32_64_BIT)",
-                                       armv6,
-                                       armv7,
-                               );
-                               COMBINE_HIDPI_IMAGES = YES;
                                INSTALL_PATH = /usr/local/lib;
-                               SDKROOT = macosx;
-                               "SDKROOT[arch=armv6]" = iphoneos;
-                               "SDKROOT[arch=armv7]" = iphoneos;
                                SKIP_INSTALL = YES;
                                SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos";
-                               VALID_ARCHS = "i386 x86_64 armv7 armv7s";
+                               VALID_ARCHS = "i386 x86_64 armv6 armv7 armv7s";
                        };
                        name = Release;
                };
                AF480ABB098C66E300FB32B8 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                PRODUCT_NAME = "All Savers (XScreenSaver)";
                        };
                        name = Debug;
                AF480ABC098C66E300FB32B8 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                PRODUCT_NAME = "All Savers (XScreenSaver)";
                        };
                        name = Release;
                AF480C56098E301400FB32B8 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF480C57098E301400FB32B8 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF480D65098EED6E00FB32B8 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                PRODUCT_NAME = "All Savers (XLockmore)";
                        };
                        name = Debug;
                AF480D66098EED6E00FB32B8 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                PRODUCT_NAME = "All Savers (XLockmore)";
                        };
                        name = Release;
                AF480D68098EED6E00FB32B8 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                PRODUCT_NAME = "All Savers (OpenGL)";
                        };
                        name = Debug;
                AF480D69098EED6E00FB32B8 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                PRODUCT_NAME = "All Savers (OpenGL)";
                        };
                        name = Release;
                AF480D6B098EED6E00FB32B8 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                PRODUCT_NAME = "All Savers";
                        };
                        name = Debug;
                AF480D6C098EED6E00FB32B8 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                PRODUCT_NAME = "All Savers";
                        };
                        name = Release;
                AF480D7F098EEDDE00FB32B8 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF480D80098EEDDE00FB32B8 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF4810F909909FBA00FB32B8 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
-                               GCC_PREPROCESSOR_DEFINITIONS = (
-                                       "HAVE_COCOA=1",
-                                       "GETTIMEOFDAY_TWO_ARGS=1",
-                                       "HAVE_UNISTD_H=1",
-                                       "STANDALONE=1",
-                                       "HAVE_GLBINDTEXTURE=1",
-                                       "HAVE_UNAME=1",
-                                       "HAVE_ICMP=1",
-                                       "HAVE_FORKPTY=1",
-                                       "HAVE_UTIL_H=1",
-                                       "$(GCC_PREPROCESSOR_DEFINITIONS)",
-                               );
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF4810FA09909FBA00FB32B8 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
-                               GCC_PREPROCESSOR_DEFINITIONS = (
-                                       "HAVE_COCOA=1",
-                                       "GETTIMEOFDAY_TWO_ARGS=1",
-                                       "HAVE_UNISTD_H=1",
-                                       "STANDALONE=1",
-                                       "HAVE_GLBINDTEXTURE=1",
-                                       "HAVE_UNAME=1",
-                                       "HAVE_ICMP=1",
-                                       "HAVE_FORKPTY=1",
-                                       "HAVE_UTIL_H=1",
-                                       "$(GCC_PREPROCESSOR_DEFINITIONS)",
-                               );
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF4812620990CE2700FB32B8 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF4812630990CE2700FB32B8 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF4812C40990D3D900FB32B8 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF4812C50990D3D900FB32B8 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF48DF010A0C25E000F94CF9 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF48DF020A0C25E000F94CF9 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF4A345B102A593600A81B2A /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF4A345C102A593600A81B2A /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF4FD6F80CE7A486005EE58E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF4FD6F90CE7A486005EE58E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF4FF4950D52CA0800666F98 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                PRODUCT_NAME = m6502.h;
                        };
                        name = Debug;
                AF4FF4960D52CA0800666F98 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                PRODUCT_NAME = m6502.h;
                        };
                        name = Release;
                AF4FF4CC0D52CBDE00666F98 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF4FF4CD0D52CBDE00666F98 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF642403099FF9C2000F4CD4 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF642404099FF9C2000F4CD4 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF6425DA09A18855000F4CD4 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF6425DB09A18855000F4CD4 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF6425FA09A189EC000F4CD4 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF6425FB09A189EC000F4CD4 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF64261D09A18D6C000F4CD4 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF64261E09A18D6C000F4CD4 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF64263A09A18F54000F4CD4 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF64263B09A18F54000F4CD4 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF64265D09A19229000F4CD4 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF64265E09A19229000F4CD4 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF64268909A194B0000F4CD4 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF64268A09A194B0000F4CD4 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF64277F09A1D37A000F4CD4 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF64278009A1D37A000F4CD4 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF6427B609A2DE36000F4CD4 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF6427B709A2DE36000F4CD4 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
+                       };
+                       name = Release;
+               };
+               AF7511101782B5B900380EA1 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+                                       "USE_GL=1",
+                                       "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+                               );
+                               "OTHER_LDFLAGS[sdk=macosx*]" = (
+                                       "-ljwxyz",
+                                       "-framework",
+                                       ScreenSaver,
+                                       "-framework",
+                                       Cocoa,
+                                       "-framework",
+                                       Carbon,
+                                       "-framework",
+                                       AGL,
+                                       "-framework",
+                                       OpenGL,
+                               );
+                               PRODUCT_NAME = Kaleidocycle;
+                       };
+                       name = Debug;
+               };
+               AF7511111782B5B900380EA1 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+                                       "USE_GL=1",
+                                       "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+                               );
+                               "OTHER_LDFLAGS[sdk=macosx*]" = (
+                                       "-ljwxyz",
+                                       "-framework",
+                                       ScreenSaver,
+                                       "-framework",
+                                       Cocoa,
+                                       "-framework",
+                                       Carbon,
+                                       "-framework",
+                                       AGL,
+                                       "-framework",
+                                       OpenGL,
+                               );
+                               PRODUCT_NAME = Kaleidocycle;
                        };
                        name = Release;
                };
                AF7776F409B63ABF00EA3033 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF7776F509B63ABF00EA3033 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF77772809B6416100EA3033 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF77772909B6416100EA3033 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF77774F09B6446500EA3033 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF77775009B6446500EA3033 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF77778609B6497800EA3033 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF77778709B6497800EA3033 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF7777A009B64A5200EA3033 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF7777A109B64A5200EA3033 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF7777BA09B64B2600EA3033 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF7777BB09B64B2600EA3033 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF7777E209B64C6B00EA3033 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF7777E309B64C6B00EA3033 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF7777FC09B64E3100EA3033 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF7777FD09B64E3100EA3033 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF77782309B6504400EA3033 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF77782409B6504400EA3033 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF77785609B6528100EA3033 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF77785709B6528100EA3033 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF77787209B6536000EA3033 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF77787309B6536000EA3033 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF77788D09B6563500EA3033 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF77788E09B6563500EA3033 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF7778B309B659C800EA3033 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF7778B409B659C800EA3033 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF78D187142DD8F3002AAF77 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF78D188142DD8F3002AAF77 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF794F72099748450059A8B0 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF794F73099748450059A8B0 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF794F9C09974A320059A8B0 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF794F9D09974A320059A8B0 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF794FDB09974FA60059A8B0 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF794FDC09974FA60059A8B0 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF91898D158FC00A002B5D1E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               ALWAYS_SEARCH_USER_PATHS = NO;
-                               ARCHS = "$(ARCHS_STANDARD_32_BIT)";
-                               CODE_SIGN_IDENTITY = "iPhone Developer";
-                               FRAMEWORK_SEARCH_PATHS = (
-                                       "$(inherited)",
-                                       "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"",
-                               );
+                               BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}";
                                GCC_PREPROCESSOR_DEFINITIONS = (
                                        "USE_IPHONE=1",
                                        "$(inherited)",
                                );
-                               GCC_SYMBOLS_PRIVATE_EXTERN = NO;
-                               GCC_THUMB_SUPPORT = NO;
                                INFOPLIST_FILE = OSX/iSaverRunner.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
-                               IPHONEOS_DEPLOYMENT_TARGET = 4.3;
                                PRODUCT_NAME = XScreenSaver;
-                               PROVISIONING_PROFILE = "";
                                SDKROOT = iphoneos;
-                               "SDKROOT[arch=*]" = iphoneos;
-                               TARGETED_DEVICE_FAMILY = "1,2";
                                WRAPPER_EXTENSION = app;
                        };
                        name = Debug;
                AF91898E158FC00A002B5D1E /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               ALWAYS_SEARCH_USER_PATHS = NO;
-                               ARCHS = "$(ARCHS_STANDARD_32_BIT)";
-                               CODE_SIGN_IDENTITY = "iPhone Distribution: Jamie Zawinski";
-                               FRAMEWORK_SEARCH_PATHS = (
-                                       "$(inherited)",
-                                       "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"",
-                               );
+                               BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}";
                                GCC_PREPROCESSOR_DEFINITIONS = (
                                        "USE_IPHONE=1",
                                        "$(inherited)",
                                );
-                               GCC_THUMB_SUPPORT = NO;
                                INFOPLIST_FILE = OSX/iSaverRunner.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
-                               IPHONEOS_DEPLOYMENT_TARGET = 4.3;
                                PRODUCT_NAME = XScreenSaver;
-                               PROVISIONING_PROFILE = "6713E214-60AD-43CF-AFD3-825AEB87AA75";
                                SDKROOT = iphoneos;
-                               TARGETED_DEVICE_FAMILY = "1,2";
-                               VALIDATE_PRODUCT = YES;
                                WRAPPER_EXTENSION = app;
                        };
                        name = Release;
                AF97573B099C317000B05160 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF97573C099C317000B05160 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF975783099C374A00B05160 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF975784099C374A00B05160 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF9757D0099C3E6300B05160 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF9757D1099C3E6300B05160 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF975816099C41D500B05160 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF975817099C41D500B05160 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF975873099C475900B05160 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF975874099C475900B05160 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF975A44099C681F00B05160 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF975A45099C681F00B05160 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF975A7A099C6AB200B05160 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF975A7B099C6AB200B05160 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF975A94099C6BC300B05160 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF975A95099C6BC300B05160 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF975AE5099C6EB100B05160 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF975AE6099C6EB100B05160 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF975B0A099C6FE400B05160 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF975B0B099C6FE400B05160 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF975C20099C8C1500B05160 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF975C21099C8C1500B05160 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF975C4C099C8DCF00B05160 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF975C4D099C8DCF00B05160 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF975C6C099C8F3F00B05160 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF975C6D099C8F3F00B05160 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF975D61099CA0F000B05160 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF975D62099CA0F000B05160 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF976FBF0989CAA4001F8B92 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF976FC00989CAA4001F8B92 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF97703E0989D1E6001F8B92 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF97703F0989D1E6001F8B92 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF97707B0989D2F6001F8B92 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF97707C0989D2F6001F8B92 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF9771DB0989DC4B001F8B92 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                INFOPLIST_FILE = OSX/SaverRunner.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
                                WRAPPER_EXTENSION = app;
                AF9771DC0989DC4B001F8B92 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                INFOPLIST_FILE = OSX/SaverRunner.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
                                WRAPPER_EXTENSION = app;
                AF998EEC0A083DB30051049D /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF998EED0A083DB30051049D /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AF9D467409B5109C006E59CF /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF9D467509B5109C006E59CF /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF9D475209B5300A006E59CF /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF9D475309B5300A006E59CF /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF9D476D09B53166006E59CF /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF9D476E09B53166006E59CF /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF9D48E909B53322006E59CF /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF9D48EA09B53322006E59CF /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF9D490209B535DA006E59CF /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF9D490309B535DA006E59CF /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF9D493909B53CBA006E59CF /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF9D493A09B53CBA006E59CF /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF9D496209B53FC9006E59CF /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF9D496309B53FC9006E59CF /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF9D497A09B5411D006E59CF /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF9D497B09B5411D006E59CF /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF9D49A509B544C2006E59CF /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF9D49A609B544C2006E59CF /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF9D4C7709B59F27006E59CF /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF9D4C7809B59F27006E59CF /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF9D4CF509B5AA8E006E59CF /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF9D4CF609B5AA8E006E59CF /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF9D4D8D09B5B2DC006E59CF /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF9D4D8E09B5B2DC006E59CF /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF9D4DBE09B5B71E006E59CF /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF9D4DBF09B5B71E006E59CF /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AF9D4DFC09B5BB19006E59CF /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AF9D4DFD09B5BB19006E59CF /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFA3393E0B058505002B0E7D /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFA3393F0B058505002B0E7D /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFA33C080B058E67002B0E7D /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                PRODUCT_NAME = webcollage;
                        };
                        name = Debug;
                AFA33C090B058E67002B0E7D /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                PRODUCT_NAME = webcollage;
                        };
                        name = Release;
                AFA55958099330B000F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55959099330B000F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5597D0993317900F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5597E0993317900F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA559A20993322100F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA559A30993322100F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA559C50993328000F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA559C60993328000F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA559DF0993330600F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA559E00993330600F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55A130993340300F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55A140993340300F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55A30099334A000F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55A31099334A000F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55A890993364300F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55A8A0993364300F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55ADF09933CEF00F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55AE009933CEF00F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55B1C09933E0500F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55B1D09933E0500F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55B3509933E8D00F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55B3609933E8D00F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55B8909933F7200F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55B8A09933F7200F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55BA109933FDA00F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55BA209933FDA00F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55BBB099340CE00F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55BBC099340CE00F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55BF40993429100F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55BF50993429100F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55C1E0993431300F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55C1F0993431300F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55C87099349A600F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55C88099349A600F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55CB909934BB200F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55CBA09934BB200F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55CDC09934CE400F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55CDD09934CE400F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55D4C0993565300F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55D4D0993565300F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55D720993584B00F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55D730993584B00F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55D8F099358C400F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55D90099358C400F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55DD809935D7000F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55DD909935D7000F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55E0109935E4900F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55E0209935E4900F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55E1D09935EDC00F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55E1E09935EDC00F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55E4009935F8E00F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55E4109935F8E00F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55E5E09935FF900F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55E5F09935FF900F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55EE1099360E300F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55EE2099360E300F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55F1C099361B700F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55F1D099361B700F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55F3A0993622F00F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55F3B0993622F00F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55F520993629000F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55F530993629000F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55F820993643600F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55F830993643600F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55FE309936BFA00F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA55FE409936BFA00F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5600909936C6D00F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5600A09936C6D00F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5602409936CC800F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5602509936CC800F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5604209936D5100F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5604309936D5100F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5605A09936E2100F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5605B09936E2100F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5607209936F3800F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5607309936F3800F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA560BE0993718D00F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA560BF0993718D00F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5610D0993781600F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5610E0993781600F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5611B099378EA00F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                PRODUCT_NAME = molecules.h;
                        };
                        name = Debug;
                AFA5611C099378EA00F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                PRODUCT_NAME = molecules.h;
                        };
                        name = Release;
                AFA5616809937C0D00F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5616909937C0D00F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5618B09937CF100F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5618C09937CF100F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA561AD09937D7E00F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA561AE09937D7E00F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA562170993849F00F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA562180993849F00F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5622F0993852500F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA562300993852500F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA562CF099392C600F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA562D0099392C600F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA562EA099393C900F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA562EB099393C900F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA563020993943B00F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA563030993943B00F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA563240993951000F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA563250993951000F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA56341099395ED00F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA56342099395ED00F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA56361099396C000F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA56362099396C000F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA56389099397B300F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA5638A099397B300F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA563B4099398BB00F3E977 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFA563B5099398BB00F3E977 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                        };
                        name = Release;
                };
+               AFB591B8178B812C00EA4005 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               PRODUCT_NAME = Hexadrop;
+                       };
+                       name = Debug;
+               };
+               AFB591B9178B812C00EA4005 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               PRODUCT_NAME = Hexadrop;
+                       };
+                       name = Release;
+               };
+               AFBFE75C178642DC00432B21 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               INFOPLIST_FILE = OSX/SaverRunner.plist;
+                               INSTALL_PATH = "$(HOME)/Applications";
+                               "OTHER_CFLAGS[sdk=macosx*]" = "";
+                               PRODUCT_NAME = Apple2;
+                               WRAPPER_EXTENSION = app;
+                       };
+                       name = Debug;
+               };
+               AFBFE75D178642DC00432B21 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               INFOPLIST_FILE = OSX/SaverRunner.plist;
+                               INSTALL_PATH = "$(HOME)/Applications";
+                               "OTHER_CFLAGS[sdk=macosx*]" = "";
+                               PRODUCT_NAME = Apple2;
+                               WRAPPER_EXTENSION = app;
+                       };
+                       name = Release;
+               };
+               AFBFE77C178647FE00432B21 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               INFOPLIST_FILE = OSX/SaverRunner.plist;
+                               INSTALL_PATH = "$(HOME)/Applications";
+                               "OTHER_CFLAGS[sdk=macosx*]" = "";
+                               PRODUCT_NAME = Phosphor;
+                               WRAPPER_EXTENSION = app;
+                       };
+                       name = Debug;
+               };
+               AFBFE77D178647FE00432B21 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               INFOPLIST_FILE = OSX/SaverRunner.plist;
+                               INSTALL_PATH = "$(HOME)/Applications";
+                               "OTHER_CFLAGS[sdk=macosx*]" = "";
+                               PRODUCT_NAME = Phosphor;
+                               WRAPPER_EXTENSION = app;
+                       };
+                       name = Release;
+               };
                AFD51B2E0F063B4A00471C02 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFD51B2F0F063B4A00471C02 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFD56E020996A03800BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFD56E030996A03800BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFD56EBC0996A72600BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD56EBD0996A72600BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD56EE80996A95700BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD56EE90996A95700BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD56F190996AAFA00BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD56F1A0996AAFA00BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD56F310996AB8A00BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD56F320996AB8A00BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD56F5D0996AEEE00BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD56F5E0996AEEE00BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD56F790996B01600BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD56F7A0996B01600BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD56F9A0996B09400BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD56F9B0996B09400BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD56FB10996B10F00BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD56FB20996B10F00BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD56FC70996B18F00BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD56FC80996B18F00BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD56FDD0996B20900BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD56FDE0996B20900BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD570060996B43800BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD570070996B43800BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD5701D0996B4CC00BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD5701E0996B4CC00BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD570340996B56D00BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD570350996B56D00BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD570510996B61600BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD570520996B61600BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD570670996B6A300BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD570680996B6A300BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD5707D0996B72700BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD5707E0996B72700BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD570930996B80300BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD570940996B80300BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD570A90996B88E00BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD570AA0996B88E00BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD570BF0996B93000BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD570C00996B93000BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD570D70996B9F800BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD570D80996B9F800BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD570F80996BBBF00BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD570F90996BBBF00BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD571210996BE9300BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD571220996BE9300BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD5713A0996BF2E00BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD5713B0996BF2E00BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD571510996C01700BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD571520996C01700BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD571670996C0CE00BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD571680996C0CE00BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD571C30996D9DC00BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD571C40996D9DC00BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD572300996E4A300BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD572310996E4A300BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD5727B0996EE8500BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD5727C0996EE8500BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD572B30996F99600BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD572B40996F99600BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD572D00996FC0F00BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD572D10996FC0F00BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD57307099701C000BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD57308099701C000BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFD5736B0997411200BA26F7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFD5736C0997411200BA26F7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
+                       };
+                       name = Release;
+               };
+               AFDA659F178A52B70070D24B /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+                                       "USE_GL=1",
+                                       "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+                               );
+                               "OTHER_LDFLAGS[sdk=macosx*]" = (
+                                       "-ljwxyz",
+                                       "-framework",
+                                       ScreenSaver,
+                                       "-framework",
+                                       Cocoa,
+                                       "-framework",
+                                       Carbon,
+                                       "-framework",
+                                       AGL,
+                                       "-framework",
+                                       OpenGL,
+                               );
+                               PRODUCT_NAME = UnknownPleasures;
+                       };
+                       name = Debug;
+               };
+               AFDA65A0178A52B70070D24B /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+                                       "USE_GL=1",
+                                       "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+                               );
+                               "OTHER_LDFLAGS[sdk=macosx*]" = (
+                                       "-ljwxyz",
+                                       "-framework",
+                                       ScreenSaver,
+                                       "-framework",
+                                       Cocoa,
+                                       "-framework",
+                                       Carbon,
+                                       "-framework",
+                                       AGL,
+                                       "-framework",
+                                       OpenGL,
+                               );
+                               PRODUCT_NAME = UnknownPleasures;
                        };
                        name = Release;
                };
                AFE2A4680E2E904600ADB298 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFE2A4690E2E904600ADB298 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFE30BFA0E52B14700CCF4A5 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFE30BFB0E52B14700CCF4A5 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFE6A1950CDD7B2E002805BF /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFE6A1960CDD7B2E002805BF /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFE6A42B0CDD7FAA002805BF /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFE6A42C0CDD7FAA002805BF /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
+                       };
+                       name = Release;
+               };
+               AFF2869017860E830050A578 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+                                       "USE_GL=1",
+                                       "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+                               );
+                               "OTHER_LDFLAGS[sdk=macosx*]" = (
+                                       "-ljwxyz",
+                                       "-framework",
+                                       ScreenSaver,
+                                       "-framework",
+                                       Cocoa,
+                                       "-framework",
+                                       Carbon,
+                                       "-framework",
+                                       AGL,
+                                       "-framework",
+                                       OpenGL,
+                               );
+                               PRODUCT_NAME = QuasiCrystal;
+                       };
+                       name = Debug;
+               };
+               AFF2869117860E830050A578 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+                                       "USE_GL=1",
+                                       "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+                               );
+                               "OTHER_LDFLAGS[sdk=macosx*]" = (
+                                       "-ljwxyz",
+                                       "-framework",
+                                       ScreenSaver,
+                                       "-framework",
+                                       Cocoa,
+                                       "-framework",
+                                       Carbon,
+                                       "-framework",
+                                       AGL,
+                                       "-framework",
+                                       OpenGL,
+                               );
+                               PRODUCT_NAME = QuasiCrystal;
                        };
                        name = Release;
                };
                AFF463450C4403E400EE6509 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Debug;
                };
                AFF463460C4403E400EE6509 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                        };
                        name = Release;
                };
                AFF4636A0C440AEF00EE6509 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                AFF4636B0C440AEF00EE6509 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                        "USE_GL=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                        isa = XCBuildConfiguration;
                        buildSettings = {
                                ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
-                               GCC_ENABLE_OBJC_GC = supported;
-                               "GCC_ENABLE_OBJC_GC[sdk=iphoneos*][arch=*]" = unsupported;
-                               "GCC_ENABLE_OBJC_GC[sdk=iphonesimulator*][arch=*]" = unsupported;
+                               BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.${PRODUCT_NAME:rfc1034identifier}";
+                               "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+                               "CODE_SIGN_IDENTITY[sdk=iphonesimulator*]" = "iPhone Developer";
+                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_OPTIMIZATION_LEVEL = 0;
                                GCC_PRECOMPILE_PREFIX_HEADER = YES;
                                GCC_PREFIX_HEADER = OSX/xscreensaver_Prefix.pch;
                                        "CLASS=XScreenSaver${EXECUTABLE_NAME}View",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
                                );
+                               GCC_SYMBOLS_PRIVATE_EXTERN = NO;
                                GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
                                GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
                                GCC_WARN_ABOUT_RETURN_TYPE = YES;
                                GCC_WARN_MISSING_PARENTHESES = YES;
                                GCC_WARN_SHADOW = NO;
                                GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
+                               GCC_WARN_UNINITIALIZED_AUTOS = YES;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_LABEL = YES;
                                GCC_WARN_UNUSED_VALUE = YES;
                                );
                                INFOPLIST_FILE = OSX/XScreenSaver.plist;
                                INSTALL_PATH = "$(HOME)/Library/Screen Savers";
-                               MACOSX_DEPLOYMENT_TARGET = 10.5;
-                               "MACOSX_DEPLOYMENT_TARGET[sdk=iphoneos*][arch=*]" = "";
-                               "MACOSX_DEPLOYMENT_TARGET[sdk=iphonesimulator*][arch=*]" = "";
+                               IPHONEOS_DEPLOYMENT_TARGET = 4.3;
+                               LIBRARY_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)";
+                               MACOSX_DEPLOYMENT_TARGET = 10.4;
+                               "OTHER_CFLAGS[sdk=macosx*]" = "-fobjc-gc";
                                PRODUCT_NAME = "$(TARGET_NAME)";
                                SDKROOT = macosx;
+                               "SDKROOT[arch=arm*]" = iphoneos;
                                SYMROOT = OSX/build;
+                               TARGETED_DEVICE_FAMILY = "1,2";
                                USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR) $(USER_HEADER_SEARCH_PATHS)";
                                WARNING_CFLAGS = "-Wimplicit";
                                WRAPPER_EXTENSION = saver;
                        isa = XCBuildConfiguration;
                        buildSettings = {
                                ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
-                               GCC_ENABLE_OBJC_GC = supported;
-                               "GCC_ENABLE_OBJC_GC[sdk=iphoneos*][arch=*]" = unsupported;
-                               "GCC_ENABLE_OBJC_GC[sdk=iphonesimulator*][arch=*]" = unsupported;
+                               BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.${PRODUCT_NAME:rfc1034identifier}";
+                               "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Jamie Zawinski";
+                               "CODE_SIGN_IDENTITY[sdk=iphonesimulator*]" = "iPhone Distribution: Jamie Zawinski";
+                               COMBINE_HIDPI_IMAGES = YES;
                                GCC_PRECOMPILE_PREFIX_HEADER = YES;
                                GCC_PREFIX_HEADER = OSX/xscreensaver_Prefix.pch;
                                GCC_PREPROCESSOR_DEFINITIONS = (
                                );
                                INFOPLIST_FILE = OSX/XScreenSaver.plist;
                                INSTALL_PATH = "$(HOME)/Library/Screen Savers";
-                               MACOSX_DEPLOYMENT_TARGET = 10.5;
-                               "MACOSX_DEPLOYMENT_TARGET[sdk=iphoneos*][arch=*]" = "";
-                               "MACOSX_DEPLOYMENT_TARGET[sdk=iphonesimulator*][arch=*]" = "";
+                               IPHONEOS_DEPLOYMENT_TARGET = 4.3;
+                               LIBRARY_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)";
+                               MACOSX_DEPLOYMENT_TARGET = 10.4;
+                               "OTHER_CFLAGS[sdk=macosx*]" = "-fobjc-gc";
                                PRODUCT_NAME = "$(TARGET_NAME)";
                                SDKROOT = macosx;
+                               "SDKROOT[arch=arm*]" = iphoneos;
                                SYMROOT = OSX/build;
+                               TARGETED_DEVICE_FAMILY = "1,2";
                                USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR) $(USER_HEADER_SEARCH_PATHS)";
+                               VALIDATE_PRODUCT = YES;
                                WARNING_CFLAGS = "-Wimplicit";
                                WRAPPER_EXTENSION = saver;
                        };
                        defaultConfigurationIsVisible = 0;
                        defaultConfigurationName = Release;
                };
-               AF2D4D8C13E902F5002AA818 /* Build configuration list for PBXNativeTarget "PhosphorApp" */ = {
+               AF2D4D8C13E902F5002AA818 /* Build configuration list for PBXNativeTarget "Phosphor-iOS" */ = {
                        isa = XCConfigurationList;
                        buildConfigurations = (
                                AF2D4D8D13E902F5002AA818 /* Debug */,
                        defaultConfigurationIsVisible = 0;
                        defaultConfigurationName = Release;
                };
-               AF2D4F7B13E91093002AA818 /* Build configuration list for PBXNativeTarget "Apple2App" */ = {
+               AF2D4F7B13E91093002AA818 /* Build configuration list for PBXNativeTarget "Apple2-iOS" */ = {
                        isa = XCConfigurationList;
                        buildConfigurations = (
                                AF2D4F7C13E91093002AA818 /* Debug */,
                        defaultConfigurationIsVisible = 0;
                        defaultConfigurationName = Release;
                };
+               AF75110F1782B5B900380EA1 /* Build configuration list for PBXNativeTarget "Kaleidocycle" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               AF7511101782B5B900380EA1 /* Debug */,
+                               AF7511111782B5B900380EA1 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
                AF7776F309B63ABF00EA3033 /* Build configuration list for PBXNativeTarget "Phosphor" */ = {
                        isa = XCConfigurationList;
                        buildConfigurations = (
                        defaultConfigurationIsVisible = 0;
                        defaultConfigurationName = Release;
                };
+               AFB591B7178B812C00EA4005 /* Build configuration list for PBXNativeTarget "Hexadrop" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               AFB591B8178B812C00EA4005 /* Debug */,
+                               AFB591B9178B812C00EA4005 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               AFBFE75B178642DC00432B21 /* Build configuration list for PBXNativeTarget "Apple2-OSX" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               AFBFE75C178642DC00432B21 /* Debug */,
+                               AFBFE75D178642DC00432B21 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               AFBFE77B178647FE00432B21 /* Build configuration list for PBXNativeTarget "Phosphor-OSX" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               AFBFE77C178647FE00432B21 /* Debug */,
+                               AFBFE77D178647FE00432B21 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
                AFD51B2D0F063B4A00471C02 /* Build configuration list for PBXNativeTarget "Photopile" */ = {
                        isa = XCConfigurationList;
                        buildConfigurations = (
                        defaultConfigurationIsVisible = 0;
                        defaultConfigurationName = Release;
                };
+               AFDA659E178A52B70070D24B /* Build configuration list for PBXNativeTarget "Unknown Pleasures" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               AFDA659F178A52B70070D24B /* Debug */,
+                               AFDA65A0178A52B70070D24B /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
                AFE2A4670E2E904600ADB298 /* Build configuration list for PBXNativeTarget "SkyTentacles" */ = {
                        isa = XCConfigurationList;
                        buildConfigurations = (
                        defaultConfigurationIsVisible = 0;
                        defaultConfigurationName = Release;
                };
+               AFF2868F17860E830050A578 /* Build configuration list for PBXNativeTarget "QuasiCrystal" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               AFF2869017860E830050A578 /* Debug */,
+                               AFF2869117860E830050A578 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
                AFF463440C4403E400EE6509 /* Build configuration list for PBXNativeTarget "CWaves" */ = {
                        isa = XCConfigurationList;
                        buildConfigurations = (