From: Zygo Blaxell Date: Mon, 17 Oct 2016 13:25:55 +0000 (-0400) Subject: From http://www.jwz.org/xscreensaver/xscreensaver-5.36.tar.gz X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=commitdiff_plain;h=d6b0217f2417bd19187f0ebc389d6c5c2233b11c From jwz.org/xscreensaver/xscreensaver-5.36.tar.gz -rw-r--r-- 1 zblaxell zblaxell 10600872 Oct 11 14:19 xscreensaver-5.36.tar.gz 0353cbe76cb5e8aa55d0142d8733bf2924772f95 xscreensaver-5.36.tar.gz --- diff --git a/OSX/Makefile b/OSX/Makefile index d8664552..4fd574ca 100644 --- a/OSX/Makefile +++ b/OSX/Makefile @@ -11,8 +11,7 @@ XCODE_APP = /Applications/Xcode.app TARGETS = All Savers ARCH = -arch i386 -arch x86_64 ONLY_ACTIVE_ARCH=NO -CERT = 'Jamie Zawinski' -CERT = 'iPhone Developer: Jamie Zawinski (Y5M82TL69N)' +CERT = 'Developer ID Installer: Jamie Zawinski (4627ATJELP)' PKGID = org.jwz.xscreensaver THUMBDIR = build/screenshots XCODEBUILD = $(XCODE_APP)/Contents/Developer/usr/bin/xcodebuild @@ -42,7 +41,6 @@ release:: distdepend $(XCODEBUILD) $(ARCH) -target "$(TARGETS)" -configuration Release build release:: check_versions -release:: sign Sparkle.framework: unzip ../archive/Sparkle.framework-2013-12-04.zip @@ -99,12 +97,6 @@ $(THUMBDIR)/%.png: fi -sign: - @for f in build/Release/*.app/Contents/*/*.saver \ - build/Release/*.{saver,app} ; do \ - codesign --deep -vfs $(CERT) $$f ; \ - done - check_versions: @\ SRC=../utils/version.h ; \ @@ -256,8 +248,9 @@ build/Release/installer.pkg: installer.rtf installer.xml installer.sh installer. \ DIST="installer.xml" ; \ STAGE="build/Release/pkg_stage" ; \ - PKG1="$@" ; \ - PKG2="$$STAGE/contents.pkg" ; \ + FINAL="$@" ; \ + UNSIGNED="$$STAGE/contents.pkg" ; \ + PRODUCT="$$STAGE/product_unsigned.pkg" ; \ SCRIPTS="$$STAGE/scripts" ; \ RES="$$STAGE/resources" ; \ \ @@ -270,14 +263,13 @@ build/Release/installer.pkg: installer.rtf installer.xml installer.sh installer. cp -p installer.rtf "$$RES/welcome.rtf" ; \ \ pkgbuild --identifier "$(PKGID)" --version "$$V" \ - --scripts "$$SCRIPTS" --nopayload "$$PKG2" ; \ - codesign -vfs $(CERT) "$$PKG2" ; \ - codesign -vd "$$PKG2" ; \ + --scripts "$$SCRIPTS" --nopayload "$$UNSIGNED" ; \ \ productbuild --distribution "$$DIST" --resources "$$RES" \ - --package-path "$$STAGE" --version "$$V" "$$PKG1" ; \ - codesign -vfs $(CERT) "$$PKG1" ; \ - codesign -vd "$$PKG1" ; \ + --package-path "$$STAGE" --version "$$V" "$$PRODUCT" ; \ + \ + productsign --sign $(CERT) "$$PRODUCT" "$$FINAL" ; \ + spctl --assess --verbose=4 --type install "$$FINAL" ; \ \ rm -rf "$$STAGE" ; \ @@ -348,12 +340,24 @@ dmg:: $(SETICON) -d ../../xdaliclock/OSX/daliclockSaver.icns \ "$$DST/DaliClock.saver" ; \ $(SETICON) -d XScreenSaverFolder.icns "$$DST" ; \ + $(SETICON) -d XScreenSaver.icns "$$DST"/*.saver ; \ + $(SETICON) -d SaverRunner.icns "$$DST"/*.app ; \ $(SETICON) -d XScreenSaverWebloc.icns "$$STAGE"/*.webloc ; \ $(SETICON) -d XScreenSaverPkg.icns "$$STAGE"/*.pkg ; \ mv "$$STAGE/bindist.webloc" "$$STAGE/Get the iPhone:iPad Version.webloc" ; \ + \ + set +x ; \ + echo "Checking signatures..." ; \ + spctl --assess --type install "$$PKG" ; \ + spctl --assess --type execute "$$SRC/XScreenSaverUpdater.app" ; \ + spctl --assess --type execute "$$DST/"*.app ; \ + spctl --assess --type install "$$DST/"*.saver ; \ + set -x ; \ + \ hdiutil makehybrid -quiet -ov -hfs -hfs-volume-name "$$VOLNAME" \ -hfs-openfolder "$$STAGE" "$$STAGE" -o "$$TMPDMG" ; \ rm -rf "$$STAGE" ; \ + \ hdiutil convert -quiet -ov -format UDBZ -imagekey zlib-level=9 \ "$$TMPDMG" -o "$$DMG" ; \ xattr -w com.apple.quarantine "0000;00000000;;" "$$DMG" ; \ diff --git a/OSX/README b/OSX/README index 555e8e25..acf589b2 100644 --- a/OSX/README +++ b/OSX/README @@ -18,7 +18,7 @@ ridiculously long list of steps! 3: Delete the dangerball.c and dangerball.xml files from Build Phases. 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 (maybe this automatic now?) + 6: - 7: Manage Schemes, rename "DangerBall Copy". 8: Move to the right place in the list. 9: Scheme / Run / Info: Executable: SaverTester.app. diff --git a/OSX/SaverRunner.h b/OSX/SaverRunner.h index bacfd386..73b83e9d 100644 --- a/OSX/SaverRunner.h +++ b/OSX/SaverRunner.h @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2015 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2016 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 @@ -67,6 +67,8 @@ @interface SaverRunner : NSObject # ifdef USE_IPHONE +# else + # endif { NSString *saverName; // the one currently loaded diff --git a/OSX/SaverRunner.m b/OSX/SaverRunner.m index ac010b9f..20ddd650 100644 --- a/OSX/SaverRunner.m +++ b/OSX/SaverRunner.m @@ -386,7 +386,10 @@ - (BOOL)shouldAutorotate /* Added in iOS 6 */ { - return YES; + return + NSFoundationVersionNumber < NSFoundationVersionNumber_iOS_8_0 ? + ![_saverView suppressRotationAnimation] : + YES; } @@ -1453,6 +1456,7 @@ FAIL: // or two windows for SaverTester.app. for (i = 0; i < window_count; i++) { NSWindow *win = [self makeWindow]; + [win setDelegate:self]; // Get the last-saved window position out of preferences. [win setFrameAutosaveName: [NSString stringWithFormat:@"XScreenSaverWindow%d", i]]; @@ -1460,6 +1464,7 @@ FAIL: [a addObject: win]; // This prevents clicks from being seen by savers. // [win setMovableByWindowBackground:YES]; + win.releasedWhenClosed = NO; [win release]; } # else // USE_IPHONE @@ -1596,6 +1601,18 @@ FAIL: return YES; } +/* When the window is about to close, stop its animation. + Without this, timers might fire after the window is dead. + */ +- (void)windowWillClose:(NSNotification *)notification +{ + NSWindow *win = [notification object]; + NSView *cv = win ? [win contentView] : 0; + ScreenSaverView *sv = cv ? find_saverView (cv) : 0; + if (sv && [sv isAnimating]) + [sv stopAnimation]; +} + # else // USE_IPHONE - (void)applicationWillResignActive:(UIApplication *)app diff --git a/OSX/SaverRunner.plist b/OSX/SaverRunner.plist index b3b74991..2384a81d 100644 --- a/OSX/SaverRunner.plist +++ b/OSX/SaverRunner.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleGetInfoString - 5.35 + 5.36 CFBundleIconFile SaverRunner CFBundleIdentifier @@ -15,21 +15,21 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - 5.35 + 5.36 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString - 5.35 + 5.36 CFBundleSignature ???? CFBundleVersion - 5.35 + 5.36 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright - 5.35 + 5.36 NSMainNibFile SaverRunner NSPrincipalClass diff --git a/OSX/Updater.plist b/OSX/Updater.plist index 692f7a01..29f7f8d5 100644 --- a/OSX/Updater.plist +++ b/OSX/Updater.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleGetInfoString - 5.35 + 5.36 CFBundleIconFile SaverRunner CFBundleIdentifier @@ -17,23 +17,23 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - 5.35 + 5.36 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString - 5.35 + 5.36 CFBundleSignature ???? CFBundleVersion - 5.35 + 5.36 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} LSUIElement NSHumanReadableCopyright - 5.35 + 5.36 NSMainNibFile Updater NSPrincipalClass diff --git a/OSX/XScreenSaver.plist b/OSX/XScreenSaver.plist index 9af74f5f..fc21ef71 100644 --- a/OSX/XScreenSaver.plist +++ b/OSX/XScreenSaver.plist @@ -15,13 +15,13 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 5.35 + 5.36 CFBundleSignature ???? CFBundleVersion - 5.35 + 5.36 LSMinimumSystemVersion - 10.4 + 10.8 NSMainNibFile SaverRunner NSPrincipalClass diff --git a/OSX/XScreenSaverConfigSheet.m b/OSX/XScreenSaverConfigSheet.m index 576c8ab3..51c13af4 100644 --- a/OSX/XScreenSaverConfigSheet.m +++ b/OSX/XScreenSaverConfigSheet.m @@ -712,6 +712,11 @@ static void layout_group (NSView *group, BOOL horiz_p); // Without the setAppliesImmediately:, when the saver restarts, it's still // got the old settings. -[XScreenSaverConfigSheet traverseTree] sets this // to NO; default is YES. + + // #### However: I'm told that when these are set to YES, then changes to + // 'textLiteral', 'textURL' and 'textProgram' are ignored, but 'textFile' + // works. In StarWars, at least... + [userDefaultsController setAppliesImmediately:YES]; [globalDefaultsController setAppliesImmediately:YES]; [userDefaultsController commitEditing]; diff --git a/OSX/XScreenSaverView.m b/OSX/XScreenSaverView.m index bc7f21a3..18f4a1aa 100644 --- a/OSX/XScreenSaverView.m +++ b/OSX/XScreenSaverView.m @@ -41,7 +41,12 @@ #ifndef MAC_OS_X_VERSION_10_6 # define MAC_OS_X_VERSION_10_6 1060 /* undefined in 10.4 SDK, grr */ #endif -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 /* 10.6 SDK */ +#ifndef MAC_OS_X_VERSION_10_12 +# define MAC_OS_X_VERSION_10_12 101200 +#endif +#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 && \ + MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_12) + /* 10.6 SDK or later, and earlier than 10.12 SDK */ # import # define DO_GC_HACKERY #endif @@ -433,6 +438,11 @@ add_default_options (const XrmOptionDescRec *opts, [self setBackgroundColor:[NSColor blackColor]]; # endif // USE_IPHONE +# ifdef JWXYZ_QUARTZ + // Colorspaces and CGContexts only happen with non-GL hacks. + colorspace = CGColorSpaceCreateDeviceRGB (); +# endif + return self; } @@ -997,7 +1007,7 @@ gl_check_ver (const struct gl_version *caps, gl_texture_target = GL_TEXTURE_2D; # endif - glBindTexture (gl_texture_target, &backbuffer_texture); + glBindTexture (gl_texture_target, backbuffer_texture); glTexParameteri (gl_texture_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // GL_LINEAR might make sense on Retina iPads. glTexParameteri (gl_texture_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -1140,25 +1150,6 @@ to_pow2 (size_t x) */ - (void) createBackbuffer:(CGSize)new_size { - // Colorspaces and CGContexts only happen with non-GL hacks. - if (colorspace) - CGColorSpaceRelease (colorspace); - - NSWindow *window = [self window]; - - if (window && xdpy) { - [self lockFocus]; - -# ifdef BACKBUFFER_OPENGL - // Was apparently faster until 10.9. - colorspace = CGColorSpaceCreateDeviceRGB (); -# endif // BACKBUFFER_OPENGL - - [self unlockFocus]; - } else { - colorspace = CGColorSpaceCreateDeviceRGB(); - } - CGSize osize = CGSizeZero; if (backbuffer) { osize.width = CGBitmapContextGetWidth(backbuffer); @@ -1475,7 +1466,8 @@ to_pow2 (size_t x) // landscape shape, swap width and height to keep the backbuffer // in portrait. // - if ([self ignoreRotation] && new_size.width > new_size.height) { + double rot = current_device_rotation(); + if ([self ignoreRotation] && (rot == 90 || rot == -90)) { CGFloat swap = new_size.width; new_size.width = new_size.height; new_size.height = swap; @@ -1486,6 +1478,7 @@ to_pow2 (size_t x) new_size.height *= s; # endif // USE_IPHONE + [self prepareContext]; [self setViewport]; // On first resize, xwindow->frame is 0x0. @@ -1493,8 +1486,6 @@ to_pow2 (size_t x) xwindow->frame.height == new_size.height) return; - [self prepareContext]; - # if defined(BACKBUFFER_OPENGL) && !defined(USE_IPHONE) [ogl_ctx update]; # endif // BACKBUFFER_OPENGL && !USE_IPHONE diff --git a/OSX/bindist.rtf b/OSX/bindist.rtf index a5ea639e..f9cb355b 100644 --- a/OSX/bindist.rtf +++ b/OSX/bindist.rtf @@ -16,8 +16,8 @@ \b0 by Jamie Zawinski\ and many others\ \ -version 5.35\ -24-May-2016\ +version 5.36\ +10-Oct-2016\ \ {\field{\*\fldinst{HYPERLINK "https://www.jwz.org/xscreensaver/"}}{\fldrslt \cf2 \ul \ulc2 https://www.jwz.org/xscreensaver/}}\ \pard\pardeftab720 diff --git a/OSX/grabclient-ios.m b/OSX/grabclient-ios.m new file mode 100644 index 00000000..e3e4a8e7 --- /dev/null +++ b/OSX/grabclient-ios.m @@ -0,0 +1,128 @@ +/* xscreensaver, Copyright (c) 1992-2016 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. + */ + +/* This iOS code to choose and return a random image from the user's + * photo gallery. + * + * Much of the following written by: + * + * Created by David Oster on 6/23/12. + * Copyright (c) 2012 Google. All rights reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef USE_IPHONE // whole file + +#import +#import "grabscreen.h" +#import "yarandom.h" + +/* ALAssetsLibrary is an async API, so we need to fire it off and then + call a callback when it's done. Fortunately, this fits the same + interaction model already used in xscreensaver by load_image_async(), + so it works out nicely. + */ + +typedef struct { + void (*callback) (void *uiimage, const char *fn, int width, int height, + void *closure); + void *closure; + + ALAssetsLibrary *library; + NSMutableArray *assets; + +} ios_loader_data; + + +static void +ios_random_image_done (ios_loader_data *d, BOOL ok) +{ + UIImage *img = 0; + const char *fn = 0; + NSUInteger n = ok ? [d->assets count] : 0; + if (n > 0) { + ALAsset *asset = [d->assets objectAtIndex: random() % n]; + ALAssetRepresentation *rep = [asset defaultRepresentation]; + + // "fullScreenImage" returns a smaller image than "fullResolutionImage", + // but this function still takes a significant fraction of a second, + // causing a visible glitch in e.g. "glslideshow". + CGImageRef cgi = [rep fullScreenImage]; + if (cgi) { + UIImageOrientation orient = (UIImageOrientation) + [[asset valueForProperty:ALAssetPropertyOrientation] intValue]; + img = [UIImage imageWithCGImage: cgi + scale: 1 + orientation: orient]; + if (img) + fn = [[[rep filename] stringByDeletingPathExtension] + cStringUsingEncoding:NSUTF8StringEncoding]; + } + } + + [d->assets release]; + [d->library release]; + + d->callback (img, fn, [img size].width, [img size].height, d->closure); + free (d); +} + + +void +ios_load_random_image (void (*callback) (void *uiimage, const char *fn, + int width, int height, + void *closure), + void *closure) +{ + ios_loader_data *d = (ios_loader_data *) calloc (1, sizeof(*d)); + d->callback = callback; + d->closure = closure; + + d->library = [[[ALAssetsLibrary alloc] init] retain]; + d->assets = [[NSMutableArray array] retain]; + + // The closures passed in here are called later, after we have returned. + // + [d->library enumerateGroupsWithTypes: ALAssetsGroupAll + usingBlock: ^(ALAssetsGroup *group, BOOL *stop) { + NSString *name = [group valueForProperty:ALAssetsGroupPropertyName]; + if ([name length]) { + [group enumerateAssetsUsingBlock: ^(ALAsset *asset, NSUInteger index, + BOOL *stop) { + if ([[asset valueForProperty: ALAssetPropertyType] + isEqual: ALAssetTypePhoto]) { + [d->assets addObject:asset]; + } + }]; + } + + if (! group) { // done + ios_random_image_done (d, YES); + } + } failureBlock:^(NSError *error) { + // E.g., ALAssetsLibraryErrorDomain: "The user has denied the + // application access to their media." + NSLog(@"reading Photo Library: %@", error); + ios_random_image_done (d, NO); + }]; +} + +#endif // USE_IPHONE - whole file diff --git a/OSX/grabclient-osx.m b/OSX/grabclient-osx.m new file mode 100644 index 00000000..a0a949d7 --- /dev/null +++ b/OSX/grabclient-osx.m @@ -0,0 +1,470 @@ +/* xscreensaver, Copyright (c) 1992-2016 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. + */ + +/* This is the OSX implementation of desktop-grabbing and image-loading. + This code is invoked by "utils/grabclient.c", which is linked directly + in to each screen saver bundle. + + X11-based builds of the savers do not use this code (even on MacOS). + This is used only by the Cocoa build of the savers. + */ + +#import +#import +#ifndef USE_IPHONE +# import +#else +# import "SaverRunner.h" +#endif +#import "jwxyz-cocoa.h" +#import "grabscreen.h" +#import "colorbars.h" +#import "resources.h" +#import "usleep.h" + + +#ifdef USE_IPHONE +# define NSImage UIImage +#endif + + +#ifndef MAC_OS_X_VERSION_10_6 +# define MAC_OS_X_VERSION_10_6 1060 /* undefined in 10.4 SDK, grr */ +#endif + +#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 + + /* 10.4 code. + + This version of the code works on 10.4, but is flaky. There is + a better way to do it on 10.5 and newer, but taking this path, + then we are being compiled against the 10.4 SDK instead of the + 10.5 SDK, and the newer API is not available to us. + */ + +static void +copy_framebuffer_to_ximage (CGDirectDisplayID cgdpy, XImage *xim, + int window_x, int window_y) +{ + unsigned char *data = (unsigned char *) + CGDisplayAddressForPosition (cgdpy, window_x, window_y); + int bpp = CGDisplayBitsPerPixel (cgdpy); + int spp = CGDisplaySamplesPerPixel (cgdpy); + int bps = CGDisplayBitsPerSample (cgdpy); + int bpr = CGDisplayBytesPerRow (cgdpy); + + int y; + int ximw = xim->width; + int ximh = xim->height; + + uint32_t *odata = (uint32_t *) xim->data; + + switch (bpp) { + case 32: + if (spp != 3) abort(); + if (bps != 8) abort(); + int xwpl = xim->bytes_per_line/4; + for (y = 0; y < ximh; y++) { + // We can do this because the frame buffer and XImage are both ARGB 32. + // Both PPC and Intel use ARGB, viewed in word order (not byte-order). + memcpy (odata, data, ximw * 4); + odata += xwpl; + data += bpr; + } + break; + + case 16: + if (spp != 3) abort(); + if (bps != 5) abort(); + for (y = 0; y < ximh; y++) { + uint16_t *ip = (uint16_t *) data; + int x; + for (x = 0; x < ximw; x++) { + uint16_t p = *ip++; + // This should be ok on both PPC and Intel (ARGB, word order) + unsigned char r = (p >> 10) & 0x1F; + unsigned char g = (p >> 5) & 0x1F; + unsigned char b = (p ) & 0x1F; + r = (r << 3) | (r >> 2); + g = (g << 3) | (g >> 2); + b = (b << 3) | (b >> 2); + uint32_t pixel = 0xFF000000 | (r << 16) | (g << 8) | b; + // XPutPixel (xim, x, y, pixel); + *odata++ = pixel; + } + data += bpr; + } + break; + + case 8: + { + /* Get the current palette of the display. */ + CGDirectPaletteRef pal = CGPaletteCreateWithDisplay (cgdpy); + + /* Map it to 32bpp pixels */ + uint32_t map[256]; + for (y = 0; y < 256; y++) { + CGDeviceColor c = CGPaletteGetColorAtIndex (pal, y); + unsigned char r = c.red * 255.0; + unsigned char g = c.green * 255.0; + unsigned char b = c.blue * 255.0; + uint32_t pixel = 0xFF000000 | (r << 16) | (g << 8) | b; + map[y] = pixel; + } + + for (y = 0; y < ximh; y++) { + unsigned char *ip = data; + int x; + for (x = 0; x < ximw; x++) { + *odata++ = map[*ip++]; + } + data += bpr; + } + CGPaletteRelease (pal); + } + break; + + default: + abort(); + break; + } +} + + +/* Loads an image into the Drawable, returning once the image is loaded. + */ +Bool +osx_grab_desktop_image (Screen *screen, Window xwindow, Drawable drawable, + XRectangle *geom_ret) +{ + Display *dpy = DisplayOfScreen (screen); + NSView *nsview = jwxyz_window_view (xwindow); + NSWindow *nswindow = [nsview window]; + XWindowAttributes xgwa; + int window_x, window_y; + Window unused; + + // Figure out where this window is on the screen. + // + XGetWindowAttributes (dpy, xwindow, &xgwa); + XTranslateCoordinates (dpy, xwindow, RootWindowOfScreen (screen), 0, 0, + &window_x, &window_y, &unused); + + // Use the size of the Drawable, not the Window. + { + Window r; + int x, y; + unsigned int w, h, bbw, d; + XGetGeometry (dpy, drawable, &r, &x, &y, &w, &h, &bbw, &d); + xgwa.width = w; + xgwa.height = h; + } + + // Create a tmp ximage to hold the screen data. + // + XImage *xim = XCreateImage (dpy, xgwa.visual, 32, ZPixmap, 0, 0, + xgwa.width, xgwa.height, 8, 0); + xim->data = (char *) malloc (xim->height * xim->bytes_per_line); + + + // Find the address in the frame buffer of the top left of this window. + // + CGDirectDisplayID cgdpy = 0; + { + CGPoint p; + // #### this isn't quite right for screen 2: it's offset slightly. + p.x = window_x; + p.y = window_y; + CGDisplayCount n; + CGGetDisplaysWithPoint (p, 1, &cgdpy, &n); + if (!cgdpy) abort(); + } + + // Paint a transparent "hole" in this window. + // + BOOL oopaque = [nswindow isOpaque]; + [nswindow setOpaque:NO]; + + [[NSColor clearColor] set]; + NSRectFill ([nsview frame]); + [[nswindow graphicsContext] flushGraphics]; + + + // Without this, we get a dozen black scanlines at the top. + // #### But with this, the screen saver loops, because calling this + // seems to implicitly mark the display as non-idle! + // CGDisplayCaptureWithOptions (cgdpy, kCGCaptureNoFill); + + // #### So let's try waiting for the vertical blank instead... + // Nope, that doesn't work. + // + // CGDisplayWaitForBeamPositionOutsideLines (cgdpy, 0, + // window_y + [nswindow frame].size.height); + + // #### Ok, try a busy-wait? + // Nope. + // + + // #### Ok, just fuckin' sleep! + // + usleep (100000); + + + // Pull the bits out of the frame buffer. + // + copy_framebuffer_to_ximage (cgdpy, xim, window_x, window_y); + + // CGDisplayRelease (cgdpy); + + // Make the window visible again. + // + [nswindow setOpaque:oopaque]; + + // Splat the XImage onto the target drawable (probably the window) + // and free the bits. + // + XGCValues gcv; + GC gc = XCreateGC (dpy, drawable, 0, &gcv); + XPutImage (dpy, drawable, gc, xim, 0, 0, 0, 0, xim->width, xim->height); + XFreeGC (dpy, gc); + + if (geom_ret) { + geom_ret->x = 0; + geom_ret->y = 0; + geom_ret->width = xim->width; + geom_ret->height = xim->height; + } + + XDestroyImage (xim); + return True; +} + + +#elif defined(USE_IPHONE) + + /* What a hack! + + On iOS, our application delegate, SaverRunner, grabs an image + of itself as a UIImage before mapping the XScreenSaverView. + In this code, we ask SaverRunner for that UIImage, then copy + it to the root window. + */ + +Bool +osx_grab_desktop_image (Screen *screen, Window xwindow, Drawable drawable, + XRectangle *geom_ret) +{ + SaverRunner *s = + (SaverRunner *) [[UIApplication sharedApplication] delegate]; + if (! s) + return False; + if (! [s isKindOfClass:[SaverRunner class]]) + return False; + UIImage *img = [s screenshot]; + if (! img) + return False; + jwxyz_draw_NSImage_or_CGImage (DisplayOfScreen (screen), drawable, + True, img, geom_ret, 0); + return True; +} + + +#else /* MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 + + 10.5+ code. + + This version of the code is simpler and more reliable, but + uses an API that only exist on 10.5 and newer, so we can only + use it if when being compiled against the 10.5 SDK or later. + */ + +/* Loads an image into the Drawable, returning once the image is loaded. + */ +Bool +osx_grab_desktop_image (Screen *screen, Window xwindow, Drawable drawable, + XRectangle *geom_ret) +{ + Display *dpy = DisplayOfScreen (screen); + NSView *nsview = jwxyz_window_view (xwindow); + XWindowAttributes xgwa; + int window_x, window_y; + Window unused; + + // Figure out where this window is on the screen. + // + XGetWindowAttributes (dpy, xwindow, &xgwa); + XTranslateCoordinates (dpy, xwindow, RootWindowOfScreen (screen), 0, 0, + &window_x, &window_y, &unused); + + // Grab only the rectangle of the screen underlying this window. + // + CGRect cgrect; + cgrect.origin.x = window_x; + cgrect.origin.y = window_y; + cgrect.size.width = xgwa.width; + cgrect.size.height = xgwa.height; + + /* If a password is required to unlock the screen, a large black + window will be on top of all of the desktop windows by the time + we reach here, making the screen-grab rather uninteresting. If + we move ourselves temporarily below the login-window windows + before capturing the image, we capture the real desktop as + intended. + + Oct 2016: Surprise, this trick no longer works on MacOS 10.12. Sigh. + */ + + // save our current level so we can restore it later + int oldLevel = [[nsview window] level]; + +# if 0 + { + FILE *f = fopen("/tmp/log.txt", "w"); + CFArrayRef L = CGWindowListCopyWindowInfo (kCGWindowListOptionOnScreenOnly, + kCGNullWindowID); + + fprintf(f, "# %d\n", [[nsview window] windowNumber]); + + int n = CFArrayGetCount(L); + for (int i = 0; i < n; i++) { + NSDictionary *dict = (NSDictionary *) CFArrayGetValueAtIndex(L, i); + fprintf(f, + "%d \"%s\"\n", + (int) [dict objectForKey:kCGWindowNumber], + [(NSString *) [dict objectForKey:kCGWindowOwnerName] + cStringUsingEncoding:[NSString defaultCStringEncoding]]); + } + fclose(f); + } +#endif + + [[nsview window] setLevel:CGWindowLevelForKey(kCGPopUpMenuWindowLevelKey)]; + + // Grab a screen shot of those windows below this one + // (hey, X11 can't do that!) + // + CGImageRef img = + CGWindowListCreateImage (cgrect, + kCGWindowListOptionOnScreenBelowWindow, + [[nsview window] windowNumber], + kCGWindowImageDefault); + + // put us back above the login windows so the screensaver is visible. + [[nsview window] setLevel:oldLevel]; + + if (! img) return False; + + // Render the grabbed CGImage into the Drawable. + jwxyz_draw_NSImage_or_CGImage (DisplayOfScreen (screen), drawable, + False, img, geom_ret, 0); + CGImageRelease (img); + return True; +} + +#endif /* 10.5+ code */ + + +# ifndef USE_IPHONE + +/* Returns the EXIF rotation property of the image, if any. + */ +static int +exif_rotation (const char *filename) +{ + /* As of 10.6, NSImage rotates according to EXIF by default: + http://developer.apple.com/mac/library/releasenotes/cocoa/appkit.html + So this function should return -1 when *running* on 10.6 systems. + But when running against older systems, we need to examine the image + to figure out its rotation. + */ + +# if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 /* 10.6 SDK */ + + /* When we have compiled against the 10.6 SDK, we know that we are + running on a 10.6 or later system. + */ + return -1; + +# else /* Compiled against 10.5 SDK or earlier */ + + /* If this selector exists, then we are running against a 10.6 runtime + that does automatic EXIF rotation (despite the fact that we were + compiled against the 10.5 or earlier SDK). So in that case, this + function should no-op. + */ + if ([NSImage instancesRespondToSelector: + @selector(initWithDataIgnoringOrientation:)]) + return -1; + + /* Otherwise, go ahead and figure out what the rotational characteristics + of this image are. */ + + + + /* This is a ridiculous amount of rigamarole to go through, but for some + reason the "Orientation" tag does not exist in the "NSImageEXIFData" + dictionary inside the NSBitmapImageRep of the NSImage. Several other + EXIF tags are there (e.g., shutter speed) but not orientation. WTF? + */ + CFStringRef s = CFStringCreateWithCString (NULL, filename, + kCFStringEncodingUTF8); + CFURLRef url = CFURLCreateWithFileSystemPath (NULL, s, + kCFURLPOSIXPathStyle, 0); + CGImageSourceRef cgimg = CGImageSourceCreateWithURL (url, NULL); + if (! cgimg) return -1; + + NSDictionary *props = (NSDictionary *) + CGImageSourceCopyPropertiesAtIndex (cgimg, 0, NULL); + int rot = [[props objectForKey:@"Orientation"] intValue]; + CFRelease (cgimg); + CFRelease (url); + CFRelease (s); + return rot; + +# endif /* 10.5 */ +} + +# endif /* USE_IPHONE */ + + + +/* Loads an image file and splats it onto the drawable. + The image is drawn as large as possible while preserving its aspect ratio. + If geom_ret is provided, the actual rectangle the rendered image takes + up will be returned there. + */ +Bool +osx_load_image_file (Screen *screen, Window xwindow, Drawable drawable, + const char *filename, XRectangle *geom_ret) +{ +# ifndef USE_IPHONE + + if (!filename || !*filename) return False; + + NSImage *img = [[NSImage alloc] initWithContentsOfFile: + [NSString stringWithCString:filename + encoding:NSUTF8StringEncoding]]; + if (!img) + return False; + + jwxyz_draw_NSImage_or_CGImage (DisplayOfScreen (screen), drawable, + True, img, geom_ret, + exif_rotation (filename)); + [img release]; + return True; + +# else /* USE_IPHONE */ + + /* This is handled differently: see grabclient.c and grabclient-ios.m. */ + return False; + +# endif /* USE_IPHONE */ +} diff --git a/OSX/iSaverRunner.plist b/OSX/iSaverRunner.plist index e6276948..2f7a19a5 100644 --- a/OSX/iSaverRunner.plist +++ b/OSX/iSaverRunner.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleGetInfoString - 5.35 + 5.36 CFBundleIcons CFBundleIcons~ipad @@ -19,21 +19,21 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - 5.35 + 5.36 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString - 5.35 + 5.36 CFBundleSignature ???? CFBundleVersion - 5.35 + 5.36 LSRequiresIPhoneOS NSHumanReadableCopyright - 5.35 + 5.36 NSMainNibFile iSaverRunner UIAppFonts @@ -65,5 +65,6 @@ UIViewControllerBasedStatusBarAppearance - + NSPhotoLibraryUsageDescription + XScreenSaver displays manipulated versions of your photos. diff --git a/OSX/installer.sh b/OSX/installer.sh index 05e1b23f..fa92beb3 100755 --- a/OSX/installer.sh +++ b/OSX/installer.sh @@ -1,5 +1,5 @@ #!/bin/sh -# XScreenSaver, Copyright © 2013-2014 Jamie Zawinski +# XScreenSaver, Copyright © 2013-2016 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 @@ -67,9 +67,11 @@ DST1="$DSTVOLUME/Library/Screen Savers" DST2="$DSTVOLUME/Applications" PU="$DSTVOLUME/$HOME/Library/Screen Savers" -# Because of Sparkle.framework weirdness, ".XScreenSaverUpdater.app" -# is in the DMG, and we remove the leading dot when installing it. -# Without this, auto-updates won't work right. +# Because of Sparkle.framework weirdness, "XScreenSaverUpdater.app" is +# in the DMG as a compressed tar file instead of an app, and we unpack +# it when installing. Without this, auto-updates won't work: If there's +# an .app there, Sparkle thinks that "XScreenSaverUpdater.app" is the +# thing it should be updating instead of "Install Everything.pkg". # UPDATER_SRC="XScreenSaver.updater" UPDATER_DST="XScreenSaverUpdater.app" diff --git a/OSX/ios-function-table.m b/OSX/ios-function-table.m index b66570d0..52b8340d 100644 --- a/OSX/ios-function-table.m +++ b/OSX/ios-function-table.m @@ -1,5 +1,5 @@ /* Generated file, do not edit. - Created: Thu May 5 22:34:31 2016 by build-fntable.pl 1.5. + Created: Sat Sep 3 00:49:37 2016 by build-fntable.pl 1.5. */ #import @@ -48,7 +48,9 @@ extern struct xscreensaver_function_table crystal_xscreensaver_function_table, cube21_xscreensaver_function_table, cubenetic_xscreensaver_function_table, + cubestack_xscreensaver_function_table, cubestorm_xscreensaver_function_table, + cubetwist_xscreensaver_function_table, cubicgrid_xscreensaver_function_table, cwaves_xscreensaver_function_table, cynosure_xscreensaver_function_table, @@ -57,6 +59,7 @@ extern struct xscreensaver_function_table deco_xscreensaver_function_table, deluxe_xscreensaver_function_table, demon_xscreensaver_function_table, + discoball_xscreensaver_function_table, discrete_xscreensaver_function_table, distort_xscreensaver_function_table, dnalogo_xscreensaver_function_table, @@ -103,6 +106,7 @@ extern struct xscreensaver_function_table halo_xscreensaver_function_table, helix_xscreensaver_function_table, hexadrop_xscreensaver_function_table, + hexstrut_xscreensaver_function_table, hilbert_xscreensaver_function_table, hopalong_xscreensaver_function_table, hydrostat_xscreensaver_function_table, @@ -183,6 +187,7 @@ extern struct xscreensaver_function_table speedmine_xscreensaver_function_table, spheremonics_xscreensaver_function_table, splitflap_xscreensaver_function_table, + splodesic_xscreensaver_function_table, spotlight_xscreensaver_function_table, sproingies_xscreensaver_function_table, squiral_xscreensaver_function_table, @@ -274,7 +279,9 @@ NSDictionary *make_function_table_dict(void) [NSValue valueWithPointer:&crystal_xscreensaver_function_table], @"crystal", [NSValue valueWithPointer:&cube21_xscreensaver_function_table], @"cube21", [NSValue valueWithPointer:&cubenetic_xscreensaver_function_table], @"cubenetic", + [NSValue valueWithPointer:&cubestack_xscreensaver_function_table], @"cubestack", [NSValue valueWithPointer:&cubestorm_xscreensaver_function_table], @"cubestorm", + [NSValue valueWithPointer:&cubetwist_xscreensaver_function_table], @"cubetwist", [NSValue valueWithPointer:&cubicgrid_xscreensaver_function_table], @"cubicgrid", [NSValue valueWithPointer:&cwaves_xscreensaver_function_table], @"cwaves", [NSValue valueWithPointer:&cynosure_xscreensaver_function_table], @"cynosure", @@ -283,6 +290,7 @@ NSDictionary *make_function_table_dict(void) [NSValue valueWithPointer:&deco_xscreensaver_function_table], @"deco", [NSValue valueWithPointer:&deluxe_xscreensaver_function_table], @"deluxe", [NSValue valueWithPointer:&demon_xscreensaver_function_table], @"demon", + [NSValue valueWithPointer:&discoball_xscreensaver_function_table], @"discoball", [NSValue valueWithPointer:&discrete_xscreensaver_function_table], @"discrete", [NSValue valueWithPointer:&distort_xscreensaver_function_table], @"distort", [NSValue valueWithPointer:&dnalogo_xscreensaver_function_table], @"dnalogo", @@ -329,6 +337,7 @@ NSDictionary *make_function_table_dict(void) [NSValue valueWithPointer:&halo_xscreensaver_function_table], @"halo", [NSValue valueWithPointer:&helix_xscreensaver_function_table], @"helix", [NSValue valueWithPointer:&hexadrop_xscreensaver_function_table], @"hexadrop", + [NSValue valueWithPointer:&hexstrut_xscreensaver_function_table], @"hexstrut", [NSValue valueWithPointer:&hilbert_xscreensaver_function_table], @"hilbert", [NSValue valueWithPointer:&hopalong_xscreensaver_function_table], @"hopalong", [NSValue valueWithPointer:&hydrostat_xscreensaver_function_table], @"hydrostat", @@ -409,6 +418,7 @@ NSDictionary *make_function_table_dict(void) [NSValue valueWithPointer:&speedmine_xscreensaver_function_table], @"speedmine", [NSValue valueWithPointer:&spheremonics_xscreensaver_function_table], @"spheremonics", [NSValue valueWithPointer:&splitflap_xscreensaver_function_table], @"splitflap", + [NSValue valueWithPointer:&splodesic_xscreensaver_function_table], @"splodesic", [NSValue valueWithPointer:&spotlight_xscreensaver_function_table], @"spotlight", [NSValue valueWithPointer:&sproingies_xscreensaver_function_table], @"sproingies", [NSValue valueWithPointer:&squiral_xscreensaver_function_table], @"squiral", diff --git a/OSX/iosgrabimage.m b/OSX/iosgrabimage.m deleted file mode 100644 index c861d736..00000000 --- a/OSX/iosgrabimage.m +++ /dev/null @@ -1,127 +0,0 @@ -/* xscreensaver, Copyright (c) 1992-2014 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. - */ - -/* This iOS code to choose and return a random image from the user's - * photo gallery. - * - * Much of the following written by: - * - * Created by David Oster on 6/23/12. - * Copyright (c) 2012 Google. All rights reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifdef USE_IPHONE // whole file - -#import -#import "grabscreen.h" -#import "yarandom.h" - -/* ALAssetsLibrary is an async API, so we need to fire it off and then - call a callback when it's done. Fortunately, this fits the same - interaction model already used in xscreensaver by load_image_async(), - so it works out nicely. - */ - -typedef struct { - void (*callback) (void *uiimage, const char *fn, int width, int height, - void *closure); - void *closure; - - ALAssetsLibrary *library; - NSMutableArray *assets; - -} ios_loader_data; - - -static void -ios_random_image_done (ios_loader_data *d, BOOL ok) -{ - UIImage *img = 0; - const char *fn = 0; - NSUInteger n = ok ? [d->assets count] : 0; - if (n > 0) { - ALAsset *asset = [d->assets objectAtIndex: random() % n]; - ALAssetRepresentation *rep = [asset defaultRepresentation]; - - // "fullScreenImage" returns a smaller image than "fullResolutionImage", - // but this function still takes a significant fraction of a second, - // causing a visible glitch in e.g. "glslideshow". - CGImageRef cgi = [rep fullScreenImage]; - if (cgi) { - UIImageOrientation orient = (UIImageOrientation) - [[asset valueForProperty:ALAssetPropertyOrientation] intValue]; - img = [UIImage imageWithCGImage: cgi - scale: 1 - orientation: orient]; - if (img) - fn = [[rep filename] cStringUsingEncoding:NSUTF8StringEncoding]; - } - } - - [d->assets release]; - [d->library release]; - - d->callback (img, fn, [img size].width, [img size].height, d->closure); - free (d); -} - - -void -ios_load_random_image (void (*callback) (void *uiimage, const char *fn, - int width, int height, - void *closure), - void *closure) -{ - ios_loader_data *d = (ios_loader_data *) calloc (1, sizeof(*d)); - d->callback = callback; - d->closure = closure; - - d->library = [[[ALAssetsLibrary alloc] init] retain]; - d->assets = [[NSMutableArray array] retain]; - - // The closures passed in here are called later, after we have returned. - // - [d->library enumerateGroupsWithTypes: ALAssetsGroupAll - usingBlock: ^(ALAssetsGroup *group, BOOL *stop) { - NSString *name = [group valueForProperty:ALAssetsGroupPropertyName]; - if ([name length]) { - [group enumerateAssetsUsingBlock: ^(ALAsset *asset, NSUInteger index, - BOOL *stop) { - if ([[asset valueForProperty: ALAssetPropertyType] - isEqual: ALAssetTypePhoto]) { - [d->assets addObject:asset]; - } - }]; - } - - if (! group) { // done - ios_random_image_done (d, YES); - } - } failureBlock:^(NSError *error) { - // E.g., ALAssetsLibraryErrorDomain: "The user has denied the - // application access to their media." - NSLog(@"reading Photo Library: %@", error); - ios_random_image_done (d, NO); - }]; -} - -#endif // USE_IPHONE - whole file diff --git a/OSX/osxgrabscreen.m b/OSX/osxgrabscreen.m deleted file mode 100644 index c7f4f15b..00000000 --- a/OSX/osxgrabscreen.m +++ /dev/null @@ -1,447 +0,0 @@ -/* xscreensaver, Copyright (c) 1992-2012 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. - */ - -/* This is the OSX implementation of desktop-grabbing and image-loading. - This code is invoked by "utils/grabclient.c", which is linked directly - in to each screen saver bundle. - - X11-based builds of the savers do not use this code (even on MacOS). - This is used only by the Cocoa build of the savers. - */ - -#import -#import -#ifndef USE_IPHONE -# import -#else -# import "SaverRunner.h" -#endif -#import "jwxyz-cocoa.h" -#import "grabscreen.h" -#import "colorbars.h" -#import "resources.h" -#import "usleep.h" - - -#ifdef USE_IPHONE -# define NSImage UIImage -#endif - - -#ifndef MAC_OS_X_VERSION_10_6 -# define MAC_OS_X_VERSION_10_6 1060 /* undefined in 10.4 SDK, grr */ -#endif - -#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 - - /* 10.4 code. - - This version of the code works on 10.4, but is flaky. There is - a better way to do it on 10.5 and newer, but taking this path, - then we are being compiled against the 10.4 SDK instead of the - 10.5 SDK, and the newer API is not available to us. - */ - -static void -copy_framebuffer_to_ximage (CGDirectDisplayID cgdpy, XImage *xim, - int window_x, int window_y) -{ - unsigned char *data = (unsigned char *) - CGDisplayAddressForPosition (cgdpy, window_x, window_y); - int bpp = CGDisplayBitsPerPixel (cgdpy); - int spp = CGDisplaySamplesPerPixel (cgdpy); - int bps = CGDisplayBitsPerSample (cgdpy); - int bpr = CGDisplayBytesPerRow (cgdpy); - - int y; - int ximw = xim->width; - int ximh = xim->height; - - uint32_t *odata = (uint32_t *) xim->data; - - switch (bpp) { - case 32: - if (spp != 3) abort(); - if (bps != 8) abort(); - int xwpl = xim->bytes_per_line/4; - for (y = 0; y < ximh; y++) { - // We can do this because the frame buffer and XImage are both ARGB 32. - // Both PPC and Intel use ARGB, viewed in word order (not byte-order). - memcpy (odata, data, ximw * 4); - odata += xwpl; - data += bpr; - } - break; - - case 16: - if (spp != 3) abort(); - if (bps != 5) abort(); - for (y = 0; y < ximh; y++) { - uint16_t *ip = (uint16_t *) data; - int x; - for (x = 0; x < ximw; x++) { - uint16_t p = *ip++; - // This should be ok on both PPC and Intel (ARGB, word order) - unsigned char r = (p >> 10) & 0x1F; - unsigned char g = (p >> 5) & 0x1F; - unsigned char b = (p ) & 0x1F; - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - uint32_t pixel = 0xFF000000 | (r << 16) | (g << 8) | b; - // XPutPixel (xim, x, y, pixel); - *odata++ = pixel; - } - data += bpr; - } - break; - - case 8: - { - /* Get the current palette of the display. */ - CGDirectPaletteRef pal = CGPaletteCreateWithDisplay (cgdpy); - - /* Map it to 32bpp pixels */ - uint32_t map[256]; - for (y = 0; y < 256; y++) { - CGDeviceColor c = CGPaletteGetColorAtIndex (pal, y); - unsigned char r = c.red * 255.0; - unsigned char g = c.green * 255.0; - unsigned char b = c.blue * 255.0; - uint32_t pixel = 0xFF000000 | (r << 16) | (g << 8) | b; - map[y] = pixel; - } - - for (y = 0; y < ximh; y++) { - unsigned char *ip = data; - int x; - for (x = 0; x < ximw; x++) { - *odata++ = map[*ip++]; - } - data += bpr; - } - CGPaletteRelease (pal); - } - break; - - default: - abort(); - break; - } -} - - -/* Loads an image into the Drawable, returning once the image is loaded. - */ -Bool -osx_grab_desktop_image (Screen *screen, Window xwindow, Drawable drawable, - XRectangle *geom_ret) -{ - Display *dpy = DisplayOfScreen (screen); - NSView *nsview = jwxyz_window_view (xwindow); - NSWindow *nswindow = [nsview window]; - XWindowAttributes xgwa; - int window_x, window_y; - Window unused; - - // Figure out where this window is on the screen. - // - XGetWindowAttributes (dpy, xwindow, &xgwa); - XTranslateCoordinates (dpy, xwindow, RootWindowOfScreen (screen), 0, 0, - &window_x, &window_y, &unused); - - // Use the size of the Drawable, not the Window. - { - Window r; - int x, y; - unsigned int w, h, bbw, d; - XGetGeometry (dpy, drawable, &r, &x, &y, &w, &h, &bbw, &d); - xgwa.width = w; - xgwa.height = h; - } - - // Create a tmp ximage to hold the screen data. - // - XImage *xim = XCreateImage (dpy, xgwa.visual, 32, ZPixmap, 0, 0, - xgwa.width, xgwa.height, 8, 0); - xim->data = (char *) malloc (xim->height * xim->bytes_per_line); - - - // Find the address in the frame buffer of the top left of this window. - // - CGDirectDisplayID cgdpy = 0; - { - CGPoint p; - // #### this isn't quite right for screen 2: it's offset slightly. - p.x = window_x; - p.y = window_y; - CGDisplayCount n; - CGGetDisplaysWithPoint (p, 1, &cgdpy, &n); - if (!cgdpy) abort(); - } - - // Paint a transparent "hole" in this window. - // - BOOL oopaque = [nswindow isOpaque]; - [nswindow setOpaque:NO]; - - [[NSColor clearColor] set]; - NSRectFill ([nsview frame]); - [[nswindow graphicsContext] flushGraphics]; - - - // Without this, we get a dozen black scanlines at the top. - // #### But with this, the screen saver loops, because calling this - // seems to implicitly mark the display as non-idle! - // CGDisplayCaptureWithOptions (cgdpy, kCGCaptureNoFill); - - // #### So let's try waiting for the vertical blank instead... - // Nope, that doesn't work. - // - // CGDisplayWaitForBeamPositionOutsideLines (cgdpy, 0, - // window_y + [nswindow frame].size.height); - - // #### Ok, try a busy-wait? - // Nope. - // - - // #### Ok, just fuckin' sleep! - // - usleep (100000); - - - // Pull the bits out of the frame buffer. - // - copy_framebuffer_to_ximage (cgdpy, xim, window_x, window_y); - - // CGDisplayRelease (cgdpy); - - // Make the window visible again. - // - [nswindow setOpaque:oopaque]; - - // Splat the XImage onto the target drawable (probably the window) - // and free the bits. - // - XGCValues gcv; - GC gc = XCreateGC (dpy, drawable, 0, &gcv); - XPutImage (dpy, drawable, gc, xim, 0, 0, 0, 0, xim->width, xim->height); - XFreeGC (dpy, gc); - - if (geom_ret) { - geom_ret->x = 0; - geom_ret->y = 0; - geom_ret->width = xim->width; - geom_ret->height = xim->height; - } - - XDestroyImage (xim); - return True; -} - - -#elif defined(USE_IPHONE) - - /* What a hack! - - On iOS, our application delegate, SaverRunner, grabs an image - of itself as a UIImage before mapping the XScreenSaverView. - In this code, we ask SaverRunner for that UIImage, then copy - it to the root window. - */ - -Bool -osx_grab_desktop_image (Screen *screen, Window xwindow, Drawable drawable, - XRectangle *geom_ret) -{ - SaverRunner *s = - (SaverRunner *) [[UIApplication sharedApplication] delegate]; - if (! s) - return False; - if (! [s isKindOfClass:[SaverRunner class]]) - return False; - UIImage *img = [s screenshot]; - if (! img) - return False; - jwxyz_draw_NSImage_or_CGImage (DisplayOfScreen (screen), drawable, - True, img, geom_ret, 0); - return True; -} - - -#else /* MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 - - 10.5+ code. - - This version of the code is simpler and more reliable, but - uses an API that only exist on 10.5 and newer, so we can only - use it if when being compiled against the 10.5 SDK or later. - */ - -/* Loads an image into the Drawable, returning once the image is loaded. - */ -Bool -osx_grab_desktop_image (Screen *screen, Window xwindow, Drawable drawable, - XRectangle *geom_ret) -{ - Display *dpy = DisplayOfScreen (screen); - NSView *nsview = jwxyz_window_view (xwindow); - XWindowAttributes xgwa; - int window_x, window_y; - Window unused; - - // Figure out where this window is on the screen. - // - XGetWindowAttributes (dpy, xwindow, &xgwa); - XTranslateCoordinates (dpy, xwindow, RootWindowOfScreen (screen), 0, 0, - &window_x, &window_y, &unused); - - // Grab only the rectangle of the screen underlying this window. - // - CGRect cgrect; - cgrect.origin.x = window_x; - cgrect.origin.y = window_y; - cgrect.size.width = xgwa.width; - cgrect.size.height = xgwa.height; - - /* If a password is required to unlock the screen, a large black - window will be on top of all of the desktop windows by the time - we reach here, making the screen-grab rather uninteresting. If - we move ourselves temporarily below the login-window windows - before capturing the image, we capture the real desktop as - intended. - */ - - // save our current level so we can restore it later - int oldLevel = [[nsview window] level]; - - [[nsview window] setLevel:CGWindowLevelForKey(kCGPopUpMenuWindowLevelKey)]; - - // Grab a screen shot of those windows below this one - // (hey, X11 can't do that!) - // - CGImageRef img = - CGWindowListCreateImage (cgrect, - kCGWindowListOptionOnScreenBelowWindow, - [[nsview window] windowNumber], - kCGWindowImageDefault); - - // put us back above the login windows so the screensaver is visible. - [[nsview window] setLevel:oldLevel]; - - if (! img) return False; - - // Render the grabbed CGImage into the Drawable. - jwxyz_draw_NSImage_or_CGImage (DisplayOfScreen (screen), drawable, - False, img, geom_ret, 0); - CGImageRelease (img); - return True; -} - -#endif /* 10.5+ code */ - - -# ifndef USE_IPHONE - -/* Returns the EXIF rotation property of the image, if any. - */ -static int -exif_rotation (const char *filename) -{ - /* As of 10.6, NSImage rotates according to EXIF by default: - http://developer.apple.com/mac/library/releasenotes/cocoa/appkit.html - So this function should return -1 when *running* on 10.6 systems. - But when running against older systems, we need to examine the image - to figure out its rotation. - */ - -# if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 /* 10.6 SDK */ - - /* When we have compiled against the 10.6 SDK, we know that we are - running on a 10.6 or later system. - */ - return -1; - -# else /* Compiled against 10.5 SDK or earlier */ - - /* If this selector exists, then we are running against a 10.6 runtime - that does automatic EXIF rotation (despite the fact that we were - compiled against the 10.5 or earlier SDK). So in that case, this - function should no-op. - */ - if ([NSImage instancesRespondToSelector: - @selector(initWithDataIgnoringOrientation:)]) - return -1; - - /* Otherwise, go ahead and figure out what the rotational characteristics - of this image are. */ - - - - /* This is a ridiculous amount of rigamarole to go through, but for some - reason the "Orientation" tag does not exist in the "NSImageEXIFData" - dictionary inside the NSBitmapImageRep of the NSImage. Several other - EXIF tags are there (e.g., shutter speed) but not orientation. WTF? - */ - CFStringRef s = CFStringCreateWithCString (NULL, filename, - kCFStringEncodingUTF8); - CFURLRef url = CFURLCreateWithFileSystemPath (NULL, s, - kCFURLPOSIXPathStyle, 0); - CGImageSourceRef cgimg = CGImageSourceCreateWithURL (url, NULL); - if (! cgimg) return -1; - - NSDictionary *props = (NSDictionary *) - CGImageSourceCopyPropertiesAtIndex (cgimg, 0, NULL); - int rot = [[props objectForKey:@"Orientation"] intValue]; - CFRelease (cgimg); - CFRelease (url); - CFRelease (s); - return rot; - -# endif /* 10.5 */ -} - -# endif /* USE_IPHONE */ - - - -/* Loads an image file and splats it onto the drawable. - The image is drawn as large as possible while preserving its aspect ratio. - If geom_ret is provided, the actual rectangle the rendered image takes - up will be returned there. - */ -Bool -osx_load_image_file (Screen *screen, Window xwindow, Drawable drawable, - const char *filename, XRectangle *geom_ret) -{ -# ifndef USE_IPHONE - - if (!filename || !*filename) return False; - - NSImage *img = [[NSImage alloc] initWithContentsOfFile: - [NSString stringWithCString:filename - encoding:NSUTF8StringEncoding]]; - if (!img) - return False; - - jwxyz_draw_NSImage_or_CGImage (DisplayOfScreen (screen), drawable, - True, img, geom_ret, - exif_rotation (filename)); - [img release]; - return True; - -# else /* USE_IPHONE */ - - /* This is handled differently: see grabclient.c and iosgrabimage.m. */ - return False; - -# endif /* USE_IPHONE */ -} diff --git a/OSX/seticon.pl b/OSX/seticon.pl index 69faf687..e62bb291 100755 --- a/OSX/seticon.pl +++ b/OSX/seticon.pl @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# Copyright © 2015 Dave Odell +# Copyright © 2015-2016 Dave Odell # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that @@ -18,7 +18,7 @@ use strict; use File::Temp; my $progname = $0; $progname =~ s@.*/@@g; -my ($version) = ('$Revision: 1.4 $' =~ m/\s(\d[.\d]+)\s/s); +my ($version) = ('$Revision: 1.5 $' =~ m/\s(\d[.\d]+)\s/s); my $verbose = 0; @@ -84,18 +84,20 @@ sub usage() { } sub main() { - my ($d, $src, $dst); + my ($src, @dst); while ($#ARGV >= 0) { $_ = shift @ARGV; if (m/^--?verbose$/s) { $verbose++; } elsif (m/^-v+$/s) { $verbose += length($_)-1; } - elsif (m/^-d$/s) { $d = 1; } - elsif (!defined($src)) { $src = $_; } - elsif (!defined($dst)) { $dst = $_; } - else { usage; } + elsif (m/^-d$/s) { $src = shift @ARGV; } + elsif (m/^-/s) { usage(); } + else { push @dst, $_; } + } + error ("no source") unless defined($src); + error ("no files") unless @dst; + foreach my $f (@dst) { + set_icon ($src, $f); } - usage() unless ($d && $src); - set_icon ($src, $dst); } main(); diff --git a/OSX/textclient-iOS.m b/OSX/textclient-iOS.m deleted file mode 100644 index 7e572919..00000000 --- a/OSX/textclient-iOS.m +++ /dev/null @@ -1,71 +0,0 @@ -/* xscreensaver, Copyright (c) 2012-2016 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. - * - * Loading URLs and returning the underlying text. - * - * This is necessary because iOS doesn't have Perl installed, so we can't - * run "xscreensaver-text" to do this. - */ - -#include "utils.h" - -#ifdef USE_IPHONE // whole file - -#include "textclient.h" - -char * -textclient_mobile_date_string (void) -{ - UIDevice *dd = [UIDevice currentDevice]; - NSString *name = [dd name]; // My iPhone - NSString *model = [dd model]; // iPad - // NSString *system = [dd systemName]; // iPhone OS - NSString *vers = [dd systemVersion]; // 5.0 - NSString *date = - [NSDateFormatter - localizedStringFromDate:[NSDate date] - dateStyle: NSDateFormatterMediumStyle - timeStyle: NSDateFormatterMediumStyle]; - NSString *nl = @"\n"; - - NSString *result = name; - result = [result stringByAppendingString: nl]; - result = [result stringByAppendingString: model]; - // result = [result stringByAppendingString: nl]; - // result = [result stringByAppendingString: system]; - result = [result stringByAppendingString: @" "]; - result = [result stringByAppendingString: vers]; - result = [result stringByAppendingString: nl]; - result = [result stringByAppendingString: nl]; - result = [result stringByAppendingString: date]; - result = [result stringByAppendingString: nl]; - result = [result stringByAppendingString: nl]; - return strdup ([result cStringUsingEncoding:NSISOLatin1StringEncoding]); -} - - -/* Returns the contents of the URL. */ -char * -textclient_mobile_url_string (Display *dpy, const char *url) -{ - NSURL *nsurl = - [NSURL URLWithString: - [NSString stringWithCString: url - encoding:NSISOLatin1StringEncoding]]; - NSString *body = - [NSString stringWithContentsOfURL: nsurl - encoding: NSUTF8StringEncoding - error: nil]; - return (body - ? strdup ([body cStringUsingEncoding:NSUTF8StringEncoding]) - : 0); -} - -#endif // USE_IPHONE -- whole file diff --git a/OSX/textclient-ios.m b/OSX/textclient-ios.m new file mode 100644 index 00000000..5db53114 --- /dev/null +++ b/OSX/textclient-ios.m @@ -0,0 +1,129 @@ +/* xscreensaver, Copyright (c) 2012-2016 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. + * + * Loading URLs and returning the underlying text. + * + * This is necessary because iOS doesn't have Perl installed, so we can't + * run "xscreensaver-text" to do this. + */ + +#include "utils.h" + +#ifdef USE_IPHONE // whole file + +#include "textclient.h" + +char * +textclient_mobile_date_string (void) +{ + UIDevice *dd = [UIDevice currentDevice]; + NSString *name = [dd name]; // My iPhone + NSString *model = [dd model]; // iPad + // NSString *system = [dd systemName]; // iPhone OS + NSString *vers = [dd systemVersion]; // 5.0 + NSString *date = + [NSDateFormatter + localizedStringFromDate:[NSDate date] + dateStyle: NSDateFormatterMediumStyle + timeStyle: NSDateFormatterMediumStyle]; + NSString *nl = @"\n"; + + NSString *result = name; + result = [result stringByAppendingString: nl]; + result = [result stringByAppendingString: model]; + // result = [result stringByAppendingString: nl]; + // result = [result stringByAppendingString: system]; + result = [result stringByAppendingString: @" "]; + result = [result stringByAppendingString: vers]; + result = [result stringByAppendingString: nl]; + result = [result stringByAppendingString: nl]; + result = [result stringByAppendingString: date]; + result = [result stringByAppendingString: nl]; + result = [result stringByAppendingString: nl]; + return strdup ([result cStringUsingEncoding:NSISOLatin1StringEncoding]); +} + + +@interface TextLoader : NSObject +@property (nonatomic, retain) NSURL *url; +@property (nonatomic, retain) NSString *result; +@end + +@implementation TextLoader +{ + NSURL *_url; + NSString *_result; +} + ++ (TextLoader *) sharedLoader +{ + static TextLoader *singleton = nil; + @synchronized(self) { + if (!singleton) + singleton = [[self alloc] init]; + } + return singleton; +} + +- (void) startLoading +{ + // NSLog(@"textclient thread loading %@", self.url); + self.result = [NSString stringWithContentsOfURL: self.url + encoding: NSUTF8StringEncoding + error: nil]; + // NSLog(@"textclient thread finished %@ (length %d)", self.url, + // (unsigned int) [self.result length]); +} + +@end + + + +/* Returns the contents of the URL. + Loads the URL in a background thread: if the URL has not yet loaded, + this will return NULL. Once the URL has completely loaded, the full + contents will be returned. Calling this again after that starts the + URL loading again. + */ +char * +textclient_mobile_url_string (Display *dpy, const char *url) +{ + TextLoader *loader = [TextLoader sharedLoader]; + NSString *result = [loader result]; + + // Since this is a singleton, it's possible that if hack #1 starts + // URL #1 loading and then quickly exits, and then hack #2 asks for + // URL #2, it might get URL #1 instead. Oh well, who cares. + + if (result) { // Thread finished + // NSLog(@"textclient finished %s (length %d)", url, + // (unsigned int) [result length]); + char *s = strdup ([result cStringUsingEncoding:NSUTF8StringEncoding]); + loader.url = nil; + loader.result = nil; + return s; + + } else if ([loader url]) { // Waiting on thread + // NSLog(@"textclient waiting..."); + return 0; + + } else { // Launch thread + // NSLog(@"textclient launching %s...", url); + loader.url = + [NSURL URLWithString: + [NSString stringWithCString: url + encoding:NSISOLatin1StringEncoding]]; + [NSThread detachNewThreadSelector: @selector(startLoading) + toTarget: loader withObject: nil]; + return 0; + } +} + +#endif // USE_IPHONE -- whole file diff --git a/OSX/update-info-plist.pl b/OSX/update-info-plist.pl index 2b7968c3..72040c56 100755 --- a/OSX/update-info-plist.pl +++ b/OSX/update-info-plist.pl @@ -27,7 +27,7 @@ use IO::Compress::Gzip qw(gzip $GzipError); my ($exec_dir, $progname) = ($0 =~ m@^(.*?)/([^/]+)$@); -my ($version) = ('$Revision: 1.45 $' =~ m/\s(\d[.\d]+)\s/s); +my ($version) = ('$Revision: 1.46 $' =~ m/\s(\d[.\d]+)\s/s); $ENV{PATH} = "/usr/local/bin:$ENV{PATH}"; # for seticon $ENV{PATH} = "/opt/local/bin:$ENV{PATH}"; # for macports wget @@ -463,7 +463,10 @@ sub update($) { } } - set_icon ($app_dir); + # MacOS 10.12: codesign says "resource fork, Finder information, or + # similar detritus not allowed" if any bundle has an Icon\r file. + # set_icon ($app_dir); + set_thumb ($app_dir); # enable_gc ($app_dir); fix_coretext ($app_dir) diff --git a/OSX/xscreensaver.xcodeproj/project.pbxproj b/OSX/xscreensaver.xcodeproj/project.pbxproj index ae75ecf7..9e35b4f5 100644 --- a/OSX/xscreensaver.xcodeproj/project.pbxproj +++ b/OSX/xscreensaver.xcodeproj/project.pbxproj @@ -203,9 +203,12 @@ AF777A4909B660B500EA3033 /* PBXTargetDependency */, AF777A4709B660B500EA3033 /* PBXTargetDependency */, AF777A4509B660B500EA3033 /* PBXTargetDependency */, + AFEE108A1D15EBF900AAC8F7 /* PBXTargetDependency */, AF777A4309B660B500EA3033 /* PBXTargetDependency */, + AFEE106B1D13424C00AAC8F7 /* PBXTargetDependency */, AF4FF4D70D52CD0D00666F98 /* PBXTargetDependency */, AF777A4109B660B500EA3033 /* PBXTargetDependency */, + AF3938381D0FBF5300205406 /* PBXTargetDependency */, AF777A3F09B660B500EA3033 /* PBXTargetDependency */, AFEC23EB1CB6ED0800DE138F /* PBXTargetDependency */, AF777A3D09B660B500EA3033 /* PBXTargetDependency */, @@ -231,6 +234,7 @@ AF777A1D09B660B300EA3033 /* PBXTargetDependency */, AF777A1B09B660B300EA3033 /* PBXTargetDependency */, AF777A1909B660B300EA3033 /* PBXTargetDependency */, + AF1B0FC51D7AB5740011DBE4 /* PBXTargetDependency */, AF4F10F0143450C300E34F3F /* PBXTargetDependency */, AFC0E8C91CDC6125008CAFAC /* PBXTargetDependency */, AF777A1709B660B300EA3033 /* PBXTargetDependency */, @@ -270,6 +274,7 @@ AFE2A46F0E2E908E00ADB298 /* PBXTargetDependency */, AF7779EB09B660B000EA3033 /* PBXTargetDependency */, AFCF835C1AF5B683008BB7E1 /* PBXTargetDependency */, + AFEE10A91D17E32100AAC8F7 /* PBXTargetDependency */, AF7779E909B660B000EA3033 /* PBXTargetDependency */, AF7779E709B660B000EA3033 /* PBXTargetDependency */, AF7779E509B660B000EA3033 /* PBXTargetDependency */, @@ -379,6 +384,18 @@ AF1ADA1A1850186B00932759 /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = AF1ADA171850180E00932759 /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; AF1ADA1B18501B3D00932759 /* SaverRunner.icns in Resources */ = {isa = PBXBuildFile; fileRef = AF2D522513E954A0002AA818 /* SaverRunner.icns */; }; AF1ADA1F18504A4F00932759 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; }; + AF1B0FAE1D7AB4740011DBE4 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; + AF1B0FB01D7AB4740011DBE4 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; }; + AF1B0FB11D7AB4740011DBE4 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; }; + AF1B0FB21D7AB4740011DBE4 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; }; + AF1B0FB31D7AB4740011DBE4 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + AF1B0FB41D7AB4740011DBE4 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; }; + AF1B0FB51D7AB4740011DBE4 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; }; + AF1B0FB61D7AB4740011DBE4 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; }; + AF1B0FC01D7AB5330011DBE4 /* hexstrut.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF1B0FBF1D7AB5210011DBE4 /* hexstrut.xml */; }; + AF1B0FC11D7AB53A0011DBE4 /* hexstrut.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF1B0FBF1D7AB5210011DBE4 /* hexstrut.xml */; }; + AF1B0FC21D7AB54D0011DBE4 /* hexstrut.c in Sources */ = {isa = PBXBuildFile; fileRef = AF1B0FBE1D7AB5210011DBE4 /* hexstrut.c */; }; + AF1B0FC31D7AB5500011DBE4 /* hexstrut.c in Sources */ = {isa = PBXBuildFile; fileRef = AF1B0FBE1D7AB5210011DBE4 /* hexstrut.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AF1FD713158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; }; AF1FD714158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; }; AF1FD715158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; @@ -1506,6 +1523,18 @@ AF35EB260E6382BA00691F2F /* jigsaw.c in Sources */ = {isa = PBXBuildFile; fileRef = AF35EB250E6382BA00691F2F /* jigsaw.c */; }; AF3633FC18530DD90086A439 /* sparkle_dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = AF3633F918530DD90086A439 /* sparkle_dsa_pub.pem */; }; AF3633FD18530DD90086A439 /* Updater.m in Sources */ = {isa = PBXBuildFile; fileRef = AF3633FB18530DD90086A439 /* Updater.m */; }; + AF3938211D0FBD6A00205406 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; + AF3938231D0FBD6A00205406 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; }; + AF3938241D0FBD6A00205406 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; }; + AF3938251D0FBD6A00205406 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; }; + AF3938261D0FBD6A00205406 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + AF3938271D0FBD6A00205406 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; }; + AF3938281D0FBD6A00205406 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; }; + AF3938291D0FBD6A00205406 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; }; + AF3938331D0FBF0100205406 /* discoball.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF3938321D0FBEC800205406 /* discoball.xml */; }; + AF3938341D0FBF1900205406 /* discoball.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3938311D0FBEC800205406 /* discoball.c */; }; + AF3938351D0FBF1D00205406 /* discoball.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3938311D0FBEC800205406 /* discoball.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; + AF3938361D0FBF2700205406 /* discoball.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF3938321D0FBEC800205406 /* discoball.xml */; }; AF39483E15A164680000FFCD /* jigsaw.c in Sources */ = {isa = PBXBuildFile; fileRef = AF35EB250E6382BA00691F2F /* jigsaw.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AF39483F15A1647A0000FFCD /* jigsaw.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258CF0988A468000655EE /* jigsaw.xml */; }; AF39E289198A11F60064A58D /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; @@ -1729,8 +1758,9 @@ AF4FF4D10D52CC8400666F98 /* cubicgrid.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4FF4D00D52CC8400666F98 /* cubicgrid.c */; }; AF4FF4D40D52CCAA00666F98 /* cubicgrid.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF4FF4D30D52CCAA00666F98 /* cubicgrid.xml */; }; AF51FD3915845FCB00E5741F /* SaverRunner.icns in Resources */ = {isa = PBXBuildFile; fileRef = AF2D522513E954A0002AA818 /* SaverRunner.icns */; }; - AF561DF615969BC3007CA5ED /* iosgrabimage.m in Sources */ = {isa = PBXBuildFile; fileRef = AF561DF515969BC3007CA5ED /* iosgrabimage.m */; }; + AF561DF615969BC3007CA5ED /* grabclient-ios.m in Sources */ = {isa = PBXBuildFile; fileRef = AF561DF515969BC3007CA5ED /* grabclient-ios.m */; }; AF561DF815969C5B007CA5ED /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF561DF715969C5B007CA5ED /* AssetsLibrary.framework */; }; + AF5BEEFD1D2AFE21002E6D51 /* OCRAStd.otf in Resources */ = {isa = PBXBuildFile; fileRef = AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */; }; AF5C9AFD1A0CCE6E00B0147A /* dangerball.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258920988A468000655EE /* dangerball.xml */; }; AF5C9B001A0CCE6E00B0147A /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; AF5C9B021A0CCE6E00B0147A /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; }; @@ -2762,7 +2792,7 @@ AF9D466D09B5109C006E59CF /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; AF9D467909B5110B006E59CF /* decayscreen.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D467809B5110B006E59CF /* decayscreen.c */; }; AF9D467A09B51126006E59CF /* decayscreen.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258930988A468000655EE /* decayscreen.xml */; }; - AF9D468F09B51567006E59CF /* osxgrabscreen.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9D468E09B51567006E59CF /* osxgrabscreen.m */; }; + AF9D468F09B51567006E59CF /* grabclient-osx.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9D468E09B51567006E59CF /* grabclient-osx.m */; }; AF9D473809B52EE0006E59CF /* colorbars.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D473609B52EE0006E59CF /* colorbars.c */; }; AF9D473909B52EE0006E59CF /* colorbars.h in Headers */ = {isa = PBXBuildFile; fileRef = AF9D473709B52EE0006E59CF /* colorbars.h */; }; AF9D474A09B5300A006E59CF /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; @@ -3047,7 +3077,7 @@ AFC43E7C1C6AA78800C89999 /* OCRAStd.otf in Resources */ = {isa = PBXBuildFile; fileRef = AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */; }; AFC7592D158D8E8B00C5458E /* textclient.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC7592B158D8E8B00C5458E /* textclient.c */; }; AFC7592E158D8E8B00C5458E /* textclient.h in Headers */ = {isa = PBXBuildFile; fileRef = AFC7592C158D8E8B00C5458E /* textclient.h */; }; - AFC75930158D9A7A00C5458E /* textclient-iOS.m in Sources */ = {isa = PBXBuildFile; fileRef = AFC7592F158D9A7A00C5458E /* textclient-iOS.m */; }; + AFC75930158D9A7A00C5458E /* textclient-ios.m in Sources */ = {isa = PBXBuildFile; fileRef = AFC7592F158D9A7A00C5458E /* textclient-ios.m */; }; AFCCCBB009BFE4B000353F4D /* rdbomb.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFCCCBAD09BFE4B000353F4D /* rdbomb.xml */; }; AFCCCBB309BFE51900353F4D /* thornbird.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259230988A469000655EE /* thornbird.xml */; }; AFCF453715986A2100E6E8CC /* dnalogo.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77787609B653DC00EA3033 /* dnalogo.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; @@ -3231,6 +3261,42 @@ AFEC23E91CB6EC7F00DE138F /* dymaxionmap.c in Sources */ = {isa = PBXBuildFile; fileRef = AFEC23E41CB6EBC400DE138F /* dymaxionmap.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AFEC68371BD6CA85004C1B64 /* OCRAStd.otf in Resources */ = {isa = PBXBuildFile; fileRef = AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */; }; AFEC68391BD6CDF9004C1B64 /* YearlReg.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AFEC68381BD6CDF9004C1B64 /* YearlReg.ttf */; }; + AFEE10541D13406000AAC8F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; + AFEE10561D13406000AAC8F7 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; }; + AFEE10571D13406000AAC8F7 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; }; + AFEE10581D13406000AAC8F7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; }; + AFEE10591D13406000AAC8F7 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + AFEE105A1D13406000AAC8F7 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; }; + AFEE105B1D13406000AAC8F7 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; }; + AFEE105C1D13406000AAC8F7 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; }; + AFEE10661D1341F600AAC8F7 /* cubetwist.c in Sources */ = {isa = PBXBuildFile; fileRef = AFEE10641D1341E300AAC8F7 /* cubetwist.c */; }; + AFEE10671D1341FA00AAC8F7 /* cubetwist.c in Sources */ = {isa = PBXBuildFile; fileRef = AFEE10641D1341E300AAC8F7 /* cubetwist.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; + AFEE10681D1341FE00AAC8F7 /* cubetwist.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFEE10651D1341E300AAC8F7 /* cubetwist.xml */; }; + AFEE10691D13420700AAC8F7 /* cubetwist.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFEE10651D1341E300AAC8F7 /* cubetwist.xml */; }; + AFEE10731D15EB0800AAC8F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; + AFEE10751D15EB0800AAC8F7 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; }; + AFEE10761D15EB0800AAC8F7 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; }; + AFEE10771D15EB0800AAC8F7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; }; + AFEE10781D15EB0800AAC8F7 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + AFEE10791D15EB0800AAC8F7 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; }; + AFEE107A1D15EB0800AAC8F7 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; }; + AFEE107B1D15EB0800AAC8F7 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; }; + AFEE10851D15EBB900AAC8F7 /* cubestack.c in Sources */ = {isa = PBXBuildFile; fileRef = AFEE10831D15EBA600AAC8F7 /* cubestack.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; + AFEE10861D15EBC800AAC8F7 /* cubestack.c in Sources */ = {isa = PBXBuildFile; fileRef = AFEE10831D15EBA600AAC8F7 /* cubestack.c */; }; + AFEE10871D15EBD900AAC8F7 /* cubestack.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFEE10841D15EBA600AAC8F7 /* cubestack.xml */; }; + AFEE10881D15EBDC00AAC8F7 /* cubestack.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFEE10841D15EBA600AAC8F7 /* cubestack.xml */; }; + AFEE10921D17E20B00AAC8F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; + AFEE10941D17E20B00AAC8F7 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; }; + AFEE10951D17E20B00AAC8F7 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; }; + AFEE10961D17E20B00AAC8F7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; }; + AFEE10971D17E20B00AAC8F7 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + AFEE10981D17E20B00AAC8F7 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; }; + AFEE10991D17E20B00AAC8F7 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; }; + AFEE109A1D17E20B00AAC8F7 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; }; + AFEE10A41D17E2BA00AAC8F7 /* splodesic.c in Sources */ = {isa = PBXBuildFile; fileRef = AFEE10A21D17E2B300AAC8F7 /* splodesic.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; + AFEE10A51D17E2C500AAC8F7 /* splodesic.c in Sources */ = {isa = PBXBuildFile; fileRef = AFEE10A21D17E2B300AAC8F7 /* splodesic.c */; }; + AFEE10A61D17E2C900AAC8F7 /* splodesic.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFEE10A31D17E2B300AAC8F7 /* splodesic.xml */; }; + AFEE10A71D17E2CD00AAC8F7 /* splodesic.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFEE10A31D17E2B300AAC8F7 /* splodesic.xml */; }; AFF1BA0F19A96D8B0016A88D /* lament_model.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF1BA0E19A96D8B0016A88D /* lament_model.c */; }; AFF1BA1019A96D8B0016A88D /* lament_model.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF1BA0E19A96D8B0016A88D /* lament_model.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AFF2868617860E830050A578 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; @@ -3695,6 +3761,20 @@ remoteGlobalIDString = AF1A17610D6D6EE3008AF328; remoteInfo = LCDscrub; }; + AF1B0FA91D7AB4740011DBE4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF4808C0098C3B6C00FB32B8; + remoteInfo = jwxyz; + }; + AF1B0FC41D7AB5740011DBE4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF1B0FA71D7AB4740011DBE4; + remoteInfo = Hexstrut; + }; AF32D9E20F3AD0B40080F535 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; @@ -3744,6 +3824,20 @@ remoteGlobalIDString = AF1AD9E118500F9F00932759; remoteInfo = XScreenSaverUpdater; }; + AF39381C1D0FBD6A00205406 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF4808C0098C3B6C00FB32B8; + remoteInfo = jwxyz; + }; + AF3938371D0FBF5300205406 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF39381A1D0FBD6A00205406; + remoteInfo = Discoball; + }; AF39E284198A11F60064A58D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; @@ -6985,6 +7079,48 @@ remoteGlobalIDString = AFEC23CD1CB6EAE100DE138F; remoteInfo = DymaxionMap; }; + AFEE104F1D13406000AAC8F7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF4808C0098C3B6C00FB32B8; + remoteInfo = jwxyz; + }; + AFEE106A1D13424C00AAC8F7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AFEE104D1D13406000AAC8F7; + remoteInfo = CubeTwist; + }; + AFEE106E1D15EB0700AAC8F7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF4808C0098C3B6C00FB32B8; + remoteInfo = jwxyz; + }; + AFEE10891D15EBF900AAC8F7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AFEE106C1D15EB0700AAC8F7; + remoteInfo = CubeStack; + }; + AFEE108D1D17E20B00AAC8F7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF4808C0098C3B6C00FB32B8; + remoteInfo = jwxyz; + }; + AFEE10A81D17E32100AAC8F7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AFEE108B1D17E20B00AAC8F7; + remoteInfo = Splodesic; + }; AFF2868117860E830050A578 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; @@ -7130,6 +7266,9 @@ AF1ADA0118500FA100932759 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; AF1ADA151850157400932759 /* Updater.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = Updater.xib; sourceTree = SOURCE_ROOT; }; AF1ADA171850180E00932759 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = ""; }; + AF1B0FBC1D7AB4740011DBE4 /* Hexstrut.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Hexstrut.saver; sourceTree = BUILT_PRODUCTS_DIR; }; + AF1B0FBE1D7AB5210011DBE4 /* hexstrut.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hexstrut.c; path = hacks/glx/hexstrut.c; sourceTree = ""; }; + AF1B0FBF1D7AB5210011DBE4 /* hexstrut.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = hexstrut.xml; sourceTree = ""; }; AF241F81107C38DF00046A84 /* dropshadow.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = dropshadow.c; path = hacks/glx/dropshadow.c; sourceTree = ""; }; AF241F82107C38DF00046A84 /* dropshadow.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = dropshadow.h; path = hacks/glx/dropshadow.h; sourceTree = ""; }; AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; @@ -7162,6 +7301,9 @@ AF3633FA18530DD90086A439 /* Updater.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Updater.h; sourceTree = ""; }; AF3633FB18530DD90086A439 /* Updater.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Updater.m; sourceTree = ""; }; AF3633FE18530DFF0086A439 /* Updater.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Updater.plist; sourceTree = ""; }; + AF39382F1D0FBD6A00205406 /* Discoball.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Discoball.saver; sourceTree = BUILT_PRODUCTS_DIR; }; + AF3938311D0FBEC800205406 /* discoball.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = discoball.c; path = hacks/glx/discoball.c; sourceTree = ""; }; + AF3938321D0FBEC800205406 /* discoball.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = discoball.xml; sourceTree = ""; }; AF39E296198A11F60064A58D /* WindupRobot.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WindupRobot.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AF39E2A0198A13F50064A58D /* robot-wireframe.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "robot-wireframe.c"; path = "hacks/glx/robot-wireframe.c"; sourceTree = ""; }; AF39E2A1198A13F50064A58D /* winduprobot.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = winduprobot.c; path = hacks/glx/winduprobot.c; sourceTree = ""; }; @@ -7324,7 +7466,7 @@ AF4FF4D30D52CCAA00666F98 /* cubicgrid.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = cubicgrid.xml; sourceTree = ""; }; AF56019B157DAA3D00DB2055 /* iSaverRunner.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = iSaverRunner.xib; sourceTree = ""; }; AF561DF3159651A7007CA5ED /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/AudioToolbox.framework; sourceTree = DEVELOPER_DIR; }; - AF561DF515969BC3007CA5ED /* iosgrabimage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iosgrabimage.m; sourceTree = ""; }; + AF561DF515969BC3007CA5ED /* grabclient-ios.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "grabclient-ios.m"; sourceTree = ""; }; AF561DF715969C5B007CA5ED /* AssetsLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AssetsLibrary.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/AssetsLibrary.framework; sourceTree = DEVELOPER_DIR; }; AF5C9B0D1A0CCE6E00B0147A /* Cityflow.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Cityflow.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AF5C9B0F1A0CCF4E00B0147A /* cityflow.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = cityflow.xml; sourceTree = ""; }; @@ -7479,7 +7621,7 @@ AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */ = {isa = PBXFileReference; fileEncoding = 5; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = XScreenSaverSubclass.m; sourceTree = ""; }; AF9D467609B5109C006E59CF /* DecayScreen.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DecayScreen.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AF9D467809B5110B006E59CF /* decayscreen.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = decayscreen.c; path = hacks/decayscreen.c; sourceTree = ""; }; - AF9D468E09B51567006E59CF /* osxgrabscreen.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = osxgrabscreen.m; sourceTree = ""; }; + AF9D468E09B51567006E59CF /* grabclient-osx.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = "grabclient-osx.m"; sourceTree = ""; }; AF9D473609B52EE0006E59CF /* colorbars.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = colorbars.c; path = utils/colorbars.c; sourceTree = ""; }; AF9D473709B52EE0006E59CF /* colorbars.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = colorbars.h; path = utils/colorbars.h; sourceTree = ""; }; AF9D475409B5300A006E59CF /* SlideScreen.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SlideScreen.saver; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -7914,7 +8056,7 @@ AFC43E731C68364B00C89999 /* PxPlus_IBM_VGA8.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = PxPlus_IBM_VGA8.ttf; sourceTree = ""; }; AFC7592B158D8E8B00C5458E /* textclient.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = textclient.c; path = utils/textclient.c; sourceTree = ""; }; AFC7592C158D8E8B00C5458E /* textclient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = textclient.h; path = utils/textclient.h; sourceTree = ""; }; - AFC7592F158D9A7A00C5458E /* textclient-iOS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "textclient-iOS.m"; path = "OSX/textclient-iOS.m"; sourceTree = ""; }; + AFC7592F158D9A7A00C5458E /* textclient-ios.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "textclient-ios.m"; path = "OSX/textclient-ios.m"; sourceTree = ""; }; AFCCCBAD09BFE4B000353F4D /* rdbomb.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = rdbomb.xml; sourceTree = ""; }; AFCF83501AF5B515008BB7E1 /* SplitFlap.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SplitFlap.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AFCF83521AF5B5FD008BB7E1 /* splitflap.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = splitflap.xml; sourceTree = ""; }; @@ -8005,7 +8147,7 @@ AFE1FD410981E32E00F7970E /* InvertedSlider.h */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.h; path = InvertedSlider.h; sourceTree = ""; }; AFE1FD420981E32E00F7970E /* InvertedSlider.m */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.objc; path = InvertedSlider.m; sourceTree = ""; }; AFE1FD430981E32E00F7970E /* jwxyz.h */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.h; name = jwxyz.h; path = ../jwxyz/jwxyz.h; sourceTree = ""; }; - AFE1FD440981E32E00F7970E /* jwxyz.m */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.objc; path = ../jwxyz/jwxyz.m; sourceTree = ""; }; + AFE1FD440981E32E00F7970E /* jwxyz.m */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.objc; name = jwxyz.m; path = ../jwxyz/jwxyz.m; sourceTree = ""; }; AFE1FD470981E32E00F7970E /* PrefsReader.h */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.h; path = PrefsReader.h; sourceTree = ""; }; AFE1FD480981E32E00F7970E /* PrefsReader.m */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.objc; path = PrefsReader.m; sourceTree = ""; }; AFE1FD530981E3CB00F7970E /* erase.c */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.c; name = erase.c; path = utils/erase.c; sourceTree = ""; }; @@ -8048,6 +8190,15 @@ AFEC23E51CB6EBDA00DE138F /* dymaxionmap.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = dymaxionmap.xml; sourceTree = ""; }; AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = OCRAStd.otf; sourceTree = ""; }; AFEC68381BD6CDF9004C1B64 /* YearlReg.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = YearlReg.ttf; sourceTree = ""; }; + AFEE10621D13406000AAC8F7 /* CubeTwist.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CubeTwist.saver; sourceTree = BUILT_PRODUCTS_DIR; }; + AFEE10641D1341E300AAC8F7 /* cubetwist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cubetwist.c; path = hacks/glx/cubetwist.c; sourceTree = ""; }; + AFEE10651D1341E300AAC8F7 /* cubetwist.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = cubetwist.xml; sourceTree = ""; }; + AFEE10811D15EB0800AAC8F7 /* CubeStack.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CubeStack.saver; sourceTree = BUILT_PRODUCTS_DIR; }; + AFEE10831D15EBA600AAC8F7 /* cubestack.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cubestack.c; path = hacks/glx/cubestack.c; sourceTree = ""; }; + AFEE10841D15EBA600AAC8F7 /* cubestack.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = cubestack.xml; sourceTree = ""; }; + AFEE10A01D17E20B00AAC8F7 /* Splodesic.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Splodesic.saver; sourceTree = BUILT_PRODUCTS_DIR; }; + AFEE10A21D17E2B300AAC8F7 /* splodesic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = splodesic.c; path = hacks/glx/splodesic.c; sourceTree = ""; }; + AFEE10A31D17E2B300AAC8F7 /* splodesic.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = splodesic.xml; sourceTree = ""; }; AFF1BA0E19A96D8B0016A88D /* lament_model.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lament_model.c; path = hacks/glx/lament_model.c; sourceTree = ""; }; 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 = ""; }; @@ -8067,9 +8218,9 @@ CE3D01661B76F4C100993C75 /* TestX11.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TestX11.saver; sourceTree = BUILT_PRODUCTS_DIR; }; CE3D01681B76F83E00993C75 /* testx11.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = testx11.xml; sourceTree = ""; }; CE3D016A1B76F8E200993C75 /* testx11.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testx11.c; path = hacks/testx11.c; sourceTree = ""; }; - CE43C2BE1C055157004C2BC6 /* jwxyz-cocoa.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "../jwxyz/jwxyz-cocoa.m"; sourceTree = ""; }; + CE43C2BE1C055157004C2BC6 /* jwxyz-cocoa.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "jwxyz-cocoa.m"; path = "../jwxyz/jwxyz-cocoa.m"; sourceTree = ""; }; CE5564591C25141000645458 /* jwxyz-gl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "jwxyz-gl.c"; path = "../jwxyz/jwxyz-gl.c"; sourceTree = ""; }; - CE8206741B89048800E35532 /* jwxyz-cocoa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "../jwxyz/jwxyz-cocoa.h"; sourceTree = ""; }; + CE8206741B89048800E35532 /* jwxyz-cocoa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jwxyz-cocoa.h"; path = "../jwxyz/jwxyz-cocoa.h"; sourceTree = ""; }; CE8C49CC1C011CC400BA2DCF /* jwxyzI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jwxyzI.h; path = ../jwxyz/jwxyzI.h; sourceTree = ""; }; CE8EA1C11C35CF10002D1020 /* jwxyz-common.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "jwxyz-common.c"; path = "../jwxyz/jwxyz-common.c"; sourceTree = ""; }; CE9289D119BD00E200961F22 /* async_netdb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = async_netdb.c; path = utils/async_netdb.c; sourceTree = ""; }; @@ -8159,6 +8310,20 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF1B0FAF1D7AB4740011DBE4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AF1B0FB01D7AB4740011DBE4 /* libjwxyz.a in Frameworks */, + AF1B0FB11D7AB4740011DBE4 /* ScreenSaver.framework in Frameworks */, + AF1B0FB21D7AB4740011DBE4 /* QuartzCore.framework in Frameworks */, + AF1B0FB31D7AB4740011DBE4 /* Cocoa.framework in Frameworks */, + AF1B0FB41D7AB4740011DBE4 /* Carbon.framework in Frameworks */, + AF1B0FB51D7AB4740011DBE4 /* OpenGL.framework in Frameworks */, + AF1B0FB61D7AB4740011DBE4 /* libz.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF32D9E80F3AD0B40080F535 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -8215,6 +8380,20 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF3938221D0FBD6A00205406 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AF3938231D0FBD6A00205406 /* libjwxyz.a in Frameworks */, + AF3938241D0FBD6A00205406 /* ScreenSaver.framework in Frameworks */, + AF3938251D0FBD6A00205406 /* QuartzCore.framework in Frameworks */, + AF3938261D0FBD6A00205406 /* Cocoa.framework in Frameworks */, + AF3938271D0FBD6A00205406 /* Carbon.framework in Frameworks */, + AF3938281D0FBD6A00205406 /* OpenGL.framework in Frameworks */, + AF3938291D0FBD6A00205406 /* libz.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF39E28A198A11F60064A58D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -11467,6 +11646,48 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AFEE10551D13406000AAC8F7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AFEE10561D13406000AAC8F7 /* libjwxyz.a in Frameworks */, + AFEE10571D13406000AAC8F7 /* ScreenSaver.framework in Frameworks */, + AFEE10581D13406000AAC8F7 /* QuartzCore.framework in Frameworks */, + AFEE10591D13406000AAC8F7 /* Cocoa.framework in Frameworks */, + AFEE105A1D13406000AAC8F7 /* Carbon.framework in Frameworks */, + AFEE105B1D13406000AAC8F7 /* OpenGL.framework in Frameworks */, + AFEE105C1D13406000AAC8F7 /* libz.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AFEE10741D15EB0800AAC8F7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AFEE10751D15EB0800AAC8F7 /* libjwxyz.a in Frameworks */, + AFEE10761D15EB0800AAC8F7 /* ScreenSaver.framework in Frameworks */, + AFEE10771D15EB0800AAC8F7 /* QuartzCore.framework in Frameworks */, + AFEE10781D15EB0800AAC8F7 /* Cocoa.framework in Frameworks */, + AFEE10791D15EB0800AAC8F7 /* Carbon.framework in Frameworks */, + AFEE107A1D15EB0800AAC8F7 /* OpenGL.framework in Frameworks */, + AFEE107B1D15EB0800AAC8F7 /* libz.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AFEE10931D17E20B00AAC8F7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AFEE10941D17E20B00AAC8F7 /* libjwxyz.a in Frameworks */, + AFEE10951D17E20B00AAC8F7 /* ScreenSaver.framework in Frameworks */, + AFEE10961D17E20B00AAC8F7 /* QuartzCore.framework in Frameworks */, + AFEE10971D17E20B00AAC8F7 /* Cocoa.framework in Frameworks */, + AFEE10981D17E20B00AAC8F7 /* Carbon.framework in Frameworks */, + AFEE10991D17E20B00AAC8F7 /* OpenGL.framework in Frameworks */, + AFEE109A1D17E20B00AAC8F7 /* libz.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AFF2868717860E830050A578 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -11557,7 +11778,7 @@ 080E96DDFE201D6D7F000001 /* libjwxyz */ = { isa = PBXGroup; children = ( - AF561DF515969BC3007CA5ED /* iosgrabimage.m */, + AF561DF515969BC3007CA5ED /* grabclient-ios.m */, AFE1FD410981E32E00F7970E /* InvertedSlider.h */, AFE1FD420981E32E00F7970E /* InvertedSlider.m */, AF2D8F301CEBA10300198014 /* jwxyz-timers.c */, @@ -11572,7 +11793,7 @@ AF6048F8157C07C600CA21E4 /* jwzgles.c */, AF6048F9157C07C600CA21E4 /* jwzgles.h */, AF6048FA157C07C600CA21E4 /* jwzglesI.h */, - AF9D468E09B51567006E59CF /* osxgrabscreen.m */, + AF9D468E09B51567006E59CF /* grabclient-osx.m */, AFE1FD470981E32E00F7970E /* PrefsReader.h */, AFE1FD480981E32E00F7970E /* PrefsReader.m */, 32CA4F630368D1EE00C91783 /* xscreensaver_Prefix.pch */, @@ -11840,6 +12061,11 @@ AFACE8881CC83458008B24CD /* EnergyStream.saver */, AFA211A11CD59DAF00C0D2A1 /* RaverHoop.saver */, AFC0E8C01CDC601A008CAFAC /* Hydrostat.saver */, + AF39382F1D0FBD6A00205406 /* Discoball.saver */, + AFEE10621D13406000AAC8F7 /* CubeTwist.saver */, + AFEE10811D15EB0800AAC8F7 /* CubeStack.saver */, + AFEE10A01D17E20B00AAC8F7 /* Splodesic.saver */, + AF1B0FBC1D7AB4740011DBE4 /* Hexstrut.saver */, ); name = Products; path = ..; @@ -12158,9 +12384,12 @@ AFA563290993957100F3E977 /* crackberg.c */, AFA563660993970F00F3E977 /* cube21.c */, AFA55D770993589300F3E977 /* cubenetic.c */, + AFEE10831D15EBA600AAC8F7 /* cubestack.c */, AFA55FF309936C4500F3E977 /* cubestorm.c */, + AFEE10641D1341E300AAC8F7 /* cubetwist.c */, AF4FF4D00D52CC8400666F98 /* cubicgrid.c */, AF480DD1098F4F6200FB32B8 /* dangerball.c */, + AF3938311D0FBEC800205406 /* discoball.c */, AF77787609B653DC00EA3033 /* dnalogo.c */, AF0839AA09930C4900277BE9 /* dolphin.c */, AF241F81107C38DF00046A84 /* dropshadow.c */, @@ -12205,6 +12434,7 @@ AF7777E709B64CF700EA3033 /* glslideshow.c */, AFA55C8C099349EE00F3E977 /* glsnake.c */, AFD56E080996A07A00BA26F7 /* gltext.c */, + AF1B0FBE1D7AB5210011DBE4 /* hexstrut.c */, AF78D18A142DD96E002AAF77 /* hilbert.c */, AFC0E8C21CDC60A9008CAFAC /* hydrostat.c */, AFA55F59099362DF00F3E977 /* hypertorus.c */, @@ -12266,6 +12496,7 @@ AFA55D940993590F00F3E977 /* spheremonics.c */, AFCF83541AF5B5FD008BB7E1 /* splitflap.c */, AFCF83531AF5B5FD008BB7E1 /* splitflap_obj.c */, + AFEE10A21D17E2B300AAC8F7 /* splodesic.c */, AFA55A470993351F00F3E977 /* sproingies.c */, AF7778C009B65C0F00EA3033 /* sproingies.h */, AFA55A480993351F00F3E977 /* sproingiewrap.c */, @@ -12359,7 +12590,9 @@ AFC2588D0988A468000655EE /* crystal.xml */, AFC2588E0988A468000655EE /* cube21.xml */, AFC2588F0988A468000655EE /* cubenetic.xml */, + AFEE10841D15EBA600AAC8F7 /* cubestack.xml */, AFC258900988A468000655EE /* cubestorm.xml */, + AFEE10651D1341E300AAC8F7 /* cubetwist.xml */, AF4FF4D30D52CCAA00666F98 /* cubicgrid.xml */, AFF4634B0C44046500EE6509 /* cwaves.xml */, AFC258910988A468000655EE /* cynosure.xml */, @@ -12368,6 +12601,7 @@ AFC258940988A468000655EE /* deco.xml */, AFC258950988A468000655EE /* deluxe.xml */, AFC258960988A468000655EE /* demon.xml */, + AF3938321D0FBEC800205406 /* discoball.xml */, AFC258970988A468000655EE /* discrete.xml */, AFC258980988A468000655EE /* distort.xml */, AF77787909B6545E00EA3033 /* dnalogo.xml */, @@ -12419,6 +12653,7 @@ AFC258C30988A468000655EE /* halo.xml */, AFC258C40988A468000655EE /* helix.xml */, AFB591BC178B81E600EA4005 /* hexadrop.xml */, + AF1B0FBF1D7AB5210011DBE4 /* hexstrut.xml */, AF78D18E142DD99A002AAF77 /* hilbert.xml */, AFC258C50988A468000655EE /* hopalong.xml */, AFC258C60988A468000655EE /* hyperball.xml */, @@ -12514,6 +12749,7 @@ AFC259130988A469000655EE /* spheremonics.xml */, AFC259140988A469000655EE /* spiral.xml */, AFCF83521AF5B5FD008BB7E1 /* splitflap.xml */, + AFEE10A31D17E2B300AAC8F7 /* splodesic.xml */, AFC259150988A469000655EE /* spotlight.xml */, AFC259160988A469000655EE /* sproingies.xml */, AFC259170988A469000655EE /* squiral.xml */, @@ -12608,7 +12844,7 @@ AF77780909B64F4900EA3033 /* texfont.h */, AFC7592B158D8E8B00C5458E /* textclient.c */, AFC7592C158D8E8B00C5458E /* textclient.h */, - AFC7592F158D9A7A00C5458E /* textclient-iOS.m */, + AFC7592F158D9A7A00C5458E /* textclient-ios.m */, AFA211881CD1AA1800C0D2A1 /* textclient-mobile.c */, AFDA11231934424D003D397F /* thread_util.c */, AFDA11241934424D003D397F /* thread_util.h */, @@ -12831,6 +13067,26 @@ productReference = AF1AD9E218500F9F00932759 /* XScreenSaverUpdater.app */; productType = "com.apple.product-type.application"; }; + AF1B0FA71D7AB4740011DBE4 /* Hexstrut */ = { + isa = PBXNativeTarget; + buildConfigurationList = AF1B0FB91D7AB4740011DBE4 /* Build configuration list for PBXNativeTarget "Hexstrut" */; + buildPhases = ( + AF1B0FAA1D7AB4740011DBE4 /* Resources */, + AF1B0FAC1D7AB4740011DBE4 /* Sources */, + AF1B0FAF1D7AB4740011DBE4 /* Frameworks */, + AF1B0FB71D7AB4740011DBE4 /* Rez */, + AF1B0FB81D7AB4740011DBE4 /* Run Update Info Plist */, + ); + buildRules = ( + ); + dependencies = ( + AF1B0FA81D7AB4740011DBE4 /* PBXTargetDependency */, + ); + name = Hexstrut; + productName = DangerBall; + productReference = AF1B0FBC1D7AB4740011DBE4 /* Hexstrut.saver */; + productType = "com.apple.product-type.bundle"; + }; AF32D9E00F3AD0B40080F535 /* RubikBlocks */ = { isa = PBXNativeTarget; buildConfigurationList = AF32D9F10F3AD0B40080F535 /* Build configuration list for PBXNativeTarget "RubikBlocks" */; @@ -12911,6 +13167,26 @@ productReference = AF35E8A00E63823600691F2F /* Jigsaw.saver */; productType = "com.apple.product-type.bundle"; }; + AF39381A1D0FBD6A00205406 /* Discoball */ = { + isa = PBXNativeTarget; + buildConfigurationList = AF39382C1D0FBD6A00205406 /* Build configuration list for PBXNativeTarget "Discoball" */; + buildPhases = ( + AF39381D1D0FBD6A00205406 /* Resources */, + AF39381F1D0FBD6A00205406 /* Sources */, + AF3938221D0FBD6A00205406 /* Frameworks */, + AF39382A1D0FBD6A00205406 /* Rez */, + AF39382B1D0FBD6A00205406 /* Run Update Info Plist */, + ); + buildRules = ( + ); + dependencies = ( + AF39381B1D0FBD6A00205406 /* PBXTargetDependency */, + ); + name = Discoball; + productName = DangerBall; + productReference = AF39382F1D0FBD6A00205406 /* Discoball.saver */; + productType = "com.apple.product-type.bundle"; + }; AF39E282198A11F60064A58D /* WindupRobot */ = { isa = PBXNativeTarget; buildConfigurationList = AF39E293198A11F60064A58D /* Build configuration list for PBXNativeTarget "WindupRobot" */; @@ -17576,6 +17852,66 @@ productReference = AFEC23E21CB6EAE100DE138F /* DymaxionMap.saver */; productType = "com.apple.product-type.bundle"; }; + AFEE104D1D13406000AAC8F7 /* CubeTwist */ = { + isa = PBXNativeTarget; + buildConfigurationList = AFEE105F1D13406000AAC8F7 /* Build configuration list for PBXNativeTarget "CubeTwist" */; + buildPhases = ( + AFEE10501D13406000AAC8F7 /* Resources */, + AFEE10521D13406000AAC8F7 /* Sources */, + AFEE10551D13406000AAC8F7 /* Frameworks */, + AFEE105D1D13406000AAC8F7 /* Rez */, + AFEE105E1D13406000AAC8F7 /* Run Update Info Plist */, + ); + buildRules = ( + ); + dependencies = ( + AFEE104E1D13406000AAC8F7 /* PBXTargetDependency */, + ); + name = CubeTwist; + productName = DangerBall; + productReference = AFEE10621D13406000AAC8F7 /* CubeTwist.saver */; + productType = "com.apple.product-type.bundle"; + }; + AFEE106C1D15EB0700AAC8F7 /* CubeStack */ = { + isa = PBXNativeTarget; + buildConfigurationList = AFEE107E1D15EB0800AAC8F7 /* Build configuration list for PBXNativeTarget "CubeStack" */; + buildPhases = ( + AFEE106F1D15EB0800AAC8F7 /* Resources */, + AFEE10711D15EB0800AAC8F7 /* Sources */, + AFEE10741D15EB0800AAC8F7 /* Frameworks */, + AFEE107C1D15EB0800AAC8F7 /* Rez */, + AFEE107D1D15EB0800AAC8F7 /* Run Update Info Plist */, + ); + buildRules = ( + ); + dependencies = ( + AFEE106D1D15EB0700AAC8F7 /* PBXTargetDependency */, + ); + name = CubeStack; + productName = DangerBall; + productReference = AFEE10811D15EB0800AAC8F7 /* CubeStack.saver */; + productType = "com.apple.product-type.bundle"; + }; + AFEE108B1D17E20B00AAC8F7 /* Splodesic */ = { + isa = PBXNativeTarget; + buildConfigurationList = AFEE109D1D17E20B00AAC8F7 /* Build configuration list for PBXNativeTarget "Splodesic" */; + buildPhases = ( + AFEE108E1D17E20B00AAC8F7 /* Resources */, + AFEE10901D17E20B00AAC8F7 /* Sources */, + AFEE10931D17E20B00AAC8F7 /* Frameworks */, + AFEE109B1D17E20B00AAC8F7 /* Rez */, + AFEE109C1D17E20B00AAC8F7 /* Run Update Info Plist */, + ); + buildRules = ( + ); + dependencies = ( + AFEE108C1D17E20B00AAC8F7 /* PBXTargetDependency */, + ); + name = Splodesic; + productName = DangerBall; + productReference = AFEE10A01D17E20B00AAC8F7 /* Splodesic.saver */; + productType = "com.apple.product-type.bundle"; + }; AFF2867F17860E830050A578 /* QuasiCrystal */ = { isa = PBXNativeTarget; buildConfigurationList = AFF2868F17860E830050A578 /* Build configuration list for PBXNativeTarget "QuasiCrystal" */; @@ -17702,11 +18038,799 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0730; + LastUpgradeCheck = 0800; TargetAttributes = { + AF08398F09930B6B00277BE9 = { + DevelopmentTeam = 4627ATJELP; + }; + AF083A32099311D700277BE9 = { + DevelopmentTeam = 4627ATJELP; + }; + AF0DC7AB0C4C73F600D76972 = { + DevelopmentTeam = 4627ATJELP; + }; + AF0DCA420C4CBB0D00D76972 = { + DevelopmentTeam = 4627ATJELP; + }; + AF137D410F075C9B004DE3B2 = { + DevelopmentTeam = 4627ATJELP; + }; + AF1A17610D6D6EE3008AF328 = { + DevelopmentTeam = 4627ATJELP; + }; + AF1AD9E118500F9F00932759 = { + DevelopmentTeam = 4627ATJELP; + }; + AF1B0FA71D7AB4740011DBE4 = { + DevelopmentTeam = 4627ATJELP; + }; + AF32D9E00F3AD0B40080F535 = { + DevelopmentTeam = 4627ATJELP; + }; + AF3581BF1431D47B00E09C51 = { + DevelopmentTeam = 4627ATJELP; + }; + AF3581FB143330F900E09C51 = { + DevelopmentTeam = 4627ATJELP; + }; + AF35E88A0E63823600691F2F = { + DevelopmentTeam = 4627ATJELP; + }; + AF39381A1D0FBD6A00205406 = { + DevelopmentTeam = 4627ATJELP; + }; + AF39E282198A11F60064A58D = { + DevelopmentTeam = 4627ATJELP; + }; + AF3C71450D624BF50030CC0D = { + DevelopmentTeam = 4627ATJELP; + }; + AF46E9CF1CBBA2B300240FBC = { + DevelopmentTeam = 4627ATJELP; + }; + AF476FB5099D154F001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF476FDA099D1686001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF47704C099D4385001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF477169099D4786001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF47717F099D4803001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF4771A7099D4949001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF4771DB099D4D9A001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF4771F2099D4E63001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF477208099D4EE8001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF47721E099D4F67001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF477253099D5717001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF47726B099D57B9001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF477283099D5926001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF477382099D65A1001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF47739A099D6648001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF4773C1099D67B9001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF477401099D69E7001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF477426099D7C70001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF477442099D7D33001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF477483099D89E4001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF477499099D8A74001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF4774B4099D8B5F001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF4774CE099D8BFF001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF47755D099D9A1A001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF477583099D9C28001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF47759F099D9CF7001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF4775D8099D9F69001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF4775F2099DA030001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF477613099DA26C001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF477644099DA6D0001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF47765A099DA78E001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF477670099DA849001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF47768F099DAA6F001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF4776AA099DABDD001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF4776C0099DAC8A001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF4776DB099DADDF001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF4776F1099DAE7A001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF47770D099DAF9F001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF477723099DB044001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF477752099DB61E001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF477774099DB965001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF477790099DBA90001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF4777D1099DC183001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF4778AB099DDB79001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF4778C7099DDCAE001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF4778E8099DDDC8001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF477909099DE379001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF47792A099DE4C7001F091E = { + DevelopmentTeam = 4627ATJELP; + }; + AF4808C0098C3B6C00FB32B8 = { + DevelopmentTeam = 4627ATJELP; + }; + AF480AAF098C669800FB32B8 = { + DevelopmentTeam = 4627ATJELP; + }; + AF480C49098E301400FB32B8 = { + DevelopmentTeam = 4627ATJELP; + }; + AF480D58098EED3D00FB32B8 = { + DevelopmentTeam = 4627ATJELP; + }; + AF480D59098EED5100FB32B8 = { + DevelopmentTeam = 4627ATJELP; + }; + AF480D5A098EED5E00FB32B8 = { + DevelopmentTeam = 4627ATJELP; + }; + AF480D72098EEDDE00FB32B8 = { + DevelopmentTeam = 4627ATJELP; + }; + AF4810EB09909FBA00FB32B8 = { + DevelopmentTeam = 4627ATJELP; + }; + AF4812500990CE2700FB32B8 = { + DevelopmentTeam = 4627ATJELP; + }; + AF4812B30990D3D900FB32B8 = { + DevelopmentTeam = 4627ATJELP; + }; + AF48DEEF0A0C25E000F94CF9 = { + DevelopmentTeam = 4627ATJELP; + }; + AF4A3449102A593600A81B2A = { + DevelopmentTeam = 4627ATJELP; + }; + AF4FD6E60CE7A486005EE58E = { + DevelopmentTeam = 4627ATJELP; + }; + AF4FF4930D52CA0800666F98 = { + DevelopmentTeam = 4627ATJELP; + }; + AF4FF4BA0D52CBDE00666F98 = { + DevelopmentTeam = 4627ATJELP; + }; + AF5C9AF91A0CCE6E00B0147A = { + DevelopmentTeam = 4627ATJELP; + }; + AF63A7F11AB4EDDB00593C75 = { + DevelopmentTeam = 4627ATJELP; + }; + AF63F2471C3465BE0033E133 = { + DevelopmentTeam = 4627ATJELP; + }; + AF63F4501C34682A0033E133 = { + DevelopmentTeam = 4627ATJELP; + }; + AF63F4781C3469FC0033E133 = { + DevelopmentTeam = 4627ATJELP; + }; + AF6423F2099FF9C2000F4CD4 = { + DevelopmentTeam = 4627ATJELP; + }; + AF6425CC09A18855000F4CD4 = { + DevelopmentTeam = 4627ATJELP; + }; + AF6425EC09A189EC000F4CD4 = { + DevelopmentTeam = 4627ATJELP; + }; + AF64260F09A18D6C000F4CD4 = { + DevelopmentTeam = 4627ATJELP; + }; + AF64262C09A18F54000F4CD4 = { + DevelopmentTeam = 4627ATJELP; + }; + AF64264F09A19229000F4CD4 = { + DevelopmentTeam = 4627ATJELP; + }; + AF64267B09A194B0000F4CD4 = { + DevelopmentTeam = 4627ATJELP; + }; + AF64277109A1D37A000F4CD4 = { + DevelopmentTeam = 4627ATJELP; + }; + AF6427A809A2DE36000F4CD4 = { + DevelopmentTeam = 4627ATJELP; + }; + AF68A47E19196CF800D41CD1 = { + DevelopmentTeam = 4627ATJELP; + }; + AF73FF221A09877F00E485E9 = { + DevelopmentTeam = 4627ATJELP; + }; + AF7510FF1782B5B900380EA1 = { + DevelopmentTeam = 4627ATJELP; + }; + AF7776E409B63ABF00EA3033 = { + DevelopmentTeam = 4627ATJELP; + }; + AF77771A09B6416100EA3033 = { + DevelopmentTeam = 4627ATJELP; + }; + AF77773E09B6446500EA3033 = { + DevelopmentTeam = 4627ATJELP; + }; + AF77777409B6497800EA3033 = { + DevelopmentTeam = 4627ATJELP; + }; + AF77778E09B64A5200EA3033 = { + DevelopmentTeam = 4627ATJELP; + }; + AF7777A809B64B2600EA3033 = { + DevelopmentTeam = 4627ATJELP; + }; + AF7777D009B64C6B00EA3033 = { + DevelopmentTeam = 4627ATJELP; + }; + AF7777EA09B64E3100EA3033 = { + DevelopmentTeam = 4627ATJELP; + }; + AF77781009B6504400EA3033 = { + DevelopmentTeam = 4627ATJELP; + }; + AF77784409B6528100EA3033 = { + DevelopmentTeam = 4627ATJELP; + }; + AF77786109B6536000EA3033 = { + DevelopmentTeam = 4627ATJELP; + }; + AF77787F09B6563500EA3033 = { + DevelopmentTeam = 4627ATJELP; + }; + AF7778A509B659C800EA3033 = { + DevelopmentTeam = 4627ATJELP; + }; + AF78D175142DD8F3002AAF77 = { + DevelopmentTeam = 4627ATJELP; + }; + AF794F64099748450059A8B0 = { + DevelopmentTeam = 4627ATJELP; + }; + AF794F8E09974A320059A8B0 = { + DevelopmentTeam = 4627ATJELP; + }; + AF794FCD09974FA60059A8B0 = { + DevelopmentTeam = 4627ATJELP; + }; + AF7ACFC019FF0A9200BD752B = { + DevelopmentTeam = 4627ATJELP; + }; AF918977158FC00A002B5D1E = { DevelopmentTeam = 4627ATJELP; }; + AF97572D099C317000B05160 = { + DevelopmentTeam = 4627ATJELP; + }; + AF975775099C374A00B05160 = { + DevelopmentTeam = 4627ATJELP; + }; + AF9757C2099C3E6300B05160 = { + DevelopmentTeam = 4627ATJELP; + }; + AF975808099C41D500B05160 = { + DevelopmentTeam = 4627ATJELP; + }; + AF975865099C475900B05160 = { + DevelopmentTeam = 4627ATJELP; + }; + AF975A36099C681F00B05160 = { + DevelopmentTeam = 4627ATJELP; + }; + AF975A6C099C6AB200B05160 = { + DevelopmentTeam = 4627ATJELP; + }; + AF975A86099C6BC300B05160 = { + DevelopmentTeam = 4627ATJELP; + }; + AF975AD7099C6EB100B05160 = { + DevelopmentTeam = 4627ATJELP; + }; + AF975AFC099C6FE400B05160 = { + DevelopmentTeam = 4627ATJELP; + }; + AF975C12099C8C1500B05160 = { + DevelopmentTeam = 4627ATJELP; + }; + AF975C3D099C8DCF00B05160 = { + DevelopmentTeam = 4627ATJELP; + }; + AF975C5D099C8F3F00B05160 = { + DevelopmentTeam = 4627ATJELP; + }; + AF975D52099CA0F000B05160 = { + DevelopmentTeam = 4627ATJELP; + }; + AF976FBB0989CAA2001F8B92 = { + DevelopmentTeam = 4627ATJELP; + }; + AF9770290989D1E6001F8B92 = { + DevelopmentTeam = 4627ATJELP; + }; + AF9770660989D2F6001F8B92 = { + DevelopmentTeam = 4627ATJELP; + }; + AF9771D60989DC4A001F8B92 = { + DevelopmentTeam = 4627ATJELP; + }; + AF998EDA0A083DB30051049D = { + DevelopmentTeam = 4627ATJELP; + }; + AF9D466609B5109C006E59CF = { + DevelopmentTeam = 4627ATJELP; + }; + AF9D474409B5300A006E59CF = { + DevelopmentTeam = 4627ATJELP; + }; + AF9D475F09B53166006E59CF = { + DevelopmentTeam = 4627ATJELP; + }; + AF9D48DB09B53322006E59CF = { + DevelopmentTeam = 4627ATJELP; + }; + AF9D48F409B535DA006E59CF = { + DevelopmentTeam = 4627ATJELP; + }; + AF9D492B09B53CBA006E59CF = { + DevelopmentTeam = 4627ATJELP; + }; + AF9D495409B53FC9006E59CF = { + DevelopmentTeam = 4627ATJELP; + }; + AF9D496C09B5411D006E59CF = { + DevelopmentTeam = 4627ATJELP; + }; + AF9D499709B544C2006E59CF = { + DevelopmentTeam = 4627ATJELP; + }; + AF9D4C6909B59F27006E59CF = { + DevelopmentTeam = 4627ATJELP; + }; + AF9D4CE709B5AA8E006E59CF = { + DevelopmentTeam = 4627ATJELP; + }; + AF9D4D7E09B5B2DC006E59CF = { + DevelopmentTeam = 4627ATJELP; + }; + AF9D4DAF09B5B71E006E59CF = { + DevelopmentTeam = 4627ATJELP; + }; + AF9D4DEC09B5BB19006E59CF = { + DevelopmentTeam = 4627ATJELP; + }; + AF9E7EBE190F4C1B00A8B01F = { + DevelopmentTeam = 4627ATJELP; + }; + AFA2118C1CD59DAF00C0D2A1 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA3392E0B058505002B0E7D = { + DevelopmentTeam = 4627ATJELP; + }; + AFA33BC60B058740002B0E7D = { + DevelopmentTeam = 4627ATJELP; + }; + AFA33C020B058E17002B0E7D = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55946099330B000F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA5596D0993317900F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA559920993322100F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA559B50993328000F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA559CF0993330600F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55A030993340300F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55A20099334A000F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55A790993364300F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55ACF09933CEF00F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55B0909933E0500F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55B2509933E8D00F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55B7909933F7200F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55B9109933FDA00F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55BAB099340CE00F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55BE40993429100F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55C0E0993431300F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55C77099349A600F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55CA909934BB200F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55CCC09934CE400F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55D3C0993565300F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55D620993584B00F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55D7F099358C400F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55DC809935D7000F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55DF009935E4900F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55E0D09935EDC00F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55E2F09935F8E00F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55E4E09935FF900F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55EC7099360E300F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55F06099361B700F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55F2A0993622F00F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55F420993629000F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55F720993643600F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55FD309936BFA00F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA55FF909936C6D00F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA5601409936CC800F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA5603209936D5100F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA5604A09936E2100F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA5606209936F3800F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA560AE0993718D00F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA560FD0993781600F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA56119099378CB00F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA5615609937C0D00F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA5617B09937CF100F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA5619D09937D7E00F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA562060993849F00F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA5621F0993852500F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA562BF099392C600F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA562DA099393C900F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA562F20993943B00F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA563130993951000F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA56331099395ED00F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA56351099396C000F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA56379099397B300F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFA563A4099398BB00F3E977 = { + DevelopmentTeam = 4627ATJELP; + }; + AFACE8731CC83458008B24CD = { + DevelopmentTeam = 4627ATJELP; + }; + AFB591A7178B812C00EA4005 = { + DevelopmentTeam = 4627ATJELP; + }; + AFBFE74B178642DC00432B21 = { + DevelopmentTeam = 4627ATJELP; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 0; + }; + }; + }; + AFBFE767178647FE00432B21 = { + DevelopmentTeam = 4627ATJELP; + }; + AFC0E8AB1CDC601A008CAFAC = { + DevelopmentTeam = 4627ATJELP; + }; + AFCF833B1AF5B515008BB7E1 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD51B1B0F063B4A00471C02 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD56DF10996A03800BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD56EAE0996A72600BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD56EDA0996A95700BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD56F0B0996AAFA00BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD56F230996AB8A00BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD56F4F0996AEEE00BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD56F6B0996B01600BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD56F8C0996B09400BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD56FA30996B10F00BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD56FB90996B18F00BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD56FCF0996B20900BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD56FF80996B43800BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD5700F0996B4CC00BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD570260996B56D00BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD570430996B61600BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD570590996B6A300BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD5706F0996B72700BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD570850996B80300BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD5709B0996B88E00BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD570B10996B93000BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD570C90996B9F800BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD570EA0996BBBF00BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD571130996BE9300BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD5712C0996BF2E00BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD571430996C01700BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD571590996C0CE00BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD571B50996D9DC00BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD572220996E4A300BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD5726D0996EE8500BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD572A50996F99600BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD572C20996FC0F00BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD572F9099701C000BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFD5735D0997411200BA26F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFDA658E178A52B70070D24B = { + DevelopmentTeam = 4627ATJELP; + }; + AFE2A4560E2E904600ADB298 = { + DevelopmentTeam = 4627ATJELP; + }; + AFE30BE80E52B14700CCF4A5 = { + DevelopmentTeam = 4627ATJELP; + }; + AFE6A1820CDD7B2E002805BF = { + DevelopmentTeam = 4627ATJELP; + }; + AFE6A41B0CDD7FAA002805BF = { + DevelopmentTeam = 4627ATJELP; + }; + AFEC23CD1CB6EAE100DE138F = { + DevelopmentTeam = 4627ATJELP; + }; + AFEE104D1D13406000AAC8F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFEE106C1D15EB0700AAC8F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFEE108B1D17E20B00AAC8F7 = { + DevelopmentTeam = 4627ATJELP; + }; + AFF2867F17860E830050A578 = { + DevelopmentTeam = 4627ATJELP; + }; + AFF3C9E817CCAC440028F240 = { + DevelopmentTeam = 4627ATJELP; + }; + AFF463360C4403E400EE6509 = { + DevelopmentTeam = 4627ATJELP; + }; + AFF463580C440AEF00EE6509 = { + DevelopmentTeam = 4627ATJELP; + }; + AFFAB31519158CE40020F021 = { + DevelopmentTeam = 4627ATJELP; + }; + CE3D01511B76F4C100993C75 = { + DevelopmentTeam = 4627ATJELP; + }; }; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "xscreensaver" */; @@ -17872,9 +18996,12 @@ AFA563130993951000F3E977 /* Crackberg */, AFA56351099396C000F3E977 /* Cube21 */, AFA55D620993584B00F3E977 /* Cubenetic */, + AFEE106C1D15EB0700AAC8F7 /* CubeStack */, AFA55FD309936BFA00F3E977 /* CubeStorm */, + AFEE104D1D13406000AAC8F7 /* CubeTwist */, AF4FF4BA0D52CBDE00666F98 /* CubicGrid */, AF4810EB09909FBA00FB32B8 /* DangerBall */, + AF39381A1D0FBD6A00205406 /* Discoball */, AF77786109B6536000EA3033 /* DNAlogo */, AFEC23CD1CB6EAE100DE138F /* DymaxionMap */, AFACE8731CC83458008B24CD /* EnergyStream */, @@ -17900,6 +19027,7 @@ AF7777D009B64C6B00EA3033 /* GLSlideshow */, AFA55C77099349A600F3E977 /* GLSnake */, AFD56DF10996A03800BA26F7 /* GLText */, + AF1B0FA71D7AB4740011DBE4 /* Hexstrut */, AF78D175142DD8F3002AAF77 /* Hilbert */, AFC0E8AB1CDC601A008CAFAC /* Hydrostat */, AFA55F420993629000F3E977 /* Hypertorus */, @@ -17940,6 +19068,7 @@ AFE30BE80E52B14700CCF4A5 /* Sonar */, AFA55D7F099358C400F3E977 /* Spheremonics */, AFCF833B1AF5B515008BB7E1 /* SplitFlap */, + AFEE108B1D17E20B00AAC8F7 /* Splodesic */, AFA55A20099334A000F3E977 /* Sproingies */, AFA55A030993340300F3E977 /* Stairs */, AF77781009B6504400EA3033 /* StarWars */, @@ -18037,6 +19166,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF1B0FAA1D7AB4740011DBE4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AF1B0FC11D7AB53A0011DBE4 /* hexstrut.xml in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF32D9E30F3AD0B40080F535 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -18072,6 +19209,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF39381D1D0FBD6A00205406 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AF3938331D0FBF0100205406 /* discoball.xml in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF39E285198A11F60064A58D /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -18886,6 +20031,7 @@ AF918ABF158FC53D002B5D1E /* atunnel.xml in Resources */, AF918AC0158FC53D002B5D1E /* barcode.xml in Resources */, AF73FF3D1A0988C500E485E9 /* binaryring.xml in Resources */, + AFEE10681D1341FE00AAC8F7 /* cubetwist.xml in Resources */, AF918AC1158FC53D002B5D1E /* blaster.xml in Resources */, AF918AC2158FC53D002B5D1E /* blinkbox.xml in Resources */, AF918AC3158FC53D002B5D1E /* blitspin.xml in Resources */, @@ -18913,6 +20059,7 @@ AF918ADA158FC53D002B5D1E /* crystal.xml in Resources */, AF918ADB158FC53D002B5D1E /* cube21.xml in Resources */, AF918ADC158FC53D002B5D1E /* cubenetic.xml in Resources */, + AFEE10881D15EBDC00AAC8F7 /* cubestack.xml in Resources */, AF918ADD158FC53D002B5D1E /* cubestorm.xml in Resources */, AF918ADE158FC53D002B5D1E /* cubicgrid.xml in Resources */, AF918ADF158FC53D002B5D1E /* cwaves.xml in Resources */, @@ -18923,6 +20070,7 @@ AF918AE4158FC53D002B5D1E /* deluxe.xml in Resources */, AF918AE5158FC53D002B5D1E /* demon.xml in Resources */, AF918AE6158FC53D002B5D1E /* discrete.xml in Resources */, + AF3938361D0FBF2700205406 /* discoball.xml in Resources */, AF918AE7158FC53D002B5D1E /* distort.xml in Resources */, AFCF453815986A3000E6E8CC /* dnalogo.xml in Resources */, AFEC23E81CB6EC6800DE138F /* dymaxionmap.xml in Resources */, @@ -18968,6 +20116,7 @@ AF918B12158FC53D002B5D1E /* halo.xml in Resources */, AF918B13158FC53D002B5D1E /* helix.xml in Resources */, AFB591BF178B81E600EA4005 /* hexadrop.xml in Resources */, + AF1B0FC01D7AB5330011DBE4 /* hexstrut.xml in Resources */, AF918B14158FC53D002B5D1E /* hilbert.xml in Resources */, AF918B15158FC53D002B5D1E /* hopalong.xml in Resources */, AFC0E8C71CDC60DE008CAFAC /* hydrostat.xml in Resources */, @@ -18981,8 +20130,8 @@ AF918B1F158FC53D002B5D1E /* jigglypuff.xml in Resources */, AF39483F15A1647A0000FFCD /* jigsaw.xml in Resources */, AF918B22158FC53D002B5D1E /* juggler3d.xml in Resources */, - AF918B23158FC53D002B5D1E /* julia.xml in Resources */, AFB8A69C1782BF6C004EDB85 /* kaleidocycle.xml in Resources */, + AF918B23158FC53D002B5D1E /* julia.xml in Resources */, AF918B24158FC53D002B5D1E /* kaleidescope.xml in Resources */, AF918B25158FC53D002B5D1E /* klein.xml in Resources */, AF918B26158FC53D002B5D1E /* kumppa.xml in Resources */, @@ -19048,6 +20197,7 @@ AF918B67158FC53E002B5D1E /* speedmine.xml in Resources */, AF918B69158FC53E002B5D1E /* spheremonics.xml in Resources */, AFCF83561AF5B5FD008BB7E1 /* splitflap.xml in Resources */, + AFEE10A71D17E2CD00AAC8F7 /* splodesic.xml in Resources */, AF918B6B158FC53E002B5D1E /* spotlight.xml in Resources */, AF918B6C158FC53E002B5D1E /* sproingies.xml in Resources */, AF918B6D158FC53E002B5D1E /* squiral.xml in Resources */, @@ -19873,6 +21023,7 @@ files = ( AFD51B200F063B4A00471C02 /* xscreensaver-getimage-file in Resources */, AFD51DB90F063BE700471C02 /* photopile.xml in Resources */, + AF5BEEFD1D2AFE21002E6D51 /* OCRAStd.otf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -20188,6 +21339,30 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AFEE10501D13406000AAC8F7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AFEE10691D13420700AAC8F7 /* cubetwist.xml in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AFEE106F1D15EB0800AAC8F7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AFEE10871D15EBD900AAC8F7 /* cubestack.xml in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AFEE108E1D17E20B00AAC8F7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AFEE10A61D17E2C900AAC8F7 /* splodesic.xml in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AFF2868217860E830050A578 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -20274,6 +21449,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF1B0FB71D7AB4740011DBE4 /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF32D9EF0F3AD0B40080F535 /* Rez */ = { isa = PBXRezBuildPhase; buildActionMask = 2147483647; @@ -20302,6 +21484,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF39382A1D0FBD6A00205406 /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF39E291198A11F60064A58D /* Rez */ = { isa = PBXRezBuildPhase; buildActionMask = 2147483647; @@ -21863,6 +23052,27 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AFEE105D1D13406000AAC8F7 /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AFEE107C1D15EB0800AAC8F7 /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AFEE109B1D17E20B00AAC8F7 /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; AFF2868D17860E830050A578 /* Rez */ = { isa = PBXRezBuildPhase; buildActionMask = 2147483647; @@ -21968,6 +23178,21 @@ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; showEnvVarsInLog = 0; }; + AF1B0FB81D7AB4740011DBE4 /* Run Update Info Plist */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Update Info Plist"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; + showEnvVarsInLog = 0; + }; AF32D9F00F3AD0B40080F535 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -22028,6 +23253,21 @@ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; showEnvVarsInLog = 0; }; + AF39382B1D0FBD6A00205406 /* Run Update Info Plist */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Update Info Plist"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; + showEnvVarsInLog = 0; + }; AF39E292198A11F60064A58D /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -25635,6 +26875,51 @@ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; showEnvVarsInLog = 0; }; + AFEE105E1D13406000AAC8F7 /* Run Update Info Plist */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Update Info Plist"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; + showEnvVarsInLog = 0; + }; + AFEE107D1D15EB0800AAC8F7 /* Run Update Info Plist */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Update Info Plist"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; + showEnvVarsInLog = 0; + }; + AFEE109C1D17E20B00AAC8F7 /* Run Update Info Plist */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Update Info Plist"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; + showEnvVarsInLog = 0; + }; AFF2868E17860E830050A578 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -25789,6 +27074,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF1B0FAC1D7AB4740011DBE4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AF1B0FC21D7AB54D0011DBE4 /* hexstrut.c in Sources */, + AF1B0FAE1D7AB4740011DBE4 /* XScreenSaverSubclass.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF32D9E50F3AD0B40080F535 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -25832,6 +27126,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF39381F1D0FBD6A00205406 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AF3938211D0FBD6A00205406 /* XScreenSaverSubclass.m in Sources */, + AF3938341D0FBF1900205406 /* discoball.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF39E287198A11F60064A58D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -26332,7 +27635,7 @@ CE8EA1C21C35CF10002D1020 /* jwxyz-common.c in Sources */, AF4774E8099D8D8C001F091E /* logo.c in Sources */, AF4775C0099D9E79001F091E /* resources.c in Sources */, - AF9D468F09B51567006E59CF /* osxgrabscreen.m in Sources */, + AF9D468F09B51567006E59CF /* grabclient-osx.m in Sources */, AF9D473809B52EE0006E59CF /* colorbars.c in Sources */, AF77783409B6516900EA3033 /* grab-ximage.c in Sources */, AF77783709B6518400EA3033 /* texfont.c in Sources */, @@ -26342,8 +27645,8 @@ AFAD462309D5F4DA00AB5F95 /* grabclient.c in Sources */, AF6048FB157C07C600CA21E4 /* jwzgles.c in Sources */, AFC7592D158D8E8B00C5458E /* textclient.c in Sources */, - AFC75930158D9A7A00C5458E /* textclient-iOS.m in Sources */, - AF561DF615969BC3007CA5ED /* iosgrabimage.m in Sources */, + AFC75930158D9A7A00C5458E /* textclient-ios.m in Sources */, + AF561DF615969BC3007CA5ED /* grabclient-ios.m in Sources */, CE9289D319BD00E300961F22 /* async_netdb.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -26927,6 +28230,7 @@ AF918A35158FC3BB002B5D1E /* bubble3d.c in Sources */, AF918A36158FC3BB002B5D1E /* buildlwo.c in Sources */, AF918A37158FC3BB002B5D1E /* cage.c in Sources */, + AF3938351D0FBF1D00205406 /* discoball.c in Sources */, AF918A38158FC3BB002B5D1E /* carousel.c in Sources */, AF918A39158FC3BB002B5D1E /* chessmodels.c in Sources */, AF918A3A158FC3BB002B5D1E /* circuit.c in Sources */, @@ -26944,7 +28248,9 @@ AF918A41158FC3BB002B5D1E /* crackberg.c in Sources */, AF918A42158FC3BB002B5D1E /* cube21.c in Sources */, AF918A43158FC3BB002B5D1E /* cubenetic.c in Sources */, + AFEE10851D15EBB900AAC8F7 /* cubestack.c in Sources */, AF918A44158FC3BB002B5D1E /* cubestorm.c in Sources */, + AFEE10671D1341FA00AAC8F7 /* cubetwist.c in Sources */, AF918A45158FC3BB002B5D1E /* cubicgrid.c in Sources */, AF918A46158FC3BB002B5D1E /* dangerball.c in Sources */, AFCF453715986A2100E6E8CC /* dnalogo.c in Sources */, @@ -26975,6 +28281,7 @@ AF918A67158FC3E5002B5D1E /* glslideshow.c in Sources */, AF918A68158FC3E5002B5D1E /* glsnake.c in Sources */, AF918A69158FC3E5002B5D1E /* gltext.c in Sources */, + AF1B0FC31D7AB5500011DBE4 /* hexstrut.c in Sources */, AF918A6A158FC3E5002B5D1E /* hilbert.c in Sources */, AFC0E8C41CDC60B0008CAFAC /* hydrostat.c in Sources */, AF918A6B158FC3E5002B5D1E /* hypertorus.c in Sources */, @@ -27032,6 +28339,7 @@ AF918A96158FC417002B5D1E /* spheremonics.c in Sources */, AFCF835A1AF5B5FD008BB7E1 /* splitflap.c in Sources */, AFCF83581AF5B5FD008BB7E1 /* splitflap_obj.c in Sources */, + AFEE10A41D17E2BA00AAC8F7 /* splodesic.c in Sources */, AF918A97158FC473002B5D1E /* sproingies.c in Sources */, AF918A98158FC473002B5D1E /* sproingiewrap.c in Sources */, AF918A99158FC473002B5D1E /* stairs.c in Sources */, @@ -28343,6 +29651,33 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AFEE10521D13406000AAC8F7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AFEE10661D1341F600AAC8F7 /* cubetwist.c in Sources */, + AFEE10541D13406000AAC8F7 /* XScreenSaverSubclass.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AFEE10711D15EB0800AAC8F7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AFEE10731D15EB0800AAC8F7 /* XScreenSaverSubclass.m in Sources */, + AFEE10861D15EBC800AAC8F7 /* cubestack.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AFEE10901D17E20B00AAC8F7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AFEE10A51D17E2C500AAC8F7 /* splodesic.c in Sources */, + AFEE10921D17E20B00AAC8F7 /* XScreenSaverSubclass.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AFF2868417860E830050A578 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -28525,6 +29860,16 @@ target = AF1A17610D6D6EE3008AF328 /* LCDscrub */; targetProxy = AF1A17830D6D6FA7008AF328 /* PBXContainerItemProxy */; }; + AF1B0FA81D7AB4740011DBE4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; + targetProxy = AF1B0FA91D7AB4740011DBE4 /* PBXContainerItemProxy */; + }; + AF1B0FC51D7AB5740011DBE4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AF1B0FA71D7AB4740011DBE4 /* Hexstrut */; + targetProxy = AF1B0FC41D7AB5740011DBE4 /* PBXContainerItemProxy */; + }; AF32D9E10F3AD0B40080F535 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; @@ -28560,6 +29905,16 @@ target = AF1AD9E118500F9F00932759 /* XScreenSaverUpdater */; targetProxy = AF36340018540D050086A439 /* PBXContainerItemProxy */; }; + AF39381B1D0FBD6A00205406 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; + targetProxy = AF39381C1D0FBD6A00205406 /* PBXContainerItemProxy */; + }; + AF3938381D0FBF5300205406 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AF39381A1D0FBD6A00205406 /* Discoball */; + targetProxy = AF3938371D0FBF5300205406 /* PBXContainerItemProxy */; + }; AF39E283198A11F60064A58D /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; @@ -30875,6 +32230,36 @@ target = AFEC23CD1CB6EAE100DE138F /* DymaxionMap */; targetProxy = AFEC23EA1CB6ED0800DE138F /* PBXContainerItemProxy */; }; + AFEE104E1D13406000AAC8F7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; + targetProxy = AFEE104F1D13406000AAC8F7 /* PBXContainerItemProxy */; + }; + AFEE106B1D13424C00AAC8F7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AFEE104D1D13406000AAC8F7 /* CubeTwist */; + targetProxy = AFEE106A1D13424C00AAC8F7 /* PBXContainerItemProxy */; + }; + AFEE106D1D15EB0700AAC8F7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; + targetProxy = AFEE106E1D15EB0700AAC8F7 /* PBXContainerItemProxy */; + }; + AFEE108A1D15EBF900AAC8F7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AFEE106C1D15EB0700AAC8F7 /* CubeStack */; + targetProxy = AFEE10891D15EBF900AAC8F7 /* PBXContainerItemProxy */; + }; + AFEE108C1D17E20B00AAC8F7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; + targetProxy = AFEE108D1D17E20B00AAC8F7 /* PBXContainerItemProxy */; + }; + AFEE10A91D17E32100AAC8F7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AFEE108B1D17E20B00AAC8F7 /* Splodesic */; + targetProxy = AFEE10A81D17E32100AAC8F7 /* PBXContainerItemProxy */; + }; AFF2868017860E830050A578 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; @@ -31082,6 +32467,28 @@ }; name = Release; }; + AF1B0FBA1D7AB4740011DBE4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = ( + "USE_GL=1", + "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + AF1B0FBB1D7AB4740011DBE4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = ( + "USE_GL=1", + "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; AF32D9F20F3AD0B40080F535 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -31162,6 +32569,28 @@ }; name = Release; }; + AF39382D1D0FBD6A00205406 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = ( + "USE_GL=1", + "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + AF39382E1D0FBD6A00205406 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = ( + "USE_GL=1", + "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; AF39E294198A11F60064A58D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -35010,6 +36439,72 @@ }; name = Release; }; + AFEE10601D13406000AAC8F7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = ( + "USE_GL=1", + "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + AFEE10611D13406000AAC8F7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = ( + "USE_GL=1", + "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + AFEE107F1D15EB0800AAC8F7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = ( + "USE_GL=1", + "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + AFEE10801D15EB0800AAC8F7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = ( + "USE_GL=1", + "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + AFEE109E1D17E20B00AAC8F7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = ( + "USE_GL=1", + "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + AFEE109F1D17E20B00AAC8F7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = ( + "USE_GL=1", + "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; AFF2869017860E830050A578 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -35112,9 +36607,13 @@ buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.${PRODUCT_NAME:rfc1034identifier}"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_INT_CONVERSION = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphonesimulator*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Mac Developer"; COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = 4627ATJELP; ENABLE_TESTABILITY = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -35167,7 +36666,7 @@ ); INFOPLIST_FILE = XScreenSaver.plist; INSTALL_PATH = "$(HOME)/Library/Screen Savers"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LIBRARY_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = ""; @@ -35191,9 +36690,13 @@ buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.${PRODUCT_NAME:rfc1034identifier}"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_INT_CONVERSION = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Jamie Zawinski (4627ATJELP)"; "CODE_SIGN_IDENTITY[sdk=iphonesimulator*]" = "iPhone Distribution: Jamie Zawinski (4627ATJELP)"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application: Jamie Zawinski (4627ATJELP)"; COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = 4627ATJELP; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = xscreensaver_Prefix.pch; @@ -35244,7 +36747,7 @@ ); INFOPLIST_FILE = XScreenSaver.plist; INSTALL_PATH = "$(HOME)/Library/Screen Savers"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LIBRARY_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; LLVM_LTO = NO; "LLVM_LTO[sdk=macosx*]" = NO; @@ -35342,6 +36845,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + AF1B0FB91D7AB4740011DBE4 /* Build configuration list for PBXNativeTarget "Hexstrut" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AF1B0FBA1D7AB4740011DBE4 /* Debug */, + AF1B0FBB1D7AB4740011DBE4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; AF32D9F10F3AD0B40080F535 /* Build configuration list for PBXNativeTarget "RubikBlocks" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -35378,6 +36890,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + AF39382C1D0FBD6A00205406 /* Build configuration list for PBXNativeTarget "Discoball" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AF39382D1D0FBD6A00205406 /* Debug */, + AF39382E1D0FBD6A00205406 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; AF39E293198A11F60064A58D /* Build configuration list for PBXNativeTarget "WindupRobot" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -37538,6 +39059,33 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + AFEE105F1D13406000AAC8F7 /* Build configuration list for PBXNativeTarget "CubeTwist" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AFEE10601D13406000AAC8F7 /* Debug */, + AFEE10611D13406000AAC8F7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + AFEE107E1D15EB0800AAC8F7 /* Build configuration list for PBXNativeTarget "CubeStack" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AFEE107F1D15EB0800AAC8F7 /* Debug */, + AFEE10801D15EB0800AAC8F7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + AFEE109D1D17E20B00AAC8F7 /* Build configuration list for PBXNativeTarget "Splodesic" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AFEE109E1D17E20B00AAC8F7 /* Debug */, + AFEE109F1D17E20B00AAC8F7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; AFF2868F17860E830050A578 /* Build configuration list for PBXNativeTarget "QuasiCrystal" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/README b/README index 209e9688..8f80f71d 100644 --- a/README +++ b/README @@ -23,9 +23,12 @@ To compile for a Unix system with X11: make make install + If you are on an "apt"-based system, "apt-get build-dep xscreensaver" + might install most of the compilation dependencies. + To compile for MacOS X or iOS: - Use the included XCode project. Requires XCode 4 and MacOS X 10.5 + Use the included XCode project. Requires XCode 6 and MacOS X 10.8 or newer. To compile for Android: @@ -42,13 +45,20 @@ XScreenSaver has an extensive manual -- please read it! =============================================================================== +5.36 * New hacks, `discoball', `cubetwist', `cubestack', `splodesic' + and `hexstrut'. + * OSX: loading image files works in `dymaxionmap', `glplanet', + `lavalite', `pulsar', `gleidescope' and `extrusion'. + * Several new programs in `m6502'. + * `rotzoomer -mode circle'. + * Better titles in `photopile'. 5.35 * New hacks, `dymaxionmap', `unicrud', `energystream', `raverhoop' and `hydrostat'. * Added Windows 10 to `bsod'. * X11: ignore WM_USER_TIME property changes with days-old timestamps. Thanks, KDE. - * MacOS, iOS: Better fonts in 'BSOD' and 'memscroller'. - * MacOS 10.7 or later and iOS 6.0 or later are now required, since + * MacOS, iOS: Better fonts in `BSOD' and `memscroller'. + * MacOS 10.8 or later and iOS 6.0 or later are now required, since Xcode 6 can no longer build executables that work on older OSes. * Many, many Android improvements. * iOS: Fixed rotation to work with the new iOS 8+ API. @@ -339,7 +349,7 @@ XScreenSaver has an extensive manual -- please read it! changes. 5.02 * Reworked PAM code to support fingerprint readers, etc. - * Ported 'webcollage' to MacOS. + * Ported `webcollage' to MacOS. * Added MacOS 10.2 and 10.3 kernel panics to `bsod'. * Fixed a Xinerama crash when changing the screen count. * New blobbier `mirrorblob'. diff --git a/README.hacking b/README.hacking index a7161962..3cceb577 100644 --- a/README.hacking +++ b/README.hacking @@ -139,15 +139,18 @@ Programming Tips - Don't make assumptions about the depth of the display, or whether it is colormapped. You must allocate all your colors explicitly: do not assume you can construct an RGB value and use that as a pixel value - directly. Use the utility routines provided by "utils/colors.h" to - simplify color allocation. + directly. In particular, you can't make assumptions about whether + pixels are RGB, RGBA, ARGB, ABGR, or even whether they are 32, 24, + 16 or 8 bits. Use the utility routines provided by "utils/colors.h" + to simplify color allocation. - It is better to eliminate flicker by double-buffering to a Pixmap than by erasing and re-drawing objects. Do not use drawing tricks involving XOR. - - If you use double-buffering, have a resource to turn it off. (MacOS - has double-buffering built in, so you'd be triple-buffering.) + - If you use double-buffering, have a resource to turn it off. (MacOS, + iOS and Android have double-buffering built in, so you'd end up + triple-buffering.) - Understand the differences between Pixmaps and XImages, and keep in mind which operations are happening in client memory and which are in @@ -160,20 +163,16 @@ Programming Tips ========================================================================== -The MacOS X Port +MacOS, iOS and Android ========================================================================== Though XScreenSaver started its life as an X11 program, it also now runs - on MacOS X. If you do your development on an X11 system, and follow the + on MacOS, iOS and Android, due to a maniacal collection of compatibility + shims. If you do your development on an X11 system, and follow the usual XScreenSaver APIs, you shouldn't need to do anything special for - it to also work on MacOS. + it to also work on MacOS and on phones. - The preprocessor macro HAVE_COCOA will be defined when being compiled in - a MacOS (Cocoa/Quartz) environment, and will be undefined when compiling - against "real" Xlib. - - To compile on MacOS, use the XCode project included in the source - distribution. You shouldn't need to have X11 installed, and shouldn't - need to run "configure" first. + See the READMEs in the OSX/ and android/ directories for instructions on + compiling for those platforms. ========================================================================== diff --git a/aclocal.m4 b/aclocal.m4 index e9201d78..03fbf515 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -327,7 +327,7 @@ msgstr "" # on various variables needed by the Makefile.in.in installed by # glib-gettextize. dnl -glib_DEFUN([GLIB_GNU_GETTEXT], +AU_DEFUN([GLIB_GNU_GETTEXT], [AC_REQUIRE([AC_PROG_CC])dnl GLIB_LC_MESSAGES @@ -397,7 +397,8 @@ glib_DEFUN([GLIB_GNU_GETTEXT], rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES - ]) + ], + [[$0: This macro is deprecated. You should use upstream gettext instead.]]) # AM_GLIB_DEFINE_LOCALEDIR(VARIABLE) # ------------------------------- @@ -618,8 +619,8 @@ AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL]) # nls.m4 serial 5 (gettext-0.18) -dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014 Free Software Foundation, -dnl Inc. +dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014, 2016 Free Software +dnl Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. diff --git a/android/Makefile b/android/Makefile index f2963520..35c24ec2 100644 --- a/android/Makefile +++ b/android/Makefile @@ -59,7 +59,9 @@ export ANDROID_HACKS= \ compass \ coral \ crystal \ + cubestack \ cubestorm \ + cubetwist \ cwaves \ cynosure \ dangerball \ @@ -67,6 +69,7 @@ export ANDROID_HACKS= \ deco \ demon \ discrete \ + discoball \ distort \ dnalogo \ drift \ @@ -98,6 +101,7 @@ export ANDROID_HACKS= \ greynetic \ helix \ hexadrop \ + hexstrut \ hilbert \ hopalong \ hypnowheel \ @@ -147,6 +151,7 @@ export ANDROID_HACKS= \ sierpinski \ sierpinski3d \ slidescreen \ + splodesic \ squiral \ stairs \ starfish \ @@ -269,6 +274,15 @@ CVT = -thumbnail '150x150^' -gravity center -extent 150x150 \ -quality 95 \ +dither -colors 128 +# If we are making the m6502 hack, create the header file for Android +m6502.h:: + @for h in $(ANDROID_HACKS) ; do \ + if [ $${h} = "m6502" ] ; then \ + echo "Making $${h} header ..."; \ + ../hacks/m6502.sh ../hacks/m6502.h ../hacks/images/m6502/*.asm ; \ + echo "Made $${h} header"; \ + fi; \ + done project/xscreensaver/res/drawable/%.png: @\ @@ -296,7 +310,8 @@ clean_thumbs:: for f in $(ANDROID_HACKS) $(ANDROID_TODO) ; do \ rm -f project/xscreensaver/res/drawable/$$f.png ; \ done -distclean:: clean_thumbs + +distclean:: clean_thumbs clean EXTRA_TARFILES = project/xscreensaver/res/drawable/thumbnail.png \ @@ -326,9 +341,12 @@ echo_tarfiles: | sort` ; \ echo $$FILES -debug:: +run_check:: + ../hacks/check-configs.pl --build-android $(ANDROID_HACKS) + +debug:: m6502.h run_check $(GRADLE) assembleDebug -release:: +release:: m6502.h run_check export APP_ABI=all ; \ $(GRADLE) assembleRelease @@ -380,3 +398,8 @@ apk:: release # dnalogo \ # twang \ # memscroller \ +# phosphor \ +# discoball \ +# cubetwist \ +# cubestack \ +# splodesic \ diff --git a/android/README b/android/README index 74b8097c..78fda15d 100644 --- a/android/README +++ b/android/README @@ -41,6 +41,9 @@ To build: $ANDROID_HOME/sdk/tools/android avd + E.g.: Nexus 5, Android 5, Intel Atom x86_64, RAM 2048 VM 64, + storage 200, use host GPU. + Configuration options are in $HOME/.android/avd/*.avd/config.ini To launch it: diff --git a/android/XScreenSaverDaydream.java.in b/android/XScreenSaverDaydream.java.in deleted file mode 100644 index 46c3dc77..00000000 --- a/android/XScreenSaverDaydream.java.in +++ /dev/null @@ -1,26 +0,0 @@ -/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * xscreensaver, Copyright (c) 2016 Jamie Zawinski - * and Dennis Sheil - * - * 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. - * - * The template for the generated per-saver classes. - */ - -package org.jwz.xscreensaver.gen; - -import org.jwz.xscreensaver.XScreenSaverDaydream; -import org.jwz.xscreensaver.jwxyz; - -public class @CLASS@ extends XScreenSaverDaydream { - public @CLASS@() { - super(jwxyz.API_@API@); - } -} diff --git a/android/XScreenSaverSettings.java.in b/android/XScreenSaverSettings.java.in deleted file mode 100644 index 914c653f..00000000 --- a/android/XScreenSaverSettings.java.in +++ /dev/null @@ -1,24 +0,0 @@ -/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * xscreensaver, Copyright (c) 2016 Jamie Zawinski - * and Dennis Sheil - * - * 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. - * - * The template for the generated per-saver "Settings" classes. - */ - -package org.jwz.xscreensaver.gen; - -import android.content.SharedPreferences; -import org.jwz.xscreensaver.XScreenSaverSettings; - -public class @CLASS@ extends XScreenSaverSettings - implements SharedPreferences.OnSharedPreferenceChangeListener { -} diff --git a/android/grabscreen-android.c b/android/grabscreen-android.c deleted file mode 100644 index 38710755..00000000 --- a/android/grabscreen-android.c +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include -// -//#import "SaverRunner.h" -// -#include "jwxyz.h" -#include "grabscreen.h" -#include "colorbars.h" -#include "resources.h" -#include "usleep.h" - -Bool -osx_grab_desktop_image (Screen *screen, Window xwindow, Drawable drawable, - XRectangle *geom_ret) -{ -abort(); -} - -Bool -osx_load_image_file (Screen *screen, Window xwindow, Drawable drawable, - const char *filename, XRectangle *geom_ret) -{ -abort(); -} diff --git a/android/project/build.gradle b/android/project/build.gradle index 41cd0d15..613cb908 100644 --- a/android/project/build.gradle +++ b/android/project/build.gradle @@ -1,11 +1,16 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { - mavenCentral() + jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.1.0' + classpath 'com.android.tools.build:gradle:2.1.0' } + + // This allows versions of Gradle past 2.9 to be used with the Gradle + // Android plugin. + // https://discuss.gradle.org/t/gradle-thinks-2-10-is-less-than-2-2-when-resolving-plugins/13434/2 +// System.properties['com.android.build.gradle.overrideVersionCheck'] = 'true'; } task clean(type: Delete) { diff --git a/android/project/gradle/wrapper/gradle-wrapper.jar b/android/project/gradle/wrapper/gradle-wrapper.jar index 8c0fb64a..13372aef 100644 Binary files a/android/project/gradle/wrapper/gradle-wrapper.jar and b/android/project/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android/project/gradle/wrapper/gradle-wrapper.properties b/android/project/gradle/wrapper/gradle-wrapper.properties index 542898db..729f41b7 100644 --- a/android/project/gradle/wrapper/gradle-wrapper.properties +++ b/android/project/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,6 @@ - -#Wed Apr 10 15:27:10 PDT 2013 +#Sun Jun 12 14:20:28 PDT 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-bin.zip diff --git a/android/project/gradlew b/android/project/gradlew index 91a7e269..9d82f789 100755 --- a/android/project/gradlew +++ b/android/project/gradlew @@ -42,11 +42,6 @@ case "`uname`" in ;; esac -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - # Attempt to set APP_HOME # Resolve links: $0 may be a link PRG="$0" @@ -61,9 +56,9 @@ while [ -h "$PRG" ] ; do fi done SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- +cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" -cd "$SAVED" >&- +cd "$SAVED" >/dev/null CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -114,6 +109,7 @@ fi if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` diff --git a/android/project/project.iml b/android/project/project.iml new file mode 100644 index 00000000..de3d86e0 --- /dev/null +++ b/android/project/project.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/project/xscreensaver/.idea/compiler.xml b/android/project/xscreensaver/.idea/compiler.xml new file mode 100644 index 00000000..9a8b7e5c --- /dev/null +++ b/android/project/xscreensaver/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/android/project/xscreensaver/.idea/gradle.xml b/android/project/xscreensaver/.idea/gradle.xml new file mode 100644 index 00000000..19fd5f1b --- /dev/null +++ b/android/project/xscreensaver/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/android/project/xscreensaver/.idea/misc.xml b/android/project/xscreensaver/.idea/misc.xml new file mode 100644 index 00000000..cc15a254 --- /dev/null +++ b/android/project/xscreensaver/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/project/xscreensaver/.idea/modules.xml b/android/project/xscreensaver/.idea/modules.xml new file mode 100644 index 00000000..f3179276 --- /dev/null +++ b/android/project/xscreensaver/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/android/project/xscreensaver/.idea/workspace.xml b/android/project/xscreensaver/.idea/workspace.xml new file mode 100644 index 00000000..516bf62b --- /dev/null +++ b/android/project/xscreensaver/.idea/workspace.xml @@ -0,0 +1,1863 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1475536195508 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/project/xscreensaver/build.gradle b/android/project/xscreensaver/build.gradle index 0700c946..c0f9f100 100644 --- a/android/project/xscreensaver/build.gradle +++ b/android/project/xscreensaver/build.gradle @@ -46,7 +46,8 @@ android { Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) def ndkDir = properties.getProperty('ndk.dir') - commandLine "$ndkDir/ndk-build", '-C', file('jni').absolutePath + commandLine "$ndkDir/ndk-build", '-C', file('jni').absolutePath, + '-j' + Runtime.getRuntime().availableProcessors().toString() } // generate files early in the process diff --git a/android/project/xscreensaver/gradle/wrapper/gradle-wrapper.jar b/android/project/xscreensaver/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..13372aef Binary files /dev/null and b/android/project/xscreensaver/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android/project/xscreensaver/gradle/wrapper/gradle-wrapper.properties b/android/project/xscreensaver/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..04e285f3 --- /dev/null +++ b/android/project/xscreensaver/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Dec 28 10:00:20 PST 2015 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip diff --git a/android/project/xscreensaver/gradlew b/android/project/xscreensaver/gradlew new file mode 100644 index 00000000..9d82f789 --- /dev/null +++ b/android/project/xscreensaver/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/android/project/xscreensaver/gradlew.bat b/android/project/xscreensaver/gradlew.bat new file mode 100644 index 00000000..aec99730 --- /dev/null +++ b/android/project/xscreensaver/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android/project/xscreensaver/jni/Android.mk b/android/project/xscreensaver/jni/Android.mk index b29a5781..d1f00b74 100644 --- a/android/project/xscreensaver/jni/Android.mk +++ b/android/project/xscreensaver/jni/Android.mk @@ -1,4 +1,4 @@ -LOCAL_PATH := $(call my-dir) +LOCAL_PATH := $(call my-dir)/../../../.. include $(CLEAR_VARS) @@ -6,138 +6,137 @@ LOCAL_MODULE := xscreensaver # The base framework files: LOCAL_SRC_FILES := \ - xscreensaver/android/screenhack-android.c \ - xscreensaver/android/grabscreen-android.c \ - xscreensaver/jwxyz/jwxyz-android.c \ - xscreensaver/jwxyz/jwxyz-common.c \ - xscreensaver/jwxyz/jwxyz-gl.c \ - xscreensaver/jwxyz/jwxyz-timers.c \ - xscreensaver/jwxyz/jwzgles.c \ + android/screenhack-android.c \ + jwxyz/jwxyz-android.c \ + jwxyz/jwxyz-common.c \ + jwxyz/jwxyz-gl.c \ + jwxyz/jwxyz-timers.c \ + jwxyz/jwzgles.c \ # Utilities used by the hacks: LOCAL_SRC_FILES += \ - xscreensaver/hacks/analogtv.c \ - xscreensaver/hacks/delaunay.c \ - xscreensaver/hacks/fps.c \ - xscreensaver/hacks/glx/dropshadow.c \ - xscreensaver/hacks/glx/chessmodels.c \ - xscreensaver/hacks/glx/fps-gl.c \ - xscreensaver/hacks/glx/gltrackball.c \ - xscreensaver/hacks/glx/glut_stroke.c \ - xscreensaver/hacks/glx/glut_swidth.c \ - xscreensaver/hacks/glx/grab-ximage.c \ - xscreensaver/hacks/glx/marching.c \ - xscreensaver/hacks/glx/normals.c \ - xscreensaver/hacks/glx/rotator.c \ - xscreensaver/hacks/glx/sphere.c \ - xscreensaver/hacks/glx/texfont.c \ - xscreensaver/hacks/glx/trackball.c \ - xscreensaver/hacks/glx/tube.c \ - xscreensaver/hacks/glx/xpm-ximage.c \ - xscreensaver/hacks/xlockmore.c \ - xscreensaver/hacks/xpm-pixmap.c \ - xscreensaver/utils/async_netdb.c \ - xscreensaver/utils/aligned_malloc.c \ - xscreensaver/utils/colorbars.c \ - xscreensaver/utils/colors.c \ - xscreensaver/utils/erase.c \ - xscreensaver/utils/grabclient.c \ - xscreensaver/utils/hsv.c \ - xscreensaver/utils/logo.c \ - xscreensaver/utils/minixpm.c \ - xscreensaver/utils/resources.c \ - xscreensaver/utils/spline.c \ - xscreensaver/utils/textclient-mobile.c \ - xscreensaver/utils/thread_util.c \ - xscreensaver/utils/usleep.c \ - xscreensaver/utils/utf8wc.c \ - xscreensaver/utils/xft.c \ - xscreensaver/utils/yarandom.c \ + hacks/analogtv.c \ + hacks/delaunay.c \ + hacks/fps.c \ + hacks/glx/dropshadow.c \ + hacks/glx/chessmodels.c \ + hacks/glx/fps-gl.c \ + hacks/glx/gltrackball.c \ + hacks/glx/glut_stroke.c \ + hacks/glx/glut_swidth.c \ + hacks/glx/grab-ximage.c \ + hacks/glx/marching.c \ + hacks/glx/normals.c \ + hacks/glx/rotator.c \ + hacks/glx/sphere.c \ + hacks/glx/texfont.c \ + hacks/glx/trackball.c \ + hacks/glx/tube.c \ + hacks/glx/xpm-ximage.c \ + hacks/xlockmore.c \ + hacks/xpm-pixmap.c \ + utils/async_netdb.c \ + utils/aligned_malloc.c \ + utils/colorbars.c \ + utils/colors.c \ + utils/erase.c \ + utils/grabclient.c \ + utils/hsv.c \ + utils/logo.c \ + utils/minixpm.c \ + utils/resources.c \ + utils/spline.c \ + utils/textclient-mobile.c \ + utils/thread_util.c \ + utils/usleep.c \ + utils/utf8wc.c \ + utils/xft.c \ + utils/yarandom.c \ # The source files of all of the currently active hacks: LOCAL_SRC_FILES += $(shell \ for f in $$ANDROID_HACKS ; do \ if [ "$$f" = "companioncube" ]; then f="companion"; fi ; \ if [ -f "../../../../hacks/$$f.c" ]; then \ - echo "xscreensaver/hacks/$$f.c" ; \ + echo "hacks/$$f.c" ; \ else \ - echo "xscreensaver/hacks/glx/$$f.c" ; \ + echo "hacks/glx/$$f.c" ; \ fi ; \ done ) # Some savers occupy more than one source file: LOCAL_SRC_FILES += \ - xscreensaver/hacks/apple2-main.c \ - xscreensaver/hacks/asm6502.c \ - xscreensaver/hacks/pacman_ai.c \ - xscreensaver/hacks/pacman_level.c \ - xscreensaver/hacks/glx/b_draw.c \ - xscreensaver/hacks/glx/b_lockglue.c \ - xscreensaver/hacks/glx/b_sphere.c \ - xscreensaver/hacks/glx/buildlwo.c \ - xscreensaver/hacks/glx/companion_quad.c \ - xscreensaver/hacks/glx/companion_disc.c \ - xscreensaver/hacks/glx/companion_heart.c \ - xscreensaver/hacks/glx/cow_face.c \ - xscreensaver/hacks/glx/cow_hide.c \ - xscreensaver/hacks/glx/cow_hoofs.c \ - xscreensaver/hacks/glx/cow_horns.c \ - xscreensaver/hacks/glx/cow_tail.c \ - xscreensaver/hacks/glx/cow_udder.c \ - xscreensaver/hacks/glx/dolphin.c \ - xscreensaver/hacks/glx/gllist.c \ - xscreensaver/hacks/glx/glschool_alg.c \ - xscreensaver/hacks/glx/glschool_gl.c \ - xscreensaver/hacks/glx/involute.c \ - xscreensaver/hacks/glx/lament_model.c \ - xscreensaver/hacks/glx/pipeobjs.c \ - xscreensaver/hacks/glx/robot.c \ - xscreensaver/hacks/glx/robot-wireframe.c \ - xscreensaver/hacks/glx/polyhedra-gl.c \ - xscreensaver/hacks/glx/s1_1.c \ - xscreensaver/hacks/glx/s1_2.c \ - xscreensaver/hacks/glx/s1_3.c \ - xscreensaver/hacks/glx/s1_4.c \ - xscreensaver/hacks/glx/s1_5.c \ - xscreensaver/hacks/glx/s1_6.c \ - xscreensaver/hacks/glx/s1_b.c \ - xscreensaver/hacks/glx/shark.c \ - xscreensaver/hacks/glx/sonar-sim.c \ - xscreensaver/hacks/glx/sonar-icmp.c \ - xscreensaver/hacks/glx/splitflap_obj.c \ - xscreensaver/hacks/glx/sproingiewrap.c \ - xscreensaver/hacks/glx/stonerview-move.c \ - xscreensaver/hacks/glx/stonerview-osc.c \ - xscreensaver/hacks/glx/stonerview-view.c \ - xscreensaver/hacks/glx/swim.c \ - xscreensaver/hacks/glx/tangram_shapes.c \ - xscreensaver/hacks/glx/teapot.c \ - xscreensaver/hacks/glx/toast.c \ - xscreensaver/hacks/glx/toast2.c \ - xscreensaver/hacks/glx/toaster.c \ - xscreensaver/hacks/glx/toaster_base.c \ - xscreensaver/hacks/glx/toaster_handle.c \ - xscreensaver/hacks/glx/toaster_handle2.c \ - xscreensaver/hacks/glx/toaster_jet.c \ - xscreensaver/hacks/glx/toaster_knob.c \ - xscreensaver/hacks/glx/toaster_slots.c \ - xscreensaver/hacks/glx/toaster_wing.c \ - xscreensaver/hacks/glx/tronbit_idle1.c \ - xscreensaver/hacks/glx/tronbit_idle2.c \ - xscreensaver/hacks/glx/tronbit_no.c \ - xscreensaver/hacks/glx/tronbit_yes.c \ - xscreensaver/hacks/glx/tunnel_draw.c \ - xscreensaver/hacks/glx/whale.c \ + hacks/apple2-main.c \ + hacks/asm6502.c \ + hacks/pacman_ai.c \ + hacks/pacman_level.c \ + hacks/glx/b_draw.c \ + hacks/glx/b_lockglue.c \ + hacks/glx/b_sphere.c \ + hacks/glx/buildlwo.c \ + hacks/glx/companion_quad.c \ + hacks/glx/companion_disc.c \ + hacks/glx/companion_heart.c \ + hacks/glx/cow_face.c \ + hacks/glx/cow_hide.c \ + hacks/glx/cow_hoofs.c \ + hacks/glx/cow_horns.c \ + hacks/glx/cow_tail.c \ + hacks/glx/cow_udder.c \ + hacks/glx/dolphin.c \ + hacks/glx/gllist.c \ + hacks/glx/glschool_alg.c \ + hacks/glx/glschool_gl.c \ + hacks/glx/involute.c \ + hacks/glx/lament_model.c \ + hacks/glx/pipeobjs.c \ + hacks/glx/robot.c \ + hacks/glx/robot-wireframe.c \ + hacks/glx/polyhedra-gl.c \ + hacks/glx/s1_1.c \ + hacks/glx/s1_2.c \ + hacks/glx/s1_3.c \ + hacks/glx/s1_4.c \ + hacks/glx/s1_5.c \ + hacks/glx/s1_6.c \ + hacks/glx/s1_b.c \ + hacks/glx/shark.c \ + hacks/glx/sonar-sim.c \ + hacks/glx/sonar-icmp.c \ + hacks/glx/splitflap_obj.c \ + hacks/glx/sproingiewrap.c \ + hacks/glx/stonerview-move.c \ + hacks/glx/stonerview-osc.c \ + hacks/glx/stonerview-view.c \ + hacks/glx/swim.c \ + hacks/glx/tangram_shapes.c \ + hacks/glx/teapot.c \ + hacks/glx/toast.c \ + hacks/glx/toast2.c \ + hacks/glx/toaster.c \ + hacks/glx/toaster_base.c \ + hacks/glx/toaster_handle.c \ + hacks/glx/toaster_handle2.c \ + hacks/glx/toaster_jet.c \ + hacks/glx/toaster_knob.c \ + hacks/glx/toaster_slots.c \ + hacks/glx/toaster_wing.c \ + hacks/glx/tronbit_idle1.c \ + hacks/glx/tronbit_idle2.c \ + hacks/glx/tronbit_no.c \ + hacks/glx/tronbit_yes.c \ + hacks/glx/tunnel_draw.c \ + hacks/glx/whale.c \ LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog -lEGL LOCAL_C_INCLUDES := \ - $(LOCAL_PATH)/xscreensaver \ - $(LOCAL_PATH)/xscreensaver/android \ - $(LOCAL_PATH)/xscreensaver/utils \ - $(LOCAL_PATH)/xscreensaver/jwxyz \ - $(LOCAL_PATH)/xscreensaver/hacks \ - $(LOCAL_PATH)/xscreensaver/hacks/glx \ + $(LOCAL_PATH) \ + $(LOCAL_PATH)/android \ + $(LOCAL_PATH)/utils \ + $(LOCAL_PATH)/jwxyz \ + $(LOCAL_PATH)/hacks \ + $(LOCAL_PATH)/hacks/glx \ # -Wnested-externs would also be here, but for Android unistd.h. LOCAL_CFLAGS += \ diff --git a/android/project/xscreensaver/jni/xscreensaver b/android/project/xscreensaver/jni/xscreensaver deleted file mode 120000 index c866b868..00000000 --- a/android/project/xscreensaver/jni/xscreensaver +++ /dev/null @@ -1 +0,0 @@ -../../../.. \ No newline at end of file diff --git a/android/project/xscreensaver/local.properties b/android/project/xscreensaver/local.properties new file mode 100644 index 00000000..d530e0de --- /dev/null +++ b/android/project/xscreensaver/local.properties @@ -0,0 +1,11 @@ +## This file is automatically generated by Android Studio. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. +# +# Location of the SDK. This is only used by Gradle. +# For customization when using a Version Control System, please read the +# header note. +#Mon Oct 03 16:09:56 PDT 2016 +sdk.dir=/Users/jwz/Library/Android/sdk diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverDaydream.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverDaydream.java index ea04df07..8824dbe1 100644 --- a/android/project/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverDaydream.java +++ b/android/project/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverDaydream.java @@ -106,18 +106,21 @@ public class XScreenSaverDaydream extends DreamService // Extract the saver name from e.g. "BouncingCowDaydream" String name = this.getClass().getSimpleName(); - String tail = "Daydream"; - if (name.endsWith(tail)) - name = name.substring (0, name.length() - tail.length()); + int index = name.lastIndexOf('$'); + if (index != -1) { + index++; + name = name.substring (index, name.length() - index); + } name = name.toLowerCase(); WindowManager wm = (WindowManager) getSystemService (WINDOW_SERVICE); + glview = new GLSurfaceView (this); renderer = new XScreenSaverRenderer (name, api, getApplicationContext(), wm, - screenshot, this); - - glview = new GLSurfaceView (this); + screenshot, this, glview); + glview.setEGLConfigChooser (8, 8, 8, 8, 16, 0); glview.setRenderer (renderer); + glview.setRenderMode (GLSurfaceView.RENDERMODE_WHEN_DIRTY); setContentView (glview); detector = new GestureDetector (this, this); diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverRenderer.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverRenderer.java index 9889ea86..f854636c 100644 --- a/android/project/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverRenderer.java +++ b/android/project/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverRenderer.java @@ -22,6 +22,8 @@ import android.view.KeyEvent; import android.content.Context; import android.graphics.Bitmap; import android.opengl.GLSurfaceView; +import java.util.Timer; +import java.util.TimerTask; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import org.jwz.xscreensaver.jwxyz; @@ -44,6 +46,16 @@ public class XScreenSaverRenderer implements GLSurfaceView.Renderer { WindowManager wm; Bitmap screenshot; + GLSurfaceView glview; + + class RenderTask extends TimerTask { + public void run() { + glview.requestRender(); + } + }; + + Timer timer = new Timer(); + private void LOG (String fmt, Object... args) { Log.d ("xscreensaver", this.getClass().getSimpleName() + ": " + @@ -59,7 +71,8 @@ public class XScreenSaverRenderer implements GLSurfaceView.Renderer { public XScreenSaverRenderer (String hack, int api, Context app, WindowManager wm, Bitmap screenshot, - Handler.Callback abort_callback) { + Handler.Callback abort_callback, + GLSurfaceView glview) { super(); this.hack = hack; this.api = api; @@ -68,13 +81,18 @@ public class XScreenSaverRenderer implements GLSurfaceView.Renderer { this.prefs = prefs; this.screenshot = screenshot; this.abort_callback = abort_callback; + this.glview = glview; LOG ("init %s %d", hack, api); } public void onDrawFrame (GL10 gl) { try { - if (jwxyz_obj != null) - jwxyz_obj.nativeRender(); + if (jwxyz_obj != null) { + long delay = jwxyz_obj.nativeRender(); + // java.util.Timer doesn't seem to like to re-use TimerTasks, so + // there's a slow object churn here: one TimerTask per frame. + timer.schedule(new RenderTask(), delay / 1000); + } } catch (RuntimeException e) { except (e); } @@ -98,6 +116,8 @@ public class XScreenSaverRenderer implements GLSurfaceView.Renderer { jwxyz_obj.nativeResize (w, h, r); + glview.requestRender(); + } catch (RuntimeException e) { except (e); } diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/jwxyz.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/jwxyz.java index a83e8cf9..1982ca49 100644 --- a/android/project/xscreensaver/src/org/jwz/xscreensaver/jwxyz.java +++ b/android/project/xscreensaver/src/org/jwz/xscreensaver/jwxyz.java @@ -40,6 +40,8 @@ import java.nio.ByteBuffer; import java.io.File; import java.io.InputStream; import java.io.FileOutputStream; +import java.lang.Runnable; +import java.lang.Thread; import android.database.Cursor; import android.provider.MediaStore; import android.provider.MediaStore.MediaColumns; @@ -66,11 +68,6 @@ public class jwxyz { SharedPreferences prefs; Hashtable defaults = new Hashtable(); - // Maps numeric IDs to Java objects, so that C code can reference them - // even if GC relocates them. - private Hashtable rootset = new Hashtable(); - private long rootset_id = 1000; - // Maps font names to either: String (system font) or Typeface (bundled). private Hashtable all_fonts = @@ -83,7 +80,7 @@ public class jwxyz { Hashtable defaults, int w, int h); public native void nativeResize (int w, int h, double rot); - public native void nativeRender (); + public native long nativeRender (); public native void nativeDone (); public native void sendButtonEvent (int x, int y, boolean down); public native void sendMotionEvent (int x, int y); @@ -354,7 +351,7 @@ public class jwxyz { } - // Returns [ Long font_id, String name, Float size, ascent, descent ] + // Returns [ Paint paint, String name, Float size, ascent, descent ] public Object[] loadFont(String name) { Object pair[]; @@ -383,34 +380,24 @@ public class jwxyz { paint.setTextSize (size); paint.setColor (Color.argb (0xFF, 0xFF, 0xFF, 0xFF)); - Long font_key = new Long(rootset_id++); - rootset.put (font_key, paint); - - LOG ("load font %s, \"%s\" = \"%s %.1f\"", - font_key.toString(), name, name2, size); + LOG ("load font \"%s\" = \"%s %.1f\"", name, name2, size); FontMetrics fm = paint.getFontMetrics(); - Object ret[] = { font_key, name2, new Float(size), + Object ret[] = { paint, name2, new Float(size), new Float(-fm.ascent), new Float(fm.descent) }; return ret; } - public void releaseFont(long font_id) { - rootset.remove (new Long(font_id)); - } - /* Returns a byte[] array containing XCharStruct with an optional bitmap appended to it. lbearing, rbearing, width, ascent, descent: 2 bytes each. Followed by a WxH pixmap, 32 bits per pixel. */ - public ByteBuffer renderText (long font_id, String text, boolean render_p) { - - Paint paint = (Paint) rootset.get(new Long(font_id)); + public ByteBuffer renderText (Paint paint, String text, boolean render_p) { if (paint == null) { - LOG ("no font %d", font_id); + LOG ("no font"); return null; } @@ -483,44 +470,78 @@ public class jwxyz { } - // Returns the contents of the URL. Blocking load. - public ByteBuffer loadURL (String url) { + /* Returns the contents of the URL. + Loads the URL in a background thread: if the URL has not yet loaded, + this will return null. Once the URL has completely loaded, the full + contents will be returned. Calling this again after that starts the + URL loading again. + */ + private String loading_url = null; + private ByteBuffer loaded_url_body = null; - int size0 = 10240; - int size = size0; - int count = 0; - ByteBuffer body = ByteBuffer.allocateDirect (size); + public synchronized ByteBuffer loadURL (String url) { - try { - LOG ("load URL: %s", url); - URL u = new URL(url); - InputStream s = u.openStream(); - byte buf[] = new byte[10240]; - while (true) { - int n = s.read (buf); - if (n == -1) break; - // LOG ("read %d", n); - if (count + n + 1 >= size) { - int size2 = (int) (size * 1.2 + size0); - // LOG ("expand %d -> %d", size, size2); - ByteBuffer body2 = ByteBuffer.allocateDirect (size2); - body.rewind(); - body2.put (body); - body2.position (count); - body = body2; - size = size2; - } - body.put (buf, 0, n); - count += n; - } - } catch (Exception e) { - LOG ("load URL error: %s", e.toString()); - body.clear(); - body.put (e.toString().getBytes()); - body.put ((byte) 0); - } + if (loaded_url_body != null) { // Thread finished + + // LOG ("textclient finished %s", loading_url); + + ByteBuffer bb = loaded_url_body; + loading_url = null; + loaded_url_body = null; + return bb; + + } else if (loading_url != null) { // Waiting on thread + // LOG ("textclient waiting..."); + return null; - return body; + } else { // Launch thread + + loading_url = url; + LOG ("textclient launching %s...", url); + + new Thread (new Runnable() { + public void run() { + int size0 = 10240; + int size = size0; + int count = 0; + ByteBuffer body = ByteBuffer.allocateDirect (size); + + try { + URL u = new URL (loading_url); + // LOG ("textclient thread loading: %s", u.toString()); + InputStream s = u.openStream(); + byte buf[] = new byte[10240]; + while (true) { + int n = s.read (buf); + if (n == -1) break; + // LOG ("textclient thread read %d", n); + if (count + n + 1 >= size) { + int size2 = (int) (size * 1.2 + size0); + // LOG ("textclient thread expand %d -> %d", size, size2); + ByteBuffer body2 = ByteBuffer.allocateDirect (size2); + body.rewind(); + body2.put (body); + body2.position (count); + body = body2; + size = size2; + } + body.put (buf, 0, n); + count += n; + } + } catch (Exception e) { + LOG ("load URL error: %s", e.toString()); + body.clear(); + body.put (e.toString().getBytes()); + body.put ((byte) 0); + } + + // LOG ("textclient thread finished %s (%d)", loading_url, size); + loaded_url_body = body; + } + }).start(); + + return null; + } } diff --git a/android/project/xscreensaver/xscreensaver.iml b/android/project/xscreensaver/xscreensaver.iml new file mode 100644 index 00000000..1af1dc54 --- /dev/null +++ b/android/project/xscreensaver/xscreensaver.iml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/config.h.in b/config.h.in index 4f3251cd..c8b4fdfe 100644 --- a/config.h.in +++ b/config.h.in @@ -458,3 +458,6 @@ /* Define to `unsigned int' if does not define. */ #undef size_t + +/* Define to `int' if or does not define. */ +#undef socklen_t diff --git a/configure b/configure index 75c16008..b0a24cb0 100755 --- a/configure +++ b/configure @@ -2796,6 +2796,7 @@ fi + ############################################################################### # # Some utility functions to make checking for X things easier. @@ -6050,6 +6051,40 @@ $as_echo "$ac_cv_have_getifaddrs" >&6; } $as_echo "#define HAVE_GETIFADDRS 1" >>confdefs.h fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socklen_t" >&5 +$as_echo_n "checking for socklen_t... " >&6; } +if ${ac_cv_type_socklen_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #include +int +main () +{ + + socklen_t socklen; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_type_socklen_t=yes +else + ac_cv_type_socklen_t=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_socklen_t" >&5 +$as_echo "$ac_cv_type_socklen_t" >&6; } + if test "$ac_cv_type_socklen_t" != yes; then + +$as_echo "#define socklen_t int" >>confdefs.h + + fi for ac_header in crypt.h sys/select.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` @@ -13272,7 +13307,7 @@ if ${ac_cv_mesagl_version_string+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext < #ifndef MESA_MAJOR_VERSION diff --git a/configure.in b/configure.in index 0098d909..3c558358 100644 --- a/configure.in +++ b/configure.in @@ -1048,6 +1048,17 @@ AC_DEFUN([AC_CHECK_GETIFADDRS], AC_DEFINE(HAVE_GETIFADDRS) fi]) +AC_DEFUN([AC_TYPE_SOCKLEN_T], + [AC_CACHE_CHECK([for socklen_t], ac_cv_type_socklen_t, + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #include ]], [[ + socklen_t socklen; + ]])],[ac_cv_type_socklen_t=yes],[ac_cv_type_socklen_t=no])]) + if test "$ac_cv_type_socklen_t" != yes; then + AC_DEFINE(socklen_t, int, + [Define to `int' if or does not define.]) + fi]) ############################################################################### # @@ -1254,6 +1265,7 @@ AC_CHECK_MEMBERS([struct sockaddr.sa_len],,, [[#include ]]) AC_CHECK_ICMP AC_CHECK_ICMPHDR AC_CHECK_GETIFADDRS +AC_TYPE_SOCKLEN_T AC_CHECK_HEADERS(crypt.h sys/select.h) AC_PROG_PERL diff --git a/driver/Makefile.in b/driver/Makefile.in index c1323048..e2a600d2 100644 --- a/driver/Makefile.in +++ b/driver/Makefile.in @@ -658,7 +658,6 @@ distdepend: check_men update_ad_version XScreenSaver_ad.h XScreenSaver_Xm_ad.h -e 's@ $$(srcdir)/\(.*config\.h\)@ \1@g' ; \ echo '' \ ) > /tmp/distdepend.$$$$ && \ - mv Makefile.in Makefile.in.bak && \ mv /tmp/distdepend.$$$$ Makefile.in # Updates the version number in the app-defaults file to be in sync with diff --git a/driver/XScreenSaver.ad.in b/driver/XScreenSaver.ad.in index 2b48a030..0e70efdc 100644 --- a/driver/XScreenSaver.ad.in +++ b/driver/XScreenSaver.ad.in @@ -4,8 +4,8 @@ ! a screen saver and locker for the X window system ! by Jamie Zawinski ! -! version 5.35 -! 24-May-2016 +! version 5.36 +! 10-Oct-2016 ! ! See "man xscreensaver" for more info. The latest version is always ! available at https://www.jwz.org/xscreensaver/ @@ -371,10 +371,15 @@ GetViewPortIsFullOfLies: False tessellimage -root \n\ @GL_KLUDGE@ GL: winduprobot -root \n\ @GL_KLUDGE@ GL: splitflap -root \n\ +@GL_KLUDGE@ GL: cubestack -root \n\ +@GL_KLUDGE@ GL: cubetwist -root \n\ +@GL_KLUDGE@ GL: discoball -root \n\ @GL_KLUDGE@ GL: dymaxionmap -root \n\ @GL_KLUDGE@ GL: energystream -root \n\ +@GL_KLUDGE@ GL: hexstrut -root \n\ @GL_KLUDGE@ GL: hydrostat -root \n\ @GL_KLUDGE@ GL: raverhoop -root \n\ +@GL_KLUDGE@ GL: splodesic -root \n\ @GL_KLUDGE@ GL: unicrud -root \n @@ -460,7 +465,9 @@ XScreenSaver.bourneShell: /bin/sh *hacks.ccurve.name: CCurve *hacks.cloudlife.name: CloudLife *hacks.companioncube.name: CompanionCube +*hacks.cubestack.name: CubeStack *hacks.cubestorm.name: CubeStorm +*hacks.cubetwist.name: CubeTwist *hacks.cubicgrid.name: CubicGrid *hacks.cwaves.name: CWaves *hacks.dangerball.name: DangerBall diff --git a/driver/XScreenSaver_ad.h b/driver/XScreenSaver_ad.h index 5ca109b4..7e0e279a 100644 --- a/driver/XScreenSaver_ad.h +++ b/driver/XScreenSaver_ad.h @@ -266,10 +266,15 @@ tessellimage -root \\n\ GL: winduprobot -root \\n\ GL: splitflap -root \\n\ + GL: cubestack -root \\n\ + GL: cubetwist -root \\n\ + GL: discoball -root \\n\ GL: dymaxionmap -root \\n\ GL: energystream -root \\n\ + GL: hexstrut -root \\n\ GL: hydrostat -root \\n\ GL: raverhoop -root \\n\ + GL: splodesic -root \\n\ GL: unicrud -root \\n", "XScreenSaver.pointerPollTime: 0:00:05", "XScreenSaver.pointerHysteresis: 10", @@ -325,7 +330,9 @@ "*hacks.ccurve.name: CCurve", "*hacks.cloudlife.name: CloudLife", "*hacks.companioncube.name: CompanionCube", +"*hacks.cubestack.name: CubeStack", "*hacks.cubestorm.name: CubeStorm", +"*hacks.cubetwist.name: CubeTwist", "*hacks.cubicgrid.name: CubicGrid", "*hacks.cwaves.name: CWaves", "*hacks.dangerball.name: DangerBall", diff --git a/driver/subprocs.c b/driver/subprocs.c index 29ad6009..0ccf7d23 100644 --- a/driver/subprocs.c +++ b/driver/subprocs.c @@ -44,6 +44,7 @@ #endif /* VMS */ #include /* for the signal names */ +#include #if !defined(SIGCHLD) && defined(SIGCLD) # define SIGCHLD SIGCLD @@ -1303,6 +1304,7 @@ get_best_gl_visual (saver_info *si, Screen *screen) { int result = 0; int wait_status = 0; + pid_t pid = -1; FILE *f = fdopen (in, "r"); unsigned long v = 0; @@ -1321,8 +1323,17 @@ get_best_gl_visual (saver_info *si, Screen *screen) close (errin); } - /* Wait for the child to die. */ - waitpid (-1, &wait_status, 0); + /* Wait for the child to die - wait for this pid only, not others. */ + pid = waitpid (forked, &wait_status, 0); + if (si->prefs.debug_p) + { + write_string (STDERR_FILENO, blurb()); + write_string (STDERR_FILENO, ": waitpid("); + write_long (STDERR_FILENO, (long) forked); + write_string (STDERR_FILENO, ") ==> "); + write_long (STDERR_FILENO, (long) pid); + write_string (STDERR_FILENO, "\n"); + } unblock_sigchld(); /* child is dead and waited, unblock now. */ diff --git a/driver/xscreensaver-getimage.c b/driver/xscreensaver-getimage.c index f22504e9..f702f679 100644 --- a/driver/xscreensaver-getimage.c +++ b/driver/xscreensaver-getimage.c @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2001-2013 by Jamie Zawinski +/* xscreensaver, Copyright (c) 2001-2016 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 @@ -69,7 +69,7 @@ /* On MacOS under X11, the usual X11 mechanism of getting a screen shot doesn't work, and we need to use an external program. This is only used when running under X11 on MacOS. If it's a Cocoa build, this - path is not taken, and OSX/osxgrabscreen.m is used instead. + path is not taken, and OSX/grabclient-osx.m is used instead. */ # define USE_EXTERNAL_SCREEN_GRABBER #endif diff --git a/driver/xscreensaver-text b/driver/xscreensaver-text index 1b55832d..1d0170d9 100755 --- a/driver/xscreensaver-text +++ b/driver/xscreensaver-text @@ -37,7 +37,7 @@ use Text::Wrap qw(wrap); use bytes; my $progname = $0; $progname =~ s@.*/@@g; -my ($version) = ('$Revision: 1.41 $' =~ m/\s(\d[.\d]+)\s/s); +my ($version) = ('$Revision: 1.44 $' =~ m/\s(\d[.\d]+)\s/s); my $verbose = 0; my $http_proxy = undef; @@ -158,6 +158,7 @@ sub get_x11_prefs_1($) { my $got_any_p = 0; $body =~ s@\\\n@@gs; + $body =~ s@^[ \t]*#[^\n]*$@@gm; if ($body =~ m/^[.*]*textMode:[ \t]*([^\s]+)\s*$/im) { $text_mode = $1; @@ -300,8 +301,9 @@ sub output() { $text_file =~ s@^~/@$ENV{HOME}/@s; # allow literal "~/" - if (open (my $in, '<', $text_file)) { + if (open (my $in, '<:raw', $text_file)) { print STDERR "$progname: reading $text_file\n" if ($verbose); + binmode (STDOUT, ':raw'); if (($wrap_columns && $wrap_columns > 0) || $truncate_lines) { # read it, then reformat it. @@ -783,6 +785,8 @@ sub main() { $load_p = 0; } elsif (m/^--?text$/) { $text_mode = 'literal'; $text_literal = shift @ARGV || ''; + $text_literal =~ s@\\n@\n@gs; + $text_literal =~ s@\\\n@\n@gs; $load_p = 0; } elsif (m/^--?file$/) { $text_mode = 'file'; $text_file = shift @ARGV || ''; diff --git a/hacks/Makefile.in b/hacks/Makefile.in index ccc0b616..c1e25eba 100644 --- a/hacks/Makefile.in +++ b/hacks/Makefile.in @@ -422,7 +422,6 @@ distdepend:: m6502.h -e 's@ $$(srcdir)/\(m6502.h\)@ \1@g' ; \ echo '' \ ) > /tmp/distdepend.$$$$ && \ - mv Makefile.in Makefile.in.bak && \ mv /tmp/distdepend.$$$$ Makefile.in TAGS: tags diff --git a/hacks/analogtv.h b/hacks/analogtv.h index 99c7909d..0bc8b260 100644 --- a/hacks/analogtv.h +++ b/hacks/analogtv.h @@ -1,4 +1,4 @@ -/* analogtv, Copyright (c) 2003, 2004 Trevor Blackwell +/* analogtv, Copyright (c) 2003-2016 Trevor Blackwell * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -304,7 +304,7 @@ int analogtv_handle_events (analogtv *it); #else /* Need to really crank this up for it to look good on the iPhone screen. */ # define ANALOGTV_DEF_BRIGHTNESS "3" -# define ANALOGTV_DEF_CONTRAST "1000" +# define ANALOGTV_DEF_CONTRAST "400" #endif #define ANALOGTV_DEFAULTS \ diff --git a/hacks/asm6502.c b/hacks/asm6502.c index 2228a38e..b9b7e1e4 100644 --- a/hacks/asm6502.c +++ b/hacks/asm6502.c @@ -1874,7 +1874,7 @@ static BOOL translate(m6502_Opcodes *op,Param *param, machine_6502 *machine){ if (op->BRA) { pushByte(machine, op->BRA); { - int diff = (param->lbladdr - machine->defaultCodePC); + int diff = abs((int)param->lbladdr - (int)machine->defaultCodePC); int backward = (param->lbladdr < machine->defaultCodePC); pushByte(machine, (backward) ? 0xff - diff : diff - 1); } diff --git a/hacks/check-configs.pl b/hacks/check-configs.pl index d4ec7199..f8bba1de 100755 --- a/hacks/check-configs.pl +++ b/hacks/check-configs.pl @@ -21,7 +21,7 @@ use diagnostics; use strict; my $progname = $0; $progname =~ s@.*/@@g; -my ($version) = ('$Revision: 1.21 $' =~ m/\s(\d[.\d]+)\s/s); +my ($version) = ('$Revision: 1.22 $' =~ m/\s(\d[.\d]+)\s/s); my $verbose = 0; my $debug_p = 0; @@ -204,6 +204,8 @@ sub parse_src($) { return (\%res_to_val, \%switch_to_res); } +my %video_dups; + # Returns a list of: # "resource = default value" # or "resource != non-default value" @@ -427,6 +429,13 @@ sub parse_xml($$$) { # error ("$file: no video") unless $video; print STDERR "\n$file: WARNING: no video\n\n" unless $video; + if ($video && $video_dups{$video} && + $video_dups{$video} ne $saver_title) { + print STDERR "\n$file: WARNING: $saver_title: dup video with " . + $video_dups{$video} . "\n"; + } + $video_dups{$video} = $saver_title if ($video); + return ($saver_title, $gl_p, \@result, \@widgets); } @@ -696,6 +705,8 @@ sub build_android(@) { my $xml_header = "\n"; my $manifest = ''; + my $daydream_java = ''; + my $settings_java = ''; my $arrays = ''; my $strings = ''; my %write_files; @@ -721,12 +732,9 @@ sub build_android(@) { my ($saver_title, $gl_p, $xml_opts, $widgets) = parse_xml ($saver, $switchmap, $src_opts); - my $daydream_class = "${saver_title}Daydream"; - my $settings_class = "${saver_title}Settings"; - foreach ($settings_class, $daydream_class) { - s/\s+//gs; - s/^([a-z])/\U$1/gs; # upcase first letter - } + my $saver_class = "${saver_title}"; + $saver_class =~ s/\s+//gs; + $saver_class =~ s/^([a-z])/\U$1/gs; # upcase first letter $saver_title =~ s/(.[a-z])([A-Z\d])/$1 $2/gs; # Spaces in InterCaps $saver_title =~ s/^(GL|RD)[- ]?(.)/$1 \U$2/gs; # Space after "GL" @@ -932,7 +940,7 @@ sub build_android(@) { " android:summary=\"" . $localize0->("${saver_underscore}_saver_desc", $daydream_desc) . "\"\n" . - " android:name=\".gen.$daydream_class\"\n" . + " android:name=\".gen.Daydream\$$saver_class\"\n" . " android:permission=\"android.permission" . ".BIND_DREAM_SERVICE\"\n" . " android:exported=\"true\"\n" . @@ -947,23 +955,28 @@ sub build_android(@) { " android:resource=\"\@xml/${saver}_dream\" />\n" . "\n" . "\n" + "$package.gen.Settings\$$saver_class\" />\n" ); my $dream = ("\n"); + "$package.gen.Settings\$$saver_class\" />\n"); $write_files{"$xml_dir/${saver_underscore}_dream.xml"} = $dream; - $write_files{"$java_dir/$daydream_class.java"} = - read_template ("XScreenSaverDaydream.java.in", - { CLASS => $daydream_class, - API => ($gl_p ? 'GL' : 'XLIB') }); - - $write_files{"$java_dir/$settings_class.java"} = - read_template ("XScreenSaverSettings.java.in", - { CLASS => $settings_class }); + $daydream_java .= + (" public static class $saver_class extends XScreenSaverDaydream {\n" . + " public $saver_class() {\n" . + " super(jwxyz.API_" . ($gl_p ? 'GL' : 'XLIB') . ");\n" . + " }\n" . + " }\n" . + "\n"); + + $settings_java .= + (" public static class $saver_class extends XScreenSaverSettings\n" . + " implements SharedPreferences.OnSharedPreferenceChangeListener {\n" . + " }\n" . + "\n"); } $arrays =~ s/^/ /gm; @@ -1032,9 +1045,29 @@ sub build_android(@) { " \n" . "\n"); + $daydream_java = ("package org.jwz.xscreensaver.gen;\n" . + "\n" . + "import org.jwz.xscreensaver.XScreenSaverDaydream;\n" . + "import org.jwz.xscreensaver.jwxyz;\n" . + "\n" . + "public class Daydream {\n" . + $daydream_java . + "}\n"); + + $settings_java = ("package org.jwz.xscreensaver.gen;\n" . + "\n" . + "import android.content.SharedPreferences;\n" . + "import org.jwz.xscreensaver.XScreenSaverSettings;\n" . + "\n" . + "public class Settings {\n" . + $settings_java . + "}\n"); + $write_files{"$project_dir/AndroidManifest.xml"} = $manifest; $write_files{"$values_dir/settings.xml"} = $arrays; $write_files{"$values_dir/strings.xml"} = $strings; + $write_files{"$java_dir/Daydream.java"} = $daydream_java; + $write_files{"$java_dir/Settings.java"} = $settings_java; my @s2 = (); foreach my $saver (sort @savers) { @@ -1080,18 +1113,21 @@ sub build_android(@) { # if a hack is removed from $ANDROID_HACKS in android/Makefile but # the old XML files remain behind, the build blows up. # - opendir (my $dirp, $xml_dir) || error ("$xml_dir: $!"); - my @files = readdir ($dirp); - closedir $dirp; - foreach my $f (sort @files) { - next if ($f eq '.' || $f eq '..'); - $f = "$xml_dir/$f"; - next if (defined ($write_files{$f})); - if ($f =~ m/_(settings|dream)\.xml$/s) { - print STDERR "$progname: rm $f\n"; - unlink ($f) unless ($debug_p); - } else { - print STDERR "$progname: warning: unrecognised file: $f\n"; + foreach my $dd ($xml_dir, $gen_dir, $java_dir) { + opendir (my $dirp, $dd) || error ("$dd: $!"); + my @files = readdir ($dirp); + closedir $dirp; + foreach my $f (sort @files) { + next if ($f eq '.' || $f eq '..'); + $f = "$dd/$f"; + next if (defined ($write_files{$f})); + if ($f =~ m/_(settings|dream)\.xml$/s || + $f =~ m/(Settings|Daydream)\.java$/s) { + print STDERR "$progname: rm $f\n"; + unlink ($f) unless ($debug_p); + } else { + print STDERR "$progname: warning: unrecognised file: $f\n"; + } } } } diff --git a/hacks/config/README b/hacks/config/README index fa35d942..c141b17d 100644 --- a/hacks/config/README +++ b/hacks/config/README @@ -4,8 +4,8 @@ a screen saver and locker for the X window system by Jamie Zawinski - version 5.35 - 24-May-2016 + version 5.36 + 10-Oct-2016 https://www.jwz.org/xscreensaver/ diff --git a/hacks/config/cubestack.xml b/hacks/config/cubestack.xml new file mode 100644 index 00000000..68c550ec --- /dev/null +++ b/hacks/config/cubestack.xml @@ -0,0 +1,44 @@ + + + + + + + diff --git a/hacks/config/cubetwist.xml b/hacks/config/cubetwist.xml new file mode 100644 index 00000000..00f54b82 --- /dev/null +++ b/hacks/config/cubetwist.xml @@ -0,0 +1,46 @@ + + + + + + + diff --git a/hacks/config/discoball.xml b/hacks/config/discoball.xml new file mode 100644 index 00000000..61ed94cd --- /dev/null +++ b/hacks/config/discoball.xml @@ -0,0 +1,37 @@ + + + + + + + diff --git a/hacks/config/glplanet.xml b/hacks/config/glplanet.xml index dc93c8b8..877cdfa8 100644 --- a/hacks/config/glplanet.xml +++ b/hacks/config/glplanet.xml @@ -13,7 +13,8 @@ - + +
diff --git a/hacks/config/hexstrut.xml b/hacks/config/hexstrut.xml new file mode 100644 index 00000000..0823dc87 --- /dev/null +++ b/hacks/config/hexstrut.xml @@ -0,0 +1,48 @@ + + + + + + + diff --git a/hacks/config/photopile.xml b/hacks/config/photopile.xml index 6337dbd8..a174afd1 100644 --- a/hacks/config/photopile.xml +++ b/hacks/config/photopile.xml @@ -45,7 +45,7 @@ _low-label="Short" _high-label="Long" low="1" high="60" default="5"/> - + diff --git a/hacks/config/rotzoomer.xml b/hacks/config/rotzoomer.xml index bd4ce740..d610fcba 100644 --- a/hacks/config/rotzoomer.xml +++ b/hacks/config/rotzoomer.xml @@ -4,7 +4,7 @@ -