From 8936fea5b02b2714896c2e84326087f1b0c364b4 Mon Sep 17 00:00:00 2001 From: Zygo Blaxell Date: Fri, 5 Jul 2019 22:02:21 -0400 Subject: [PATCH] From http://www.jwz.org/xscreensaver/xscreensaver-5.43.tar.gz -rw-rw-r-- 1 zblaxell zblaxell 26968319 Jul 2 16:27 xscreensaver-5.43.tar.gz 26f5f2535869ec90926e3e6f6df342cf96548c8f xscreensaver-5.43.tar.gz --- OSX/Makefile | 18 +- OSX/PrefsReader.m | 5 +- OSX/README | 2 +- OSX/SaverListController.m | 4 +- OSX/SaverRunner.m | 18 +- OSX/SaverRunner.plist | 10 +- OSX/Updater.plist | 10 +- OSX/XScreenSaver.plist | 4 +- OSX/XScreenSaverConfigSheet.h | 6 +- OSX/XScreenSaverConfigSheet.m | 149 +- OSX/XScreenSaverGLView.m | 8 +- OSX/XScreenSaverView.h | 3 +- OSX/XScreenSaverView.m | 91 +- OSX/bindist.rtf | 4 +- OSX/build-fntable.pl | 10 +- .../InfoPlist.strings | Bin .../SaverRunner.nib/designable.nib | 0 .../SaverRunner.nib/keyedobjects.nib | Bin OSX/gallant12x22.ttf | Bin 0 -> 25644 bytes OSX/{Gallant19.bdf => gallant19.bdf} | 0 OSX/grabclient-ios.m | 4 +- OSX/iSaverRunner.plist | 11 +- OSX/installer.sh | 7 +- OSX/ios-function-table.m | 6 +- OSX/textclient-ios.m | 9 +- OSX/xscreensaver.xcodeproj/project.pbxproj | 342 +- README | 12 + android/Makefile | 2 + .../assets/fonts/gallant12x22.ttf | 1 + android/xscreensaver/assets/fonts/luximr.ttf | 1 + .../src/org/jwz/xscreensaver/jwxyz.java | 12 +- config.h.in | 6 + configure | 583 ++- configure.in | 187 +- driver/Makefile.in | 16 +- driver/XScreenSaver.ad.in | 286 +- driver/XScreenSaver_ad.h | 95 +- driver/demo-Gtk.c | 8 +- driver/demo-Xm.c | 3 +- driver/lock.c | 4 +- driver/remote.c | 118 +- driver/screens.c | 4 +- driver/splash.c | 2 +- driver/subprocs.c | 24 +- driver/types.h | 5 +- driver/windows.c | 20 +- driver/xscreensaver-command.c | 15 +- driver/xscreensaver-command.man | 11 +- driver/xscreensaver-systemd.c | 232 + driver/xscreensaver-systemd.man | 49 + driver/xscreensaver.c | 64 +- driver/xscreensaver.h | 5 +- driver/xscreensaver.man | 17 +- hacks/bsod.c | 26 +- hacks/ccurve.c | 2 +- hacks/config/README | 4 +- hacks/config/bouncingcow.xml | 6 +- hacks/config/deepstars.xml | 29 + hacks/config/flyingtoasters.xml | 1 + hacks/config/glplanet.xml | 11 +- hacks/config/gravitywell.xml | 44 + hacks/config/hexadrop.xml | 2 +- hacks/config/imsmap.xml | 2 +- hacks/config/unknownpleasures.xml | 2 + hacks/filmleader.c | 20 +- hacks/fontglide.c | 4 +- hacks/fps.c | 45 +- hacks/fuzzyflakes.c | 8 +- hacks/glitchpeg.c | 17 +- hacks/glx/Makefile.in | 57 +- hacks/glx/bouncingcow.c | 224 +- hacks/glx/bouncingcow.man | 5 + hacks/glx/boxed.c | 2 +- hacks/glx/circuit.man | 2 +- hacks/glx/esper.c | 4 +- hacks/glx/fliptext.c | 4 +- hacks/glx/flyingtoasters.c | 24 +- hacks/glx/flyingtoasters.man | 4 + hacks/glx/gears.c | 6 +- hacks/glx/glhanoi.c | 4 +- hacks/glx/glplanet.c | 206 +- hacks/glx/glplanet.man | 10 + hacks/glx/glslideshow.c | 32 +- hacks/glx/gravitywell.c | 767 +++ hacks/glx/gravitywell.man | 64 + hacks/glx/hypertorus.c | 4 + hacks/glx/jigsaw.c | 4 +- hacks/glx/lament.c | 2 +- hacks/glx/peepers.c | 5 +- hacks/glx/quickhull.c | 7 +- hacks/glx/sonar-icmp.c | 53 +- hacks/glx/splodesic.c | 2 +- hacks/glx/unknownpleasures.c | 120 +- hacks/glx/unknownpleasures.man | 6 + hacks/hexadrop.c | 54 +- hacks/kumppa.c | 8 +- hacks/petri.c | 11 +- hacks/shadebobs.c | 2 +- hacks/webcollage | 6 +- hacks/xjack.c | 10 +- jwxyz/jwxyz-cocoa.m | 24 +- jwxyz/jwxyz-common.c | 3 +- jwxyz/jwxyz-timers.c | 10 +- jwxyz/jwxyz.m | 4 +- jwxyz/jwzgles.c | 6 +- jwxyz/jwzglesI.h | 4 +- po/POTFILES.in | 4 +- po/ru.po | 4313 +++++++++-------- utils/colors.c | 6 +- utils/erase.c | 2 +- utils/font-retry.c | 53 +- utils/thread_util.c | 2 +- utils/version.h | 2 +- xscreensaver.spec | 2 +- 114 files changed, 6204 insertions(+), 2666 deletions(-) rename OSX/{English.lproj => en.lproj}/InfoPlist.strings (100%) rename OSX/{English.lproj => en.lproj}/SaverRunner.nib/designable.nib (100%) rename OSX/{English.lproj => en.lproj}/SaverRunner.nib/keyedobjects.nib (100%) create mode 100644 OSX/gallant12x22.ttf rename OSX/{Gallant19.bdf => gallant19.bdf} (100%) create mode 120000 android/xscreensaver/assets/fonts/gallant12x22.ttf create mode 120000 android/xscreensaver/assets/fonts/luximr.ttf create mode 100644 driver/xscreensaver-systemd.c create mode 100644 driver/xscreensaver-systemd.man create mode 100644 hacks/config/deepstars.xml create mode 100644 hacks/config/gravitywell.xml create mode 100644 hacks/glx/gravitywell.c create mode 100644 hacks/glx/gravitywell.man diff --git a/OSX/Makefile b/OSX/Makefile index 456c1bd8..bf1f6c61 100644 --- a/OSX/Makefile +++ b/OSX/Makefile @@ -12,6 +12,7 @@ XCODE_APP = /Applications/Xcode.app TARGETS = All Savers #ARCH = -arch i386 -arch x86_64 ONLY_ACTIVE_ARCH=NO CERT = 'Developer ID Installer: Jamie Zawinski (4627ATJELP)' +CERT2 = 'Developer ID Application: Jamie Zawinski (4627ATJELP)' PKGID = org.jwz.xscreensaver THUMBDIR = build/screenshots XCODEBUILD = $(XCODE_APP)/Contents/Developer/usr/bin/xcodebuild @@ -286,7 +287,6 @@ build/Release/installer.pkg: installer.rtf installer.xml installer.sh installer. rm -rf "$$STAGE" ; \ -# -format UDBZ saves 4% (~1.2 MB) over UDZO. dmg:: distdepend check_versions check_coretext #dmg:: check_gc dmg:: build/Release/installer.pkg @@ -362,6 +362,10 @@ _dmg:: mv "$$STAGE/bindist2.webloc" "$$STAGE/Get the Android Version.webloc" ; \ \ set +x ; \ + \ + echo "Chowning..." ; \ + sudo chown -R root:wheel "$$STAGE/"* ; \ + \ echo "Checking signatures..." ; \ spctl --assess --type install "$$PKG" ; \ spctl --assess --type execute "$$SRC/XScreenSaverUpdater.app" ; \ @@ -377,6 +381,10 @@ _dmg:: "$$TMPDMG" -o "$$DMG" ; \ xattr -w com.apple.quarantine "0000;00000000;;" "$$DMG" ; \ rm -f "$$TMPDMG" ; \ + \ + codesign --sign $(CERT2) "$$DMG" ; \ + spctl --assess --type install "$$DMG" ; \ + \ ls -ldhgF "$$DMG" ; \ $(MAKE) notarize ; \ @@ -389,8 +397,8 @@ _dmg:: # Pass: the one you just generated. # # "make notarize", which will upload the DMG (slow). -# A response will be emailed back in about an hour. -# When that arrives, "make staple". +# "notarize_wait" waits for the response to be ready (takes 5+ minutes). +# Only once that has arrived can we "staple" it onto the DMG. # # https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution/customizing_the_notarization_workflow?language=objc # @@ -433,12 +441,12 @@ staple:: DMG="$$OUTDIR/$$BASE.dmg" ; \ set -x ; \ xcrun stapler staple "$$DMG" ; \ - xcrun stapler validate "$$DMG" + xcrun stapler validate "$$DMG" ; \ notarization_history:: xcrun altool --notarization-history 0 $(NOTARGS) @echo 'now do: xcrun altool $(NOTARGS) --notarization-info ' ; \ - echo 'and wget the LogFileURL' + echo 'and wget the LogFileURL' ; \ # When debugging, sometimes I have to reset the preferences for all diff --git a/OSX/PrefsReader.m b/OSX/PrefsReader.m index a1c4ed48..11f7feeb 100644 --- a/OSX/PrefsReader.m +++ b/OSX/PrefsReader.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2015 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2019 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 @@ -468,7 +468,8 @@ return NULL; } if (! [o isKindOfClass:[NSString class]]) { - NSLog(@"asked for %s as a string, but it is a %@", name, [o class]); + // Yeah, we do this sometimes. It's fine. + // NSLog(@"asked for %s as a string, but it is a %@", name, [o class]); o = [(NSNumber *) o stringValue]; } diff --git a/OSX/README b/OSX/README index e57d5a73..502ad101 100644 --- a/OSX/README +++ b/OSX/README @@ -36,7 +36,7 @@ ridiculously long list of steps! 16: Put a 200x150 screen shot in ~/www/xscreensaver/screenshots/ 17: ln -s ../../src/xscreensaver/OSX/build/Debug/NEW.saver \ ~/Library/Screen\ Savers/ - 18: git add xscreensaver.xcodeproj/xcuserdata/*/xcschemes/*.xcscheme + 18: git add xscreensaver.xcodeproj/xcshareddata/xcschemes/*.xcscheme 19: Don't forget to create a man page from the XML with xml2man.pl, and update Makefile.in. 20: Make a video: -record-animation 3600 -geom 1920x1080+128+64 diff --git a/OSX/SaverListController.m b/OSX/SaverListController.m index e68387c9..71b5fb5e 100644 --- a/OSX/SaverListController.m +++ b/OSX/SaverListController.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2012-2018 Jamie Zawinski +/* xscreensaver, Copyright (c) 2012-2019 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 @@ -125,7 +125,7 @@ win.size.height = 44; // #### This cannot possibly be right. UISearchBar *search = [[UISearchBar alloc] initWithFrame:win]; search.delegate = self; - search.placeholder = @"Search..."; + search.placeholder = NSLocalizedString(@"Search...", @""); self.tableView.tableHeaderView = search; // Dismiss the search field's keyboard as soon as we scroll. diff --git a/OSX/SaverRunner.m b/OSX/SaverRunner.m index 8ab45c1f..dc4352ec 100644 --- a/OSX/SaverRunner.m +++ b/OSX/SaverRunner.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2018 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2019 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,10 +67,13 @@ return self; } +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" - (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)o { return allowRotation; /* Deprecated in iOS 6 */ } +#pragma clang diagnostic pop - (BOOL)shouldAutorotate /* Added in iOS 6 */ { @@ -115,7 +118,7 @@ - (void)dealloc { - [_saverName release]; + [saverName release]; // iOS: When a UIView deallocs, it doesn't do [UIView removeFromSuperView] // for its subviews, so the subviews end up with a dangling pointer in their // superview properties. @@ -356,10 +359,12 @@ if (! _saverView) { UIAlertController *c = [UIAlertController - alertControllerWithTitle:@"Unable to load!" + alertControllerWithTitle: + NSLocalizedString(@"Unable to load!", @"") message:@"" preferredStyle:UIAlertControllerStyleAlert]; - [c addAction: [UIAlertAction actionWithTitle: @"Bummer" + [c addAction: [UIAlertAction actionWithTitle: + NSLocalizedString(@"Bummer", @"") style: UIAlertActionStyleDefault handler: ^(UIAlertAction *a) { // #### Should expose the SaverListController... @@ -391,10 +396,13 @@ } +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" - (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)o { return NO; /* Deprecated in iOS 6 */ } +#pragma clang diagnostic pop - (BOOL)shouldAutorotate /* Added in iOS 6 */ @@ -1343,7 +1351,7 @@ FAIL: rect.origin.y = 0; rect.size.width = rect.size.height = 10; pb = [[NSButton alloc] initWithFrame:rect]; - [pb setTitle:@"Preferences"]; + [pb setTitle:NSLocalizedString(@"Preferences", @"")]; [pb setBezelStyle:NSRoundedBezelStyle]; [pb sizeToFit]; diff --git a/OSX/SaverRunner.plist b/OSX/SaverRunner.plist index 1a5f022b..61045303 100644 --- a/OSX/SaverRunner.plist +++ b/OSX/SaverRunner.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleGetInfoString - 5.42 + 5.43 CFBundleIconFile SaverRunner CFBundleIdentifier @@ -15,21 +15,21 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - 5.42 + 5.43 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString - 5.42 + 5.43 CFBundleSignature ???? CFBundleVersion - 5.42 + 5.43 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright - 5.42 + 5.43 NSMainNibFile SaverRunner NSPrincipalClass diff --git a/OSX/Updater.plist b/OSX/Updater.plist index 05befe8e..47088928 100644 --- a/OSX/Updater.plist +++ b/OSX/Updater.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleGetInfoString - 5.42 + 5.43 CFBundleIconFile SaverRunner CFBundleIdentifier @@ -17,23 +17,23 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - 5.42 + 5.43 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString - 5.42 + 5.43 CFBundleSignature ???? CFBundleVersion - 5.42 + 5.43 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} LSUIElement NSHumanReadableCopyright - 5.42 + 5.43 NSMainNibFile Updater NSPrincipalClass diff --git a/OSX/XScreenSaver.plist b/OSX/XScreenSaver.plist index 4d106ada..c3fa8c9c 100644 --- a/OSX/XScreenSaver.plist +++ b/OSX/XScreenSaver.plist @@ -15,11 +15,11 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 5.42 + 5.43 CFBundleSignature ???? CFBundleVersion - 5.42 + 5.43 LSMinimumSystemVersion 10.8 NSMainNibFile diff --git a/OSX/XScreenSaverConfigSheet.h b/OSX/XScreenSaverConfigSheet.h index 8e40dde6..ae558dee 100644 --- a/OSX/XScreenSaverConfigSheet.h +++ b/OSX/XScreenSaverConfigSheet.h @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2018 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2019 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 @@ -57,6 +57,7 @@ NSDictionary *defaultOptions; const XrmOptionDescRec *opts; id xml_root, xml_parsing; + BOOL haveUpdater; # ifdef USE_IPHONE UITextField *active_text_field; @@ -74,6 +75,7 @@ options: (const XrmOptionDescRec *) opts controller: (NSUserDefaultsController *) prefs globalController: (NSUserDefaultsController *) globalPrefs - defaults: (NSDictionary *) defs; + defaults: (NSDictionary *) defs + haveUpdater: (BOOL) haveUpdater; @end diff --git a/OSX/XScreenSaverConfigSheet.m b/OSX/XScreenSaverConfigSheet.m index eaa5add1..185377c9 100644 --- a/OSX/XScreenSaverConfigSheet.m +++ b/OSX/XScreenSaverConfigSheet.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2017 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2019 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 @@ -103,10 +103,19 @@ typedef enum { SimpleXMLCommentKind, @synthesize attributes; @synthesize object; +- (void) dealloc +{ + [name release]; + [children release]; + //[attributes release]; + [object release]; + [super dealloc]; +} + - (id) init { self = [super init]; - attributes = [NSMutableArray arrayWithCapacity:10]; + attributes = [[NSMutableArray alloc] initWithCapacity:10]; return self; } @@ -189,7 +198,26 @@ typedef enum { SimpleXMLCommentKind, return value; } @end -#endif // USE_IPHONE + +/* Current theory is that the @"value" KVO binding on NSTextFields are + sometimes returning nil when they're empty, but meanwhile + [NSUserDefaults setObject:forKey:] needs non-nil objects. + */ +@interface NonNilStringTransformer: NSValueTransformer {} +@end +@implementation NonNilStringTransformer ++ (Class)transformedValueClass { return [NSString class]; } ++ (BOOL)allowsReverseTransformation { return YES; } + +- (id)transformedValue:(id)value { + return value ? value : @""; +} + +- (id)reverseTransformedValue:(id)value { + return value ? value : @""; +} +@end +#endif // !USE_IPHONE #pragma mark Implementing radio buttons @@ -217,6 +245,12 @@ typedef enum { SimpleXMLCommentKind, @synthesize index; @synthesize items; +- (void)dealloc +{ + [items release]; + [super dealloc]; +} + - (id) initWithIndex:(int)_index items:_items { self = [super initWithFrame:CGRectZero]; @@ -710,14 +744,14 @@ static void layout_group (NSView *group, BOOL horiz_p); - (void) okAction:(NSObject *)arg { + // Without this, edits to text fields only happen if the user hits RET. + // Clicking OK should also commit those edits. + [self makeFirstResponder:nil]; + // 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]; @@ -777,6 +811,9 @@ static void layout_group (NSView *group, BOOL horiz_p); if ([control isKindOfClass:[NSMatrix class]]) { opts_dict = @{ NSValueTransformerNameBindingOption: @"TextModeTransformer" }; + } else if ([control isKindOfClass:[NSTextField class]]) { + opts_dict = @{ NSValueTransformerNameBindingOption: + @"NonNilStringTransformer" }; } [control bind:bindto @@ -1233,7 +1270,7 @@ hreffify (NSText *nstext) [lab setEditable:NO]; [lab setBezeled:NO]; [lab setDrawsBackground:NO]; - [lab setStringValue:text]; + [lab setStringValue:NSLocalizedString(text, @"")]; [lab sizeToFit]; # else // USE_IPHONE UILabel *lab = [[UILabel alloc] initWithFrame:rect]; @@ -1255,15 +1292,21 @@ hreffify (NSText *nstext) */ - (void) makeCheckbox:(NSXMLNode *)node on:(NSView *)parent { - NSMutableDictionary *dict = [@{ @"id": @"", + NSMutableDictionary *dict = [@{ @"id": @"", @"_label": @"", @"arg-set": @"", - @"arg-unset": @"" } + @"arg-unset": @"", + @"disabled": @"" } mutableCopy]; [self parseAttrs:dict node:node]; NSString *label = [dict objectForKey:@"_label"]; NSString *arg_set = [dict objectForKey:@"arg-set"]; NSString *arg_unset = [dict objectForKey:@"arg-unset"]; + + NSString *dd = [dict objectForKey:@"disabled"]; + BOOL disabledp = (dd && + (NSOrderedSame == [dd caseInsensitiveCompare:@"true"] || + NSOrderedSame == [dd caseInsensitiveCompare:@"yes"])); [dict release]; dict = 0; @@ -1312,7 +1355,11 @@ hreffify (NSText *nstext) # endif // USE_IPHONE - [self bindSwitch:button cmdline:(arg_set ? arg_set : arg_unset)]; + if (disabledp) + [button setEnabled:NO]; + else + [self bindSwitch:button cmdline:(arg_set ? arg_set : arg_unset)]; + [button release]; } @@ -1509,7 +1556,7 @@ hreffify (NSText *nstext) rect.size.width = rect.size.height = 10; NSTextField *txt = [[NSTextField alloc] initWithFrame:rect]; - [txt setStringValue:@"0000.0"]; + [txt setStringValue:NSLocalizedString(@"0000.0", @"")]; [txt sizeToFit]; [txt setStringValue:@""]; @@ -1610,6 +1657,7 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) /* Creates the popup menu described by the given XML node (and its children). */ - (void) makeOptionMenu:(NSXMLNode *)node on:(NSView *)parent + disabled:(BOOL)disabled { NSArray *children = [node children]; NSUInteger i, count = [children count]; @@ -1790,7 +1838,10 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) # if !defined(USE_IPHONE) || defined(USE_PICKER_VIEW) [self placeChild:popup on:parent]; - [self bindResource:popup key:menu_key]; + if (disabled) + [popup setEnabled:NO]; + else + [self bindResource:popup key:menu_key]; [popup release]; # endif @@ -1829,6 +1880,11 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) } +- (void) makeOptionMenu:(NSXMLNode *)node on:(NSView *)parent +{ + [self makeOptionMenu:node on:parent disabled:NO]; +} + /* Creates an uneditable, wrapping NSTextField to display the given text enclosed by ... in the XML. @@ -1926,7 +1982,8 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) // make the default size be around 30 columns; a typical value for // these text fields is "xscreensaver-text --cols 40". // - [txt setStringValue:@"123456789 123456789 123456789 "]; + [txt setStringValue: + NSLocalizedString(@"123456789 123456789 123456789 ", @"")]; [txt sizeToFit]; [[txt cell] setWraps:NO]; [[txt cell] setScrollable:YES]; @@ -2001,7 +2058,7 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) // make the default size be around 20 columns. // - [txt setStringValue:@"123456789 123456789 "]; + [txt setStringValue:NSLocalizedString(@"123456789 123456789 ", @"")]; [txt sizeToFit]; [txt setSelectable:YES]; [txt setEditable:editable_p]; @@ -2037,7 +2094,7 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) rect.origin.x = rect.origin.y = 0; rect.size.width = rect.size.height = 10; NSButton *choose = [[NSButton alloc] initWithFrame:rect]; - [choose setTitle:@"Choose..."]; + [choose setTitle:NSLocalizedString(@"Choose...", @"")]; [choose setBezelStyle:NSRoundedBezelStyle]; [choose sizeToFit]; @@ -2072,6 +2129,22 @@ do_file_selector (NSTextField *txt, BOOL dirs_p) [panel setAllowsMultipleSelection:NO]; [panel setCanChooseFiles:!dirs_p]; [panel setCanChooseDirectories:dirs_p]; + [panel setCanCreateDirectories:NO]; + + NSString *def = [[txt stringValue] stringByExpandingTildeInPath]; + if (dirs_p) { + // Open in the previously-selected directory. + [panel setDirectoryURL: + [NSURL fileURLWithPath:def isDirectory:YES]]; + [panel setNameFieldStringValue:[def lastPathComponent]]; + } else { + // Open in the directory of the previously-selected file. + [panel setDirectoryURL: + [NSURL fileURLWithPath:[def stringByDeletingLastPathComponent] + isDirectory:YES]]; + // I hoped that this would select that file by default, but it does not. + [panel setNameFieldStringValue:[def lastPathComponent]]; + } NSInteger result = [panel runModal]; if (result == NSOKButton) { @@ -2083,6 +2156,9 @@ do_file_selector (NSTextField *txt, BOOL dirs_p) // Fuck me! Just setting the value of the NSTextField does not cause // that to end up in the preferences! // + [[txt window] makeFirstResponder:nil]; // And this doesn't fix it. + + // So set the value manually. NSDictionary *dict = [txt infoForBinding:@"value"]; NSUserDefaultsController *prefs = [dict objectForKey:@"NSObservedObject"]; NSString *path = [dict objectForKey:@"NSObservedKeyPath"]; @@ -2360,7 +2436,7 @@ find_text_field_of_button (NSButton *button) NSBox *box = [[NSBox alloc] initWithFrame:rect]; [box setTitlePosition:NSAtTop]; [box setBorderType:NSBezelBorder]; - [box setTitle:@"Display Text"]; + [box setTitle:NSLocalizedString(@"Display Text", @"")]; rect.size.width = rect.size.height = 12; [box setContentViewMargins:rect.size]; @@ -2481,6 +2557,7 @@ find_text_field_of_button (NSButton *button) @{ @"id": @SUSUEnableAutomaticChecksKey, @"_label": @"Automatically check for updates", @"arg-unset": @"-no-" SUSUEnableAutomaticChecksKey, + @"disabled": (haveUpdater ? @"no" : @"yes") }]; [self makeCheckbox:node2 on:group]; [node2 release]; @@ -2528,12 +2605,26 @@ find_text_field_of_button (NSButton *button) [node3 autorelease]; // - [self makeOptionMenu:node2 on:group]; + [self makeOptionMenu:node2 on:group disabled:!haveUpdater]; [node2 release]; // layout_group (group, TRUE); + if (!haveUpdater) { + // Add a second, explanatory label. + LABEL *lab2 = 0; + lab2 = [self makeLabel:@"XScreenSaverUpdater.app is not installed!\n" + "Unable to check for updates."]; + [self placeChild:lab2 on:group]; + + // Pack it in a little tighter vertically. + NSRect r2 = [lab2 frame]; + r2.origin.x += -4; + r2.origin.y += 14; + [lab2 setFrameOrigin:r2.origin]; + } + rect.size.width = rect.size.height = 0; NSBox *box = [[NSBox alloc] initWithFrame:rect]; [box setTitlePosition:NSNoTitle]; @@ -2997,13 +3088,13 @@ wrap_with_buttons (NSWindow *window, NSView *panel) rect.origin.x = rect.origin.y = 0; rect.size.width = rect.size.height = 10; NSButton *reset = [[NSButton alloc] initWithFrame:rect]; - [reset setTitle:@"Reset to Defaults"]; + [reset setTitle:NSLocalizedString(@"Reset to Defaults", @"")]; [reset setBezelStyle:NSRoundedBezelStyle]; [reset sizeToFit]; rect = [reset frame]; NSButton *ok = [[NSButton alloc] initWithFrame:rect]; - [ok setTitle:@"OK"]; + [ok setTitle:NSLocalizedString(@"OK", @"")]; [ok setBezelStyle:NSRoundedBezelStyle]; [ok sizeToFit]; rect = [bbox frame]; @@ -3012,7 +3103,7 @@ wrap_with_buttons (NSWindow *window, NSView *panel) rect = [ok frame]; NSButton *cancel = [[NSButton alloc] initWithFrame:rect]; - [cancel setTitle:@"Cancel"]; + [cancel setTitle:NSLocalizedString(@"Cancel", @"")]; [cancel setBezelStyle:NSRoundedBezelStyle]; [cancel sizeToFit]; rect.origin.x -= [cancel frame].size.width + 10; @@ -3267,7 +3358,8 @@ wrap_with_buttons (NSWindow *window, NSView *panel) { [[self navigationItem] setRightBarButtonItem: [[UIBarButtonItem alloc] - initWithTitle: @"Reset to Defaults" + initWithTitle: + NSLocalizedString(@"Reset to Defaults", @"") style: UIBarButtonItemStylePlain target:self action:@selector(resetAction:)]]; @@ -3278,7 +3370,15 @@ wrap_with_buttons (NSWindow *window, NSView *panel) } +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" - (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)o +{ + return YES; /* Deprecated in iOS 6 */ +} +#pragma clang diagnostic pop + +- (BOOL)shouldAutorotate /* Added in iOS 6 */ { return YES; } @@ -3377,6 +3477,8 @@ wrap_with_buttons (NSWindow *window, NSView *panel) } +#pragma clang diagnostic push /* Deprecated in iOS 8 */ +#pragma clang diagnostic ignored "-Wdeprecated-implementations" - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)o { [NSTimer scheduledTimerWithTimeInterval: 0 @@ -3385,6 +3487,7 @@ wrap_with_buttons (NSWindow *window, NSView *panel) userInfo:nil repeats:NO]; } +#pragma clang diagnostic pop #ifndef USE_PICKER_VIEW @@ -3640,6 +3743,7 @@ wrap_with_buttons (NSWindow *window, NSView *panel) controller: (NSUserDefaultsController *) _prefs globalController: (NSUserDefaultsController *) _globalPrefs defaults: (NSDictionary *) _defs + haveUpdater: (BOOL) _haveUpdater { # ifndef USE_IPHONE self = [super init]; @@ -3654,6 +3758,7 @@ wrap_with_buttons (NSWindow *window, NSView *panel) defaultOptions = _defs; userDefaultsController = [_prefs retain]; globalDefaultsController = [_globalPrefs retain]; + haveUpdater = _haveUpdater; NSXMLParser *xmlDoc = [[NSXMLParser alloc] initWithData:xml_data]; diff --git a/OSX/XScreenSaverGLView.m b/OSX/XScreenSaverGLView.m index 57b0c7c7..c9d659e7 100644 --- a/OSX/XScreenSaverGLView.m +++ b/OSX/XScreenSaverGLView.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2017 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2019 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 @@ -43,7 +43,7 @@ extern void check_gl_error (const char *type); /* With GL programs, drawing at full resolution isn't a problem. */ -- (CGFloat) hackedContentScaleFactor +- (CGFloat) hackedContentScaleFactor:(BOOL)fonts_p { # ifdef USE_IPHONE return [self contentScaleFactor]; @@ -351,8 +351,8 @@ init_GL (ModeInfo *mi) // Caller expects a pointer to an opaque struct... which it dereferences. // Don't ask me, it's historical... - static int blort = -1; - return (void *) &blort; + static GLXContext blort = (GLXContext) -1; + return &blort; } diff --git a/OSX/XScreenSaverView.h b/OSX/XScreenSaverView.h index 1965ef8e..f03f0a54 100644 --- a/OSX/XScreenSaverView.h +++ b/OSX/XScreenSaverView.h @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2017 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2019 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 @@ -155,6 +155,7 @@ + (NSString *) decompressXML:(NSData *)xml; - (CGFloat) hackedContentScaleFactor; +- (CGFloat) hackedContentScaleFactor:(BOOL)fonts_p; #ifdef USE_IPHONE - (void)setScreenLocked:(BOOL)locked; diff --git a/OSX/XScreenSaverView.m b/OSX/XScreenSaverView.m index 371cf177..ad505bda 100644 --- a/OSX/XScreenSaverView.m +++ b/OSX/XScreenSaverView.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2018 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2019 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 @@ -295,15 +295,11 @@ add_default_options (const XrmOptionDescRec *opts, # endif ".doubleBuffer: True", ".multiSample: False", -# ifndef USE_IPHONE - ".textMode: date", -# else ".textMode: url", -# endif - // ".textLiteral: ", - // ".textFile: ", + ".textLiteral: ", + ".textFile: ", ".textURL: https://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss", - // ".textProgram: ", + ".textProgram: ", ".grabDesktopImages: yes", # ifndef USE_IPHONE ".chooseRandomImages: no", @@ -932,6 +928,11 @@ screenhack_do_fps (Display *dpy, Window w, fps_state *fpst, void *closure) nature. */ - (CGFloat) hackedContentScaleFactor +{ + return [self hackedContentScaleFactor:FALSE]; +} + +- (CGFloat) hackedContentScaleFactor:(BOOL)fonts_p { # ifdef USE_IPHONE CGFloat s = self.contentScaleFactor; @@ -939,8 +940,8 @@ screenhack_do_fps (Display *dpy, Window w, fps_state *fpst, void *closure) CGFloat s = self.window.backingScaleFactor; # endif - if (_lowrez_p) { - NSSize b = [self bounds].size; + if (_lowrez_p && !fonts_p) { + NSSize b = [self bounds].size; // This is in points, not pixels CGFloat wh = b.width > b.height ? b.width : b.height; // Scale down to as close to 1024 as we can get without going under, @@ -1011,12 +1012,14 @@ current_device_rotation (void) e] preferredStyle:UIAlertControllerStyleAlert]; - [c addAction: [UIAlertAction actionWithTitle: @"Exit" + [c addAction: [UIAlertAction actionWithTitle: + NSLocalizedString(@"Exit", @"") style: UIAlertActionStyleDefault handler: ^(UIAlertAction *a) { exit (-1); }]]; - [c addAction: [UIAlertAction actionWithTitle: @"Keep going" + [c addAction: [UIAlertAction actionWithTitle: + NSLocalizedString(@"Keep going", @"") style: UIAlertActionStyleDefault handler: ^(UIAlertAction *a) { [self stopAndClose:NO]; @@ -1866,6 +1869,15 @@ gl_check_ver (const struct gl_version *caps, } +/* drawRect always does nothing, and animateOneFrame renders bits to the + screen. This is (now) true of both X11 and GL on both MacOS and iOS. + But this null method needs to exist or things complain. + */ +- (void)drawRect:(NSRect)rect +{ +} + + - (void) animateOneFrame { // Render X11 into the backing store bitmap... @@ -1990,10 +2002,13 @@ gl_check_ver (const struct gl_version *caps, # ifdef USE_IPHONE UIViewController *sheet; + NSString *updater = 0; # else // !USE_IPHONE NSWindow *sheet; + NSString *updater = [self updaterPath]; # endif // !USE_IPHONE + NSData *xmld = [NSData dataWithContentsOfFile:path]; NSString *xml = [[self class] decompressXML: xmld]; sheet = [[XScreenSaverConfigSheet alloc] @@ -2001,7 +2016,8 @@ gl_check_ver (const struct gl_version *caps, options:xsft->options controller:[prefsReader userDefaultsController] globalController:[prefsReader globalDefaultsController] - defaults:[prefsReader defaultOptions]]; + defaults:[prefsReader defaultOptions] + haveUpdater:(updater ? TRUE : FALSE)]; // #### am I expected to retain this, or not? wtf. // I thought not, but if I don't do this, we (sometimes) crash. @@ -2953,24 +2969,12 @@ gl_check_ver (const struct gl_version *caps, #endif // USE_IPHONE -- (void) checkForUpdates -{ # ifndef USE_IPHONE - // We only check once at startup, even if there are multiple screens, - // and even if this saver is running for many days. - // (Uh, except this doesn't work because this static isn't shared, - // even if we make it an exported global. Not sure why. Oh well.) - static BOOL checked_p = NO; - if (checked_p) return; - checked_p = YES; - - // If it's off, don't bother running the updater. Otherwise, the - // updater will decide if it's time to hit the network. - if (! get_boolean_resource (xdpy, - SUSUEnableAutomaticChecksKey, - SUSUEnableAutomaticChecksKey)) - return; +// Returns the full pathname to the Sparkle updater app. +// +- (NSString *) updaterPath +{ NSString *updater = @"XScreenSaverUpdater.app"; // There may be multiple copies of the updater: e.g., one in /Applications @@ -3001,11 +3005,37 @@ gl_check_ver (const struct gl_version *caps, if (app_path && [app_path hasPrefix:@"/Volumes/XScreenSaver "]) app_path = 0; // The DMG version will not do. + return app_path; +} +# endif // !USE_IPHONE + + +- (void) checkForUpdates +{ +# ifndef USE_IPHONE + // We only check once at startup, even if there are multiple screens, + // and even if this saver is running for many days. + // (Uh, except this doesn't work because this static isn't shared, + // even if we make it an exported global. Not sure why. Oh well.) + static BOOL checked_p = NO; + if (checked_p) return; + checked_p = YES; + + // If it's off, don't bother running the updater. Otherwise, the + // updater will decide if it's time to hit the network. + if (! get_boolean_resource (xdpy, + SUSUEnableAutomaticChecksKey, + SUSUEnableAutomaticChecksKey)) + return; + + NSString *app_path = [self updaterPath]; + if (!app_path) { - NSLog(@"Unable to find %@", updater); + NSLog(@"Unable to find XScreenSaverUpdater.app"); return; } + NSWorkspace *workspace = [NSWorkspace sharedWorkspace]; NSError *err = nil; if (! [workspace launchApplicationAtURL:[NSURL fileURLWithPath:app_path] options:(NSWorkspaceLaunchWithoutAddingToRecents | @@ -3028,6 +3058,7 @@ gl_check_ver (const struct gl_version *caps, static PrefsReader * get_prefsReader (Display *dpy) { + if (! dpy) return 0; XScreenSaverView *view = jwxyz_window_view (XRootWindow (dpy, 0)); if (!view) return 0; return [view prefsReader]; diff --git a/OSX/bindist.rtf b/OSX/bindist.rtf index 251bb11a..f6191e14 100644 --- a/OSX/bindist.rtf +++ b/OSX/bindist.rtf @@ -16,8 +16,8 @@ \b0 by Jamie Zawinski\ and many others\ \ -version 5.42\ -28-Dec-2018\ +version 5.43\ +01-Jul-2019\ \ {\field{\*\fldinst{HYPERLINK "https://www.jwz.org/xscreensaver/"}}{\fldrslt \cf2 \ul \ulc2 https://www.jwz.org/xscreensaver/}}\ \pard\pardeftab720 diff --git a/OSX/build-fntable.pl b/OSX/build-fntable.pl index c93343cf..1ba18a09 100755 --- a/OSX/build-fntable.pl +++ b/OSX/build-fntable.pl @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# Copyright © 2012-2018 Jamie Zawinski +# Copyright © 2012-2019 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 @@ -23,7 +23,7 @@ require 5; use strict; my $progname = $0; $progname =~ s@.*/@@g; -my ($version) = ('$Revision: 1.6 $' =~ m/\s(\d[.\d]+)\s/s); +my ($version) = ('$Revision: 1.7 $' =~ m/\s(\d[.\d]+)\s/s); my $verbose = 1; @@ -66,8 +66,10 @@ sub build_h($) { parse_makefiles(); - my @schemes = glob('xscreensaver.xcodeproj/xcuserdata/' . - '*.xcuserdatad/xcschemes/*.xcscheme'); + my @schemes = (glob('xscreensaver.xcodeproj/xcuserdata/' . + '*.xcuserdatad/xcschemes/*.xcscheme'), + glob('xscreensaver.xcodeproj/xcshareddata/' . + 'xcschemes/*.xcscheme')); error ("no scheme files") unless (@schemes); my %names = (); diff --git a/OSX/English.lproj/InfoPlist.strings b/OSX/en.lproj/InfoPlist.strings similarity index 100% rename from OSX/English.lproj/InfoPlist.strings rename to OSX/en.lproj/InfoPlist.strings diff --git a/OSX/English.lproj/SaverRunner.nib/designable.nib b/OSX/en.lproj/SaverRunner.nib/designable.nib similarity index 100% rename from OSX/English.lproj/SaverRunner.nib/designable.nib rename to OSX/en.lproj/SaverRunner.nib/designable.nib diff --git a/OSX/English.lproj/SaverRunner.nib/keyedobjects.nib b/OSX/en.lproj/SaverRunner.nib/keyedobjects.nib similarity index 100% rename from OSX/English.lproj/SaverRunner.nib/keyedobjects.nib rename to OSX/en.lproj/SaverRunner.nib/keyedobjects.nib diff --git a/OSX/gallant12x22.ttf b/OSX/gallant12x22.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c7ce0dc912683ec9257942d2e9a21339beed45ff GIT binary patch literal 25644 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 +/* xscreensaver, Copyright (c) 1992-2019 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 @@ -41,7 +41,7 @@ ios_load_random_image (void (*callback) (void *uiimage, const char *fn, // The rest of this is synchronous. - PHFetchOptions *opt = [PHFetchOptions new]; + PHFetchOptions *opt = [[PHFetchOptions new] autorelease]; opt.includeAssetSourceTypes = (PHAssetSourceTypeUserLibrary | PHAssetSourceTypeCloudShared | PHAssetSourceTypeiTunesSynced); diff --git a/OSX/iSaverRunner.plist b/OSX/iSaverRunner.plist index 92ca6f08..cfede1e7 100644 --- a/OSX/iSaverRunner.plist +++ b/OSX/iSaverRunner.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleGetInfoString - 5.42 + 5.43 CFBundleIcons CFBundleIcons~ipad @@ -19,21 +19,21 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - 5.42 + 5.43 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString - 5.42 + 5.43 CFBundleSignature ???? CFBundleVersion - 5.42 + 5.43 LSRequiresIPhoneOS NSHumanReadableCopyright - 5.42 + 5.43 NSMainNibFile iSaverRunner UIAppFonts @@ -42,6 +42,7 @@ YearlReg.ttf PxPlus_IBM_VGA8.ttf luximr.ttf + gallant12x22.ttf UILaunchStoryboardName LaunchScreen diff --git a/OSX/installer.sh b/OSX/installer.sh index fa92beb3..baa38ea5 100755 --- a/OSX/installer.sh +++ b/OSX/installer.sh @@ -1,5 +1,5 @@ #!/bin/sh -# XScreenSaver, Copyright © 2013-2016 Jamie Zawinski +# XScreenSaver, Copyright © 2013-2018 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 @@ -118,11 +118,16 @@ for f in *.{saver,app} "$UPDATER_SRC" ; do cp -pR "$f" "$DD" || error "Unable to install $f in $DST/" fi + # The files in the DMG might be owned by "jwz:staff" (503:20) + chown root:wheel "$DD" + # Eliminate the "this was downloaded from the interweb" warning. + # (This trick probably doesn't work.) xattr -r -d com.apple.quarantine "$DD" if [ "$EXT" = "app" ]; then # Eliminate the "this is from an unknown developer" warning. + # (This trick probably doesn't work.) spctl --add "$DD" fi diff --git a/OSX/ios-function-table.m b/OSX/ios-function-table.m index c2e5b88b..6cb8b7f6 100644 --- a/OSX/ios-function-table.m +++ b/OSX/ios-function-table.m @@ -1,5 +1,5 @@ /* Generated file, do not edit. - Created: Tue Oct 23 19:02:07 2018 by build-fntable.pl 1.6. + Created: Sat Apr 27 19:53:47 2019 by build-fntable.pl 1.7. */ #import @@ -58,6 +58,7 @@ extern struct xscreensaver_function_table dangerball_xscreensaver_function_table, decayscreen_xscreensaver_function_table, deco_xscreensaver_function_table, + deepstars_xscreensaver_function_table, deluxe_xscreensaver_function_table, demon_xscreensaver_function_table, discoball_xscreensaver_function_table, @@ -104,6 +105,7 @@ extern struct xscreensaver_function_table gltext_xscreensaver_function_table, goop_xscreensaver_function_table, grav_xscreensaver_function_table, + gravitywell_xscreensaver_function_table, greynetic_xscreensaver_function_table, halftone_xscreensaver_function_table, halo_xscreensaver_function_table, @@ -298,6 +300,7 @@ NSDictionary *make_function_table_dict(void) [NSValue valueWithPointer:&dangerball_xscreensaver_function_table], @"dangerball", [NSValue valueWithPointer:&decayscreen_xscreensaver_function_table], @"decayscreen", [NSValue valueWithPointer:&deco_xscreensaver_function_table], @"deco", + [NSValue valueWithPointer:&deepstars_xscreensaver_function_table], @"deepstars", [NSValue valueWithPointer:&deluxe_xscreensaver_function_table], @"deluxe", [NSValue valueWithPointer:&demon_xscreensaver_function_table], @"demon", [NSValue valueWithPointer:&discoball_xscreensaver_function_table], @"discoball", @@ -344,6 +347,7 @@ NSDictionary *make_function_table_dict(void) [NSValue valueWithPointer:&gltext_xscreensaver_function_table], @"gltext", [NSValue valueWithPointer:&goop_xscreensaver_function_table], @"goop", [NSValue valueWithPointer:&grav_xscreensaver_function_table], @"grav", + [NSValue valueWithPointer:&gravitywell_xscreensaver_function_table], @"gravitywell", [NSValue valueWithPointer:&greynetic_xscreensaver_function_table], @"greynetic", [NSValue valueWithPointer:&halftone_xscreensaver_function_table], @"halftone", [NSValue valueWithPointer:&halo_xscreensaver_function_table], @"halo", diff --git a/OSX/textclient-ios.m b/OSX/textclient-ios.m index 5db53114..4759b05b 100644 --- a/OSX/textclient-ios.m +++ b/OSX/textclient-ios.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2012-2016 Jamie Zawinski +/* xscreensaver, Copyright (c) 2012-2019 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 @@ -62,6 +62,13 @@ textclient_mobile_date_string (void) NSString *_result; } +- (void)dealloc +{ + [_url release]; + [_result release]; + [super dealloc]; +} + + (TextLoader *) sharedLoader { static TextLoader *singleton = nil; diff --git a/OSX/xscreensaver.xcodeproj/project.pbxproj b/OSX/xscreensaver.xcodeproj/project.pbxproj index adb9fd1d..8179ca2c 100644 --- a/OSX/xscreensaver.xcodeproj/project.pbxproj +++ b/OSX/xscreensaver.xcodeproj/project.pbxproj @@ -212,6 +212,7 @@ AFEE106B1D13424C00AAC8F7 /* PBXTargetDependency */, AF4FF4D70D52CD0D00666F98 /* PBXTargetDependency */, AF777A4109B660B500EA3033 /* PBXTargetDependency */, + AFF449FE22754B5600DB8EDB /* PBXTargetDependency */, AF3938381D0FBF5300205406 /* PBXTargetDependency */, AF777A3F09B660B500EA3033 /* PBXTargetDependency */, AFEC23EB1CB6ED0800DE138F /* PBXTargetDependency */, @@ -239,6 +240,7 @@ AF777A1D09B660B300EA3033 /* PBXTargetDependency */, AF777A1B09B660B300EA3033 /* PBXTargetDependency */, AF777A1909B660B300EA3033 /* PBXTargetDependency */, + AF6C6D91226AE6780065A748 /* PBXTargetDependency */, AF62D6392180087500C57C42 /* PBXTargetDependency */, AF1B0FC51D7AB5740011DBE4 /* PBXTargetDependency */, AF4F10F0143450C300E34F3F /* PBXTargetDependency */, @@ -1310,6 +1312,7 @@ AF21078D1FD23D5000B61EA9 /* esper.c in Sources */ = {isa = PBXBuildFile; fileRef = AF21078B1FD23D5000B61EA9 /* esper.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AF2107901FD23FEC00B61EA9 /* OCRAStd.otf in Resources */ = {isa = PBXBuildFile; fileRef = AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */; }; AF241F83107C38DF00046A84 /* dropshadow.c in Sources */ = {isa = PBXBuildFile; fileRef = AF241F81107C38DF00046A84 /* dropshadow.c */; }; + AF2C2A8A22754C31002112B9 /* deepstars.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF449F722754B2300DB8EDB /* deepstars.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AF2C31E615C0F7FE007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; }; AF2C31EA15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; }; AF2C31EB15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; }; @@ -2002,6 +2005,20 @@ AF68A49C19196E3E00D41CD1 /* delaunay.c in Sources */ = {isa = PBXBuildFile; fileRef = AF68A49619196E3E00D41CD1 /* delaunay.c */; }; AF69640B0E4FE3470085DBCE /* teapot.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC211930E4E30C800D87B6E /* teapot.c */; }; AF6C07C121D6ECCE00083862 /* Sparkle.framework in Resources */ = {isa = PBXBuildFile; fileRef = AF1ADA171850180E00932759 /* Sparkle.framework */; }; + AF6C6D7B226AE4FC0065A748 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; + AF6C6D7D226AE4FC0065A748 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; }; + AF6C6D7E226AE4FC0065A748 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; }; + AF6C6D7F226AE4FC0065A748 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; }; + AF6C6D80226AE4FC0065A748 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + AF6C6D81226AE4FC0065A748 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; }; + AF6C6D82226AE4FC0065A748 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; }; + AF6C6D83226AE4FC0065A748 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; }; + AF6C6D8C226AE6130065A748 /* gravitywell.c in Sources */ = {isa = PBXBuildFile; fileRef = AF6C6D8B226AE6120065A748 /* gravitywell.c */; }; + AF6C6D8E226AE6370065A748 /* gravitywell.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF6C6D8D226AE6370065A748 /* gravitywell.xml */; }; + AF6C6D8F226AE6370065A748 /* gravitywell.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF6C6D8D226AE6370065A748 /* gravitywell.xml */; }; + AF6C6D92226AE6CE0065A748 /* gravitywell.c in Sources */ = {isa = PBXBuildFile; fileRef = AF6C6D8B226AE6120065A748 /* gravitywell.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; + AF70D21522A59A080004BAAD /* gallant12x22.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AF70D21422A59A080004BAAD /* gallant12x22.ttf */; }; + AF70D21622A5A0840004BAAD /* gallant12x22.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AF70D21422A59A080004BAAD /* gallant12x22.ttf */; }; AF73FF211A08AB9400E485E9 /* iSaverRunner57t.png in Resources */ = {isa = PBXBuildFile; fileRef = AF73FF201A08AB9400E485E9 /* iSaverRunner57t.png */; }; AF73FF291A09877F00E485E9 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; AF73FF2B1A09877F00E485E9 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; }; @@ -3480,6 +3497,17 @@ AFF3C9FF17CCAD9A0028F240 /* geodesic.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFF3C9FD17CCAD9A0028F240 /* geodesic.xml */; }; AFF3CA0317CCAEB70028F240 /* geodesic.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF3CA0217CCAEB70028F240 /* geodesic.c */; }; AFF3CA0417CCAEB70028F240 /* geodesic.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF3CA0217CCAEB70028F240 /* geodesic.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; + AFF449E72275494400DB8EDB /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; + AFF449E92275494400DB8EDB /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; }; + AFF449EA2275494400DB8EDB /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; }; + AFF449EB2275494400DB8EDB /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; }; + AFF449EC2275494400DB8EDB /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + AFF449ED2275494400DB8EDB /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; }; + AFF449EE2275494400DB8EDB /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; }; + AFF449EF2275494400DB8EDB /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; }; + AFF449F822754B2300DB8EDB /* deepstars.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF449F722754B2300DB8EDB /* deepstars.c */; }; + AFF44A0022754BB600DB8EDB /* deepstars.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFF449FF22754BB500DB8EDB /* deepstars.xml */; }; + AFF44A0122754BB600DB8EDB /* deepstars.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFF449FF22754BB500DB8EDB /* deepstars.xml */; }; AFF4633C0C4403E400EE6509 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; AFF4634A0C44044F00EE6509 /* cwaves.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF463490C44044E00EE6509 /* cwaves.c */; }; AFF4634C0C44046500EE6509 /* cwaves.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFF4634B0C44046500EE6509 /* cwaves.xml */; }; @@ -4804,6 +4832,20 @@ remoteGlobalIDString = AF68A47E19196CF800D41CD1; remoteInfo = Tessellimage; }; + AF6C6D76226AE4FC0065A748 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF4808C0098C3B6C00FB32B8; + remoteInfo = jwxyz; + }; + AF6C6D90226AE6780065A748 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF6C6D74226AE4FC0065A748; + remoteInfo = GravityWell; + }; AF714E4E105613410046AB1D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; @@ -7457,6 +7499,20 @@ remoteGlobalIDString = AFF3C9E817CCAC440028F240; remoteInfo = Geodesic; }; + AFF449E22275494400DB8EDB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF4808C0098C3B6C00FB32B8; + remoteInfo = jwxyz; + }; + AFF449FD22754B5600DB8EDB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AFF449E02275494400DB8EDB; + remoteInfo = DeepStars; + }; AFF463380C4403E400EE6509 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; @@ -7538,7 +7594,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 089C165DFE840E0CC02AAC07 /* InfoPlist.strings */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = InfoPlist.strings; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* xscreensaver_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xscreensaver_Prefix.pch; sourceTree = ""; }; @@ -7857,6 +7912,10 @@ AF68A49419196E3E00D41CD1 /* tessellimage.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = tessellimage.xml; sourceTree = ""; }; AF68A49519196E3E00D41CD1 /* tessellimage.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tessellimage.c; path = hacks/tessellimage.c; sourceTree = ""; }; AF68A49619196E3E00D41CD1 /* delaunay.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = delaunay.c; path = hacks/delaunay.c; sourceTree = ""; }; + AF6C6D89226AE4FC0065A748 /* GravityWell.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GravityWell.saver; sourceTree = BUILT_PRODUCTS_DIR; }; + AF6C6D8B226AE6120065A748 /* gravitywell.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = gravitywell.c; path = hacks/glx/gravitywell.c; sourceTree = ""; }; + AF6C6D8D226AE6370065A748 /* gravitywell.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = gravitywell.xml; sourceTree = ""; }; + AF70D21422A59A080004BAAD /* gallant12x22.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = gallant12x22.ttf; sourceTree = ""; }; AF73FF201A08AB9400E485E9 /* iSaverRunner57t.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iSaverRunner57t.png; sourceTree = ""; }; AF73FF361A09877F00E485E9 /* BinaryRing.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BinaryRing.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AF73FF381A09889700E485E9 /* binaryring.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = binaryring.c; path = hacks/binaryring.c; sourceTree = ""; }; @@ -7961,7 +8020,6 @@ AF97707D0989D2F6001F8B92 /* Attraction.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Attraction.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AF9771D70989DC4A001F8B92 /* SaverTester.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SaverTester.app; sourceTree = BUILT_PRODUCTS_DIR; }; AF9771D90989DC4A001F8B92 /* SaverRunner.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = SaverRunner.plist; sourceTree = ""; }; - AF9772E20989DFC6001F8B92 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/SaverRunner.nib; sourceTree = ""; }; AF998EEE0A083DB30051049D /* TopBlock.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TopBlock.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AF998EF80A083E750051049D /* topblock.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = topblock.c; path = hacks/glx/topblock.c; sourceTree = ""; }; AF998EFA0A083E8C0051049D /* topblock.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = topblock.xml; sourceTree = ""; }; @@ -8567,6 +8625,9 @@ AFF3C9FB17CCAC440028F240 /* Geodesic.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Geodesic.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AFF3C9FD17CCAD9A0028F240 /* geodesic.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = geodesic.xml; sourceTree = ""; }; AFF3CA0217CCAEB70028F240 /* geodesic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = geodesic.c; path = hacks/glx/geodesic.c; sourceTree = ""; }; + AFF449F52275494400DB8EDB /* DeepStars.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DeepStars.saver; sourceTree = BUILT_PRODUCTS_DIR; }; + AFF449F722754B2300DB8EDB /* deepstars.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = deepstars.c; path = hacks/glx/deepstars.c; sourceTree = ""; }; + AFF449FF22754BB500DB8EDB /* deepstars.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = deepstars.xml; sourceTree = ""; }; AFF463470C4403E400EE6509 /* CWaves.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CWaves.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AFF463490C44044E00EE6509 /* cwaves.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = cwaves.c; path = hacks/cwaves.c; sourceTree = ""; }; AFF4634B0C44046500EE6509 /* cwaves.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = cwaves.xml; sourceTree = ""; }; @@ -8576,6 +8637,8 @@ AFFAB32919158CE40020F021 /* ProjectivePlane.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ProjectivePlane.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AFFAB32C19158E2A0020F021 /* projectiveplane.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = projectiveplane.xml; sourceTree = ""; }; AFFAB33119158EA80020F021 /* projectiveplane.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = projectiveplane.c; path = hacks/glx/projectiveplane.c; sourceTree = ""; }; + AFFAE611226CF93F00EA842B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + AFFAE612226CF93F00EA842B /* en */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = en; path = en.lproj/SaverRunner.nib; sourceTree = ""; }; 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 = ""; }; @@ -9903,6 +9966,20 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF6C6D7C226AE4FC0065A748 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AF6C6D7D226AE4FC0065A748 /* libjwxyz.a in Frameworks */, + AF6C6D7E226AE4FC0065A748 /* ScreenSaver.framework in Frameworks */, + AF6C6D7F226AE4FC0065A748 /* QuartzCore.framework in Frameworks */, + AF6C6D80226AE4FC0065A748 /* Cocoa.framework in Frameworks */, + AF6C6D81226AE4FC0065A748 /* Carbon.framework in Frameworks */, + AF6C6D82226AE4FC0065A748 /* OpenGL.framework in Frameworks */, + AF6C6D83226AE4FC0065A748 /* libz.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF73FF2A1A09877F00E485E9 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -12218,6 +12295,20 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AFF449E82275494400DB8EDB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AFF449E92275494400DB8EDB /* libjwxyz.a in Frameworks */, + AFF449EA2275494400DB8EDB /* ScreenSaver.framework in Frameworks */, + AFF449EB2275494400DB8EDB /* QuartzCore.framework in Frameworks */, + AFF449EC2275494400DB8EDB /* Cocoa.framework in Frameworks */, + AFF449ED2275494400DB8EDB /* Carbon.framework in Frameworks */, + AFF449EE2275494400DB8EDB /* OpenGL.framework in Frameworks */, + AFF449EF2275494400DB8EDB /* libz.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AFF4633E0C4403E400EE6509 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -12578,6 +12669,8 @@ AFD77E7020C23F8600A3638D /* FilmLeader.saver */, AF5ECEC02116B1A400069433 /* VFeedback.saver */, AF62D62D2180070600C57C42 /* Handsy.saver */, + AF6C6D89226AE4FC0065A748 /* GravityWell.saver */, + AFF449F52275494400DB8EDB /* DeepStars.saver */, ); name = Products; path = ..; @@ -12620,6 +12713,7 @@ AFEC68381BD6CDF9004C1B64 /* YearlReg.ttf */, AFC43E731C68364B00C89999 /* PxPlus_IBM_VGA8.ttf */, AF939AD42038C0040032DD23 /* luximr.ttf */, + AF70D21422A59A080004BAAD /* gallant12x22.ttf */, AF142BAC1EE75DBF0005C0A8 /* settings.png */, 557BF07A1EE90C8B00846DCE /* settings@2x.png */, 557BF07B1EE90C8B00846DCE /* settings@3x.png */, @@ -12913,6 +13007,7 @@ AFEE10641D1341E300AAC8F7 /* cubetwist.c */, AF4FF4D00D52CC8400666F98 /* cubicgrid.c */, AF480DD1098F4F6200FB32B8 /* dangerball.c */, + AFF449F722754B2300DB8EDB /* deepstars.c */, AF3938311D0FBEC800205406 /* discoball.c */, AF77787609B653DC00EA3033 /* dnalogo.c */, AF0839AA09930C4900277BE9 /* dolphin.c */, @@ -12960,6 +13055,7 @@ AF7777E709B64CF700EA3033 /* glslideshow.c */, AFA55C8C099349EE00F3E977 /* glsnake.c */, AFD56E080996A07A00BA26F7 /* gltext.c */, + AF6C6D8B226AE6120065A748 /* gravitywell.c */, AF62D62F2180082100C57C42 /* handsy_model.c */, AF62D6302180082100C57C42 /* handsy.c */, AF1B0FBE1D7AB5210011DBE4 /* hexstrut.c */, @@ -13135,6 +13231,7 @@ AFC258920988A468000655EE /* dangerball.xml */, AFC258930988A468000655EE /* decayscreen.xml */, AFC258940988A468000655EE /* deco.xml */, + AFF449FF22754BB500DB8EDB /* deepstars.xml */, AFC258950988A468000655EE /* deluxe.xml */, AFC258960988A468000655EE /* demon.xml */, AF3938321D0FBEC800205406 /* discoball.xml */, @@ -13187,6 +13284,7 @@ AFC258BD0988A468000655EE /* gltext.xml */, AFC258BF0988A468000655EE /* goop.xml */, AFC258C00988A468000655EE /* grav.xml */, + AF6C6D8D226AE6370065A748 /* gravitywell.xml */, AFC258C10988A468000655EE /* greynetic.xml */, AFC258C20988A468000655EE /* halftone.xml */, AFC258C30988A468000655EE /* halo.xml */, @@ -15396,6 +15494,26 @@ productReference = AF68A49219196CF800D41CD1 /* Tessellimage.saver */; productType = "com.apple.product-type.bundle"; }; + AF6C6D74226AE4FC0065A748 /* GravityWell */ = { + isa = PBXNativeTarget; + buildConfigurationList = AF6C6D86226AE4FC0065A748 /* Build configuration list for PBXNativeTarget "GravityWell" */; + buildPhases = ( + AF6C6D77226AE4FC0065A748 /* Resources */, + AF6C6D79226AE4FC0065A748 /* Sources */, + AF6C6D7C226AE4FC0065A748 /* Frameworks */, + AF6C6D84226AE4FC0065A748 /* Rez */, + AF6C6D85226AE4FC0065A748 /* Run Update Info Plist */, + ); + buildRules = ( + ); + dependencies = ( + AF6C6D75226AE4FC0065A748 /* PBXTargetDependency */, + ); + name = GravityWell; + productName = DangerBall; + productReference = AF6C6D89226AE4FC0065A748 /* GravityWell.saver */; + productType = "com.apple.product-type.bundle"; + }; AF73FF221A09877F00E485E9 /* BinaryRing */ = { isa = PBXNativeTarget; buildConfigurationList = AF73FF331A09877F00E485E9 /* Build configuration list for PBXNativeTarget "BinaryRing" */; @@ -18718,6 +18836,26 @@ productReference = AFF3C9FB17CCAC440028F240 /* Geodesic.saver */; productType = "com.apple.product-type.bundle"; }; + AFF449E02275494400DB8EDB /* DeepStars */ = { + isa = PBXNativeTarget; + buildConfigurationList = AFF449F22275494400DB8EDB /* Build configuration list for PBXNativeTarget "DeepStars" */; + buildPhases = ( + AFF449E32275494400DB8EDB /* Resources */, + AFF449E52275494400DB8EDB /* Sources */, + AFF449E82275494400DB8EDB /* Frameworks */, + AFF449F02275494400DB8EDB /* Rez */, + AFF449F12275494400DB8EDB /* Run Update Info Plist */, + ); + buildRules = ( + ); + dependencies = ( + AFF449E12275494400DB8EDB /* PBXTargetDependency */, + ); + name = DeepStars; + productName = DangerBall; + productReference = AFF449F52275494400DB8EDB /* DeepStars.saver */; + productType = "com.apple.product-type.bundle"; + }; AFF463360C4403E400EE6509 /* CWaves */ = { isa = PBXNativeTarget; buildConfigurationList = AFF463440C4403E400EE6509 /* Build configuration list for PBXNativeTarget "CWaves" */; @@ -18804,7 +18942,7 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1010; + LastUpgradeCheck = 1020; TargetAttributes = { AF08398F09930B6B00277BE9 = { DevelopmentTeam = 4627ATJELP; @@ -19106,6 +19244,9 @@ AF68A47E19196CF800D41CD1 = { DevelopmentTeam = 4627ATJELP; }; + AF6C6D74226AE4FC0065A748 = { + DevelopmentTeam = 4627ATJELP; + }; AF73FF221A09877F00E485E9 = { DevelopmentTeam = 4627ATJELP; }; @@ -19618,6 +19759,9 @@ AFF3C9E817CCAC440028F240 = { DevelopmentTeam = 4627ATJELP; }; + AFF449E02275494400DB8EDB = { + DevelopmentTeam = 4627ATJELP; + }; AFF463360C4403E400EE6509 = { DevelopmentTeam = 4627ATJELP; }; @@ -19634,15 +19778,14 @@ }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "xscreensaver" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 1; knownRegions = ( - English, - Japanese, - French, - German, en, Base, + ja, + fr, + de, ); mainGroup = 29B97314FDCFA39411CA2CEA /* xscreensaver */; projectDirPath = ""; @@ -19805,6 +19948,7 @@ AFEE104D1D13406000AAC8F7 /* CubeTwist */, AF4FF4BA0D52CBDE00666F98 /* CubicGrid */, AF4810EB09909FBA00FB32B8 /* DangerBall */, + AFF449E02275494400DB8EDB /* DeepStars */, AF39381A1D0FBD6A00205406 /* Discoball */, AF77786109B6536000EA3033 /* DNAlogo */, AFEC23CD1CB6EAE100DE138F /* DymaxionMap */, @@ -19832,6 +19976,7 @@ AF7777D009B64C6B00EA3033 /* GLSlideshow */, AFA55C77099349A600F3E977 /* GLSnake */, AFD56DF10996A03800BA26F7 /* GLText */, + AF6C6D74226AE4FC0065A748 /* GravityWell */, AF62D6182180070600C57C42 /* Handsy */, AF1B0FA71D7AB4740011DBE4 /* Hexstrut */, AF78D175142DD8F3002AAF77 /* Hilbert */, @@ -20696,6 +20841,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF6C6D77226AE4FC0065A748 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AF6C6D8E226AE6370065A748 /* gravitywell.xml in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF73FF251A09877F00E485E9 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -20881,6 +21034,7 @@ AFC43E741C68364B00C89999 /* PxPlus_IBM_VGA8.ttf in Resources */, AFEC68391BD6CDF9004C1B64 /* YearlReg.ttf in Resources */, AF939AD72038C5F00032DD23 /* luximr.ttf in Resources */, + AF70D21522A59A080004BAAD /* gallant12x22.ttf in Resources */, AF142BAE1EE75DBF0005C0A8 /* settings.png in Resources */, 557BF07E1EE90D3B00846DCE /* settings@2x.png in Resources */, 557BF07F1EE90D3B00846DCE /* settings@3x.png in Resources */, @@ -20937,6 +21091,7 @@ AF918AE1158FC53D002B5D1E /* dangerball.xml in Resources */, AF918AE2158FC53D002B5D1E /* decayscreen.xml in Resources */, AF918AE3158FC53D002B5D1E /* deco.xml in Resources */, + AFF44A0122754BB600DB8EDB /* deepstars.xml in Resources */, AF918AE4158FC53D002B5D1E /* deluxe.xml in Resources */, AF918AE5158FC53D002B5D1E /* demon.xml in Resources */, AF918AE6158FC53D002B5D1E /* discrete.xml in Resources */, @@ -20984,6 +21139,7 @@ AF918B0D158FC53D002B5D1E /* gltext.xml in Resources */, AF918B0E158FC53D002B5D1E /* goop.xml in Resources */, AF918B0F158FC53D002B5D1E /* grav.xml in Resources */, + AF6C6D8F226AE6370065A748 /* gravitywell.xml in Resources */, AF918B11158FC53D002B5D1E /* halftone.xml in Resources */, AF918B12158FC53D002B5D1E /* halo.xml in Resources */, AF62D6372180083E00C57C42 /* handsy.xml in Resources */, @@ -21385,6 +21541,7 @@ AF0FAF1709CA712600EE1051 /* xscreensaver-getimage-file in Resources */, AFC43E771C684BE400C89999 /* PxPlus_IBM_VGA8.ttf in Resources */, AF939AD52038C0050032DD23 /* luximr.ttf in Resources */, + AF70D21622A5A0840004BAAD /* gallant12x22.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -22291,6 +22448,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AFF449E32275494400DB8EDB /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AFF44A0022754BB600DB8EDB /* deepstars.xml in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AFF463390C4403E400EE6509 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -22949,6 +23114,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF6C6D84226AE4FC0065A748 /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF73FF311A09877F00E485E9 /* Rez */ = { isa = PBXRezBuildPhase; buildActionMask = 2147483647; @@ -24069,6 +24241,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AFF449F02275494400DB8EDB /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; AFF463420C4403E400EE6509 /* Rez */ = { isa = PBXRezBuildPhase; buildActionMask = 2147483647; @@ -24626,6 +24805,21 @@ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; showEnvVarsInLog = 0; }; + AF6C6D85226AE4FC0065A748 /* 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; + }; AF73FF321A09877F00E485E9 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -24726,7 +24920,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; + shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX\n"; showEnvVarsInLog = 0; }; AF94E7421A16F66900289B93 /* Update Function Table */ = { @@ -24741,7 +24935,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "$SOURCE_ROOT/build-fntable.pl $SOURCE_ROOT/ios-function-table.m"; + shellScript = "$SOURCE_ROOT/build-fntable.pl $SOURCE_ROOT/ios-function-table.m\n"; }; AF998EEA0A083DB30051049D /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; @@ -28101,6 +28295,21 @@ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; showEnvVarsInLog = 0; }; + AFF449F12275494400DB8EDB /* 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; + }; AFF463430C4403E400EE6509 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -29112,6 +29321,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF6C6D79226AE4FC0065A748 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AF6C6D8C226AE6130065A748 /* gravitywell.c in Sources */, + AF6C6D7B226AE4FC0065A748 /* XScreenSaverSubclass.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF73FF271A09877F00E485E9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -29473,6 +29691,7 @@ AFEE10671D1341FA00AAC8F7 /* cubetwist.c in Sources */, AF918A45158FC3BB002B5D1E /* cubicgrid.c in Sources */, AF918A46158FC3BB002B5D1E /* dangerball.c in Sources */, + AF2C2A8A22754C31002112B9 /* deepstars.c in Sources */, AFCF453715986A2100E6E8CC /* dnalogo.c in Sources */, AF918A48158FC3BB002B5D1E /* dolphin.c in Sources */, AFEC23E91CB6EC7F00DE138F /* dymaxionmap.c in Sources */, @@ -29502,6 +29721,7 @@ AF918A67158FC3E5002B5D1E /* glslideshow.c in Sources */, AF918A68158FC3E5002B5D1E /* glsnake.c in Sources */, AF918A69158FC3E5002B5D1E /* gltext.c in Sources */, + AF6C6D92226AE6CE0065A748 /* gravitywell.c in Sources */, AF62D6322180082100C57C42 /* handsy_model.c in Sources */, AF62D6342180082100C57C42 /* handsy.c in Sources */, AF1B0FC31D7AB5500011DBE4 /* hexstrut.c in Sources */, @@ -30964,6 +31184,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AFF449E52275494400DB8EDB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AFF449E72275494400DB8EDB /* XScreenSaverSubclass.m in Sources */, + AFF449F822754B2300DB8EDB /* deepstars.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AFF4633B0C4403E400EE6509 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -31758,6 +31987,16 @@ target = AF68A47E19196CF800D41CD1 /* Tessellimage */; targetProxy = AF68A49D19196EA000D41CD1 /* PBXContainerItemProxy */; }; + AF6C6D75226AE4FC0065A748 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; + targetProxy = AF6C6D76226AE4FC0065A748 /* PBXContainerItemProxy */; + }; + AF6C6D91226AE6780065A748 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AF6C6D74226AE4FC0065A748 /* GravityWell */; + targetProxy = AF6C6D90226AE6780065A748 /* PBXContainerItemProxy */; + }; AF714E4F105613410046AB1D /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = AF4774B4099D8B5F001F091E /* LMorph */; @@ -33653,6 +33892,16 @@ target = AFF3C9E817CCAC440028F240 /* Geodesic */; targetProxy = AFF3CA0017CCAE210028F240 /* PBXContainerItemProxy */; }; + AFF449E12275494400DB8EDB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; + targetProxy = AFF449E22275494400DB8EDB /* PBXContainerItemProxy */; + }; + AFF449FE22754B5600DB8EDB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AFF449E02275494400DB8EDB /* DeepStars */; + targetProxy = AFF449FD22754B5600DB8EDB /* PBXContainerItemProxy */; + }; AFF463370C4403E400EE6509 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; @@ -33699,7 +33948,7 @@ 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( - 089C165DFE840E0CC02AAC07 /* InfoPlist.strings */, + AFFAE611226CF93F00EA842B /* en */, ); name = InfoPlist.strings; sourceTree = ""; @@ -33707,7 +33956,7 @@ AF9772E10989DFC6001F8B92 /* SaverRunner.nib */ = { isa = PBXVariantGroup; children = ( - AF9772E20989DFC6001F8B92 /* English */, + AFFAE612226CF93F00EA842B /* en */, ); name = SaverRunner.nib; sourceTree = ""; @@ -34684,7 +34933,6 @@ PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}"; SKIP_INSTALL = YES; SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos"; - VALID_ARCHS = "i386 x86_64 armv6 armv7 armv7s arm64"; }; name = Debug; }; @@ -34695,7 +34943,6 @@ PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}"; SKIP_INSTALL = YES; SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos"; - VALID_ARCHS = "i386 x86_64 armv6 armv7 armv7s arm64"; }; name = Release; }; @@ -35313,6 +35560,28 @@ }; name = Release; }; + AF6C6D87226AE4FC0065A748 /* 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; + }; + AF6C6D88226AE4FC0065A748 /* 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; + }; AF73FF341A09877F00E485E9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -35668,6 +35937,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COMBINE_HIDPI_IMAGES = NO; + ENABLE_HARDENED_RUNTIME = NO; GCC_PREPROCESSOR_DEFINITIONS = ( "USE_IPHONE=1", "$(inherited)", @@ -38153,6 +38423,28 @@ }; name = Release; }; + AFF449F32275494400DB8EDB /* 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; + }; + AFF449F42275494400DB8EDB /* 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; + }; AFF463450C4403E400EE6509 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -38213,10 +38505,12 @@ ARCHS = "$(ARCHS_STANDARD)"; BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.${PRODUCT_NAME:rfc1034identifier}"; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = NO; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; @@ -38319,10 +38613,12 @@ ARCHS = "$(ARCHS_STANDARD)"; BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.${PRODUCT_NAME:rfc1034identifier}"; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = NO; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; @@ -39332,6 +39628,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + AF6C6D86226AE4FC0065A748 /* Build configuration list for PBXNativeTarget "GravityWell" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AF6C6D87226AE4FC0065A748 /* Debug */, + AF6C6D88226AE4FC0065A748 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; AF73FF331A09877F00E485E9 /* Build configuration list for PBXNativeTarget "BinaryRing" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -40853,6 +41158,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + AFF449F22275494400DB8EDB /* Build configuration list for PBXNativeTarget "DeepStars" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AFF449F32275494400DB8EDB /* Debug */, + AFF449F42275494400DB8EDB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; AFF463440C4403E400EE6509 /* Build configuration list for PBXNativeTarget "CWaves" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/README b/README index 9a2a3848..118a0615 100644 --- a/README +++ b/README @@ -46,6 +46,18 @@ XScreenSaver has an extensive manual -- please read it! =============================================================================== +5.43 * New hacks, `GravityWell', `DeepStars'. + * GLPlanet now supports the Mercator projection. + * Bouncing Cow has mathematically ideal cows (spherical, frictionless). + * Foggy toasters. + * Unknown Pleasures can now use an image file as a clip mask. + * Updated `webcollage' for recent changes. + * macOS: Fixed BSOD fonts on UWQHD+ displays. + * X11: Added some sample unlock dialog color schemes to the .ad file. + * X11: On systemd systems, closing your laptop lid might actually lock + your screen now, maybe. + * X11: 'sonar' can ping without being setuid by using setcap. + 5.42 * macOS: Fixed Sparkle auto-updater. 5.41 * X11: Those new font-loading fallback heuristics work again. Oops. diff --git a/android/Makefile b/android/Makefile index ed65edf6..868d7f12 100644 --- a/android/Makefile +++ b/android/Makefile @@ -82,6 +82,7 @@ export ANDROID_HACKS= \ dangerball \ decayscreen \ deco \ + deepstars \ deluxe \ demon \ discoball \ @@ -126,6 +127,7 @@ export ANDROID_HACKS= \ gltext \ goop \ grav \ + gravitywell \ greynetic \ halo \ handsy \ diff --git a/android/xscreensaver/assets/fonts/gallant12x22.ttf b/android/xscreensaver/assets/fonts/gallant12x22.ttf new file mode 120000 index 00000000..55e9e77d --- /dev/null +++ b/android/xscreensaver/assets/fonts/gallant12x22.ttf @@ -0,0 +1 @@ +../../../../OSX/gallant12x22.ttf \ No newline at end of file diff --git a/android/xscreensaver/assets/fonts/luximr.ttf b/android/xscreensaver/assets/fonts/luximr.ttf new file mode 120000 index 00000000..41f9ebeb --- /dev/null +++ b/android/xscreensaver/assets/fonts/luximr.ttf @@ -0,0 +1 @@ +../../../../OSX/luximr.ttf \ No newline at end of file diff --git a/android/xscreensaver/src/org/jwz/xscreensaver/jwxyz.java b/android/xscreensaver/src/org/jwz/xscreensaver/jwxyz.java index a22a26d4..d70dfc33 100644 --- a/android/xscreensaver/src/org/jwz/xscreensaver/jwxyz.java +++ b/android/xscreensaver/src/org/jwz/xscreensaver/jwxyz.java @@ -1,5 +1,5 @@ /* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * xscreensaver, Copyright (c) 2016-2018 Jamie Zawinski + * xscreensaver, Copyright (c) 2016-2019 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 @@ -260,9 +260,9 @@ public class jwxyz // LOG ("unparsable system font: %s", file); } else { name = mungeFontName (name); - if (! all_fonts.contains (name)) { + if (! all_fonts.contains (name.toLowerCase())) { // LOG ("system font \"%s\" %s", name, file); - all_fonts.put (name, name); + all_fonts.put (name.toLowerCase(), name); } } } @@ -301,7 +301,7 @@ public class jwxyz tmpfile.delete(); name = mungeFontName (name); - all_fonts.put (name, t); + all_fonts.put (name.toLowerCase(), t); // LOG ("asset font \"%s\" %s", name, fn); } catch (Exception e) { if (tmpfile != null) tmpfile.delete(); @@ -360,7 +360,7 @@ public class jwxyz // Parses "Native Font Name One 12, Native Font Name Two 14". // Returns [ String name, Typeface ] private Object[] parseNativeFont (String name) { - Object font2 = all_fonts.get (name); + Object font2 = all_fonts.get (name.toLowerCase()); if (font2 instanceof String) font2 = Typeface.create (name, Typeface.NORMAL); return new Object[] { name, (Typeface)font2 }; @@ -383,6 +383,8 @@ public class jwxyz String name2 = (String) pair[0]; Typeface font = (Typeface) pair[1]; + if (font == null) return null; + size *= 2; String suffix = (font.isBold() && font.isItalic() ? " bold italic" : diff --git a/config.h.in b/config.h.in index 8c031ecf..9f66b484 100644 --- a/config.h.in +++ b/config.h.in @@ -171,11 +171,17 @@ /* Define if your file defines LC_MESSAGES. */ #undef HAVE_LC_MESSAGES +/* Define this if your system has libcap. */ +#undef HAVE_LIBCAP + /* Define this if the Portable Network Graphics library is installed. It is basically required, but many things will more-or-less limp along without it. */ #undef HAVE_LIBPNG +/* Define this if you have libsystemd. */ +#undef HAVE_LIBSYSTEMD + /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H diff --git a/configure b/configure index f61dfbeb..e5667963 100755 --- a/configure +++ b/configure @@ -661,6 +661,7 @@ PASSWD_OBJS PASSWD_SRCS MEN_OSX SCRIPTS_OSX +EXES_SYSTEMD EXES_OSX OBJCC COMMENT_DEMO_GLADE2_GTK_2_22_TAIL @@ -676,8 +677,12 @@ HAVE_PAM_FAIL_DELAY INSTALL_PAM NEED_SETUID INSTALL_DIRS +SETCAP_HACKS SETUID_HACKS INSTALL_SETUID +PROG_SETCAP +LIBCAP_LIBS +LIBCAP_CFLAGS PASSWD_LIBS XINERAMA_LIBS XDPMS_LIBS @@ -694,6 +699,7 @@ SAVER_LIBS ALL_DEMO_PROGRAMS PREFERRED_DEMO_PROGRAM INCLUDES +setcap_program gnome_url_show_program gnome_open_program pkg_config @@ -854,6 +860,7 @@ with_png with_pixbuf with_jpeg with_xft +with_systemd with_xshm_ext with_xdbe_ext with_readdisplay @@ -861,6 +868,7 @@ with_image_directory with_text_file with_browser with_setuid_hacks +with_setcap_hacks with_record_animation ' ac_precious_vars='build_alias @@ -1552,6 +1560,7 @@ Graphics options: GIF, JPEG, and PNG files as well. --with-jpeg Include support for the JPEG library. --with-xft Include support for the X Freetype library. + --with-systemd Build xscreensaver-systemd to lock on suspend. --with-xshm-ext Include support for the Shared Memory extension. --with-xdbe-ext Include support for the DOUBLE-BUFFER extension. --with-readdisplay Include support for the XReadDisplay extension. @@ -1561,10 +1570,10 @@ Graphics options: --with-browser=BROWSER Specify the web browser used to show the help URL. --with-setuid-hacks Allow some demos to be installed `setuid root' (which is needed in order to ping other hosts.) - + --with-setcap-hacks Allow some demos to be installed with setcap + (which is needed in order to ping other hosts.) --with-record-animation Include code for generating MP4 videos. - Some influential environment variables: CC C compiler command CFLAGS C compiler flags @@ -1740,6 +1749,43 @@ fi } # ac_fn_c_try_link +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes @@ -1782,43 +1828,6 @@ fi } # ac_fn_c_try_run -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using @@ -2625,6 +2634,10 @@ echo "command line was: $0 $@" + + + + @@ -4376,27 +4389,15 @@ $as_echo "Solaris: adding -D__EXTENSIONS__" >&6; } OBJCC="$CC" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler works on ANSI C" >&5 -$as_echo_n "checking whether the compiler works on ANSI C... " >&6; } - if test "$cross_compiling" = yes; then : - as_fn_error $? "Couldn't build even a trivial ANSI C program: check CC." "$LINENO" 5 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - main(int ac, char **av) { return 0; } -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - as_fn_error $? "Couldn't build even a trivial ANSI C program: check CC." "$LINENO" 5 -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - + # This test makes cross-compiling fail, so let's just assume that nobody + # is using a K&R compiler any more... + # +# AC_MSG_CHECKING([whether the compiler works on ANSI C]) +# AC_TRY_RUN([ main(int ac, char **av) { return 0; } ], +# AC_MSG_RESULT(yes), +# AC_MSG_RESULT(no) +# AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.), +# AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.)) if test -n "$GCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Turning on gcc compiler warnings." >&5 @@ -13410,7 +13411,7 @@ if ${ac_cv_mesagl_version_string+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext < #ifndef MESA_MAJOR_VERSION @@ -15017,6 +15018,219 @@ else fi +############################################################################### +# +# Check for -lsystemd +# +############################################################################### + +have_systemd=no +with_systemd_req=unspecified +systemd_halfassed=no + +# Check whether --with-systemd was given. +if test "${with_systemd+set}" = set; then : + withval=$with_systemd; with_systemd="$withval"; with_systemd_req="$withval" +else + with_systemd=yes +fi + + + + case "$with_systemd" in + yes) ;; + no) ;; + + /*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for systemd headers" >&5 +$as_echo_n "checking for systemd headers... " >&6; } + d=$with_systemd/include + if test -d $d; then + X_CFLAGS="-I$d $X_CFLAGS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 +$as_echo "$d" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 +$as_echo "not found ($d: no such directory)" >&6; } + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for systemd libs" >&5 +$as_echo_n "checking for systemd libs... " >&6; } + d=$with_systemd/lib + if test -d $d; then + X_LIBS="-L$d $X_LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 +$as_echo "$d" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 +$as_echo "not found ($d: no such directory)" >&6; } + fi + + # replace the directory string with "yes". + with_systemd_req="yes" + with_systemd=$with_systemd_req + ;; + + *) + echo "" + echo "error: argument to --with-systemd must be \"yes\", \"no\", or a directory." + echo " If it is a directory, then \`DIR/include' will be added to" + echo " the -I list, and \`DIR/lib' will be added to the -L list." + exit 1 + ;; + esac + + +if test "$with_systemd" != yes -a "$with_systemd" != no ; then + echo "error: must be yes or no: --with-systemd=$with_systemd" + exit 1 +fi + +if test "$with_systemd" = yes; then + + pkgs='' + ok="yes" + pkg_check_version libsystemd 221 + have_systemd="$ok" + + if test "$have_systemd" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libsystemd includes" >&5 +$as_echo_n "checking for libsystemd includes... " >&6; } +if ${ac_cv_systemd_config_cflags+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_systemd_config_cflags=`$pkg_config --cflags $pkgs` +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_systemd_config_cflags" >&5 +$as_echo "$ac_cv_systemd_config_cflags" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libsystemd libs" >&5 +$as_echo_n "checking for libsystemd libs... " >&6; } +if ${ac_cv_systemd_config_libs+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_systemd_config_libs=`$pkg_config --libs $pkgs` +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_systemd_config_libs" >&5 +$as_echo "$ac_cv_systemd_config_libs" >&6; } + fi + + ac_systemd_config_cflags=$ac_cv_systemd_config_cflags + ac_systemd_config_libs=$ac_cv_systemd_config_libs + + if test "$have_systemd" = yes; then + # + # we appear to have libsystemd; check for headers/libs to be sure. + # + ac_save_systemd_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $ac_systemd_config_cflags" + + have_systemd=no + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + ac_fn_c_check_header_mongrel "$LINENO" "systemd/sd-bus.h" "ac_cv_header_systemd_sd_bus_h" "$ac_includes_default" +if test "x$ac_cv_header_systemd_sd_bus_h" = xyes; then : + have_systemd=yes +fi + + + CPPFLAGS="$ac_save_CPPFLAGS" + + CPPFLAGS="$ac_save_systemd_CPPFLAGS" + fi + + if test "$have_systemd" = yes; then + # we have the headers, now check for the libraries + have_systemd=no + systemd_halfassed=yes + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for libsystemd usability..." >&5 +$as_echo "checking for libsystemd usability..." >&6; } + + ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" +# ac_save_LIBS="$LIBS" + + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + # note: $X_CFLAGS includes $x_includes + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + + if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" + fi + # note: $X_LIBS includes $x_libraries + LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS" + + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sd_bus_open_system in -lc" >&5 +$as_echo_n "checking for sd_bus_open_system in -lc... " >&6; } +if ${ac_cv_lib_c_sd_bus_open_system+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $ac_systemd_config_libs -lX11 -lXext -lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char sd_bus_open_system (); +int +main () +{ +return sd_bus_open_system (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_c_sd_bus_open_system=yes +else + ac_cv_lib_c_sd_bus_open_system=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_sd_bus_open_system" >&5 +$as_echo "$ac_cv_lib_c_sd_bus_open_system" >&6; } +if test "x$ac_cv_lib_c_sd_bus_open_system" = xyes; then : + have_systemd=yes +fi + + CPPFLAGS="$ac_save_CPPFLAGS" + LDFLAGS="$ac_save_LDFLAGS" +# LIBS="$ac_save_LIBS" + + fi + + if test "$have_systemd" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for libsystemd usability... no" >&5 +$as_echo "checking for libsystemd usability... no" >&6; } + fi +fi + +if test "$have_systemd" = yes; then + INCLUDES="$INCLUDES $ac_systemd_config_cflags" + EXES_SYSTEMD='$(EXES_SYSTEMD)' + $as_echo "#define HAVE_LIBSYSTEMD 1" >>confdefs.h + +else + EXES_SYSTEMD='' +fi + + ############################################################################### # # Check for pty support: this allows 'phosphor' and 'apple2' @@ -15835,6 +16049,207 @@ elif test "$setuid_hacks" != no; then fi +############################################################################### +# +# Check for setcap, which is less worrying than setuid. +# +############################################################################### + +have_libcap=no +setcap_hacks_default=yes +setcap_hacks="$setcap_hacks_default" +setcap_hacks_req=unspecified + +# Check whether --with-setcap-hacks was given. +if test "${with_setcap_hacks+set}" = set; then : + withval=$with_setcap_hacks; setcap_hacks="$withval"; setcap_hacks_req="$withval" +else + setcap_hacks=yes +fi + + + + case "$setcap_hacks" in + yes) ;; + no) ;; + + /*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setcap hacks headers" >&5 +$as_echo_n "checking for setcap hacks headers... " >&6; } + d=$setcap_hacks/include + if test -d $d; then + X_CFLAGS="-I$d $X_CFLAGS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 +$as_echo "$d" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 +$as_echo "not found ($d: no such directory)" >&6; } + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setcap hacks libs" >&5 +$as_echo_n "checking for setcap hacks libs... " >&6; } + d=$setcap_hacks/lib + if test -d $d; then + X_LIBS="-L$d $X_LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 +$as_echo "$d" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 +$as_echo "not found ($d: no such directory)" >&6; } + fi + + # replace the directory string with "yes". + setcap_hacks_req="yes" + setcap_hacks=$setcap_hacks_req + ;; + + *) + echo "" + echo "error: argument to --with-setcap-hacks must be \"yes\", \"no\", or a directory." + echo " If it is a directory, then \`DIR/include' will be added to" + echo " the -I list, and \`DIR/lib' will be added to the -L list." + exit 1 + ;; + esac + + +if test "$setcap_hacks" != yes -a "$setcap_hacks" != no ; then + echo "error: must be yes or no: --with-setcap-hacks=$setcap_hacks" + exit 1 +fi + +if test "$setcap_hacks" = yes; then + + for ac_prog in setcap +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_setcap_program+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$setcap_program"; then + ac_cv_prog_setcap_program="$setcap_program" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_setcap_program="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +setcap_program=$ac_cv_prog_setcap_program +if test -n "$setcap_program"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $setcap_program" >&5 +$as_echo "$setcap_program" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$setcap_program" && break +done + + if test "$setcap_program" != ''; then + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + ac_fn_c_check_header_mongrel "$LINENO" "sys/capability.h" "ac_cv_header_sys_capability_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_capability_h" = xyes; then : + have_setcap=yes +fi + + + CPPFLAGS="$ac_save_CPPFLAGS" + fi + if test "$have_setcap" = yes; then + + ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" +# ac_save_LIBS="$LIBS" + + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + # note: $X_CFLAGS includes $x_includes + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + + if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" + fi + # note: $X_LIBS includes $x_libraries + LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS" + + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cap_set_flag in -lcap" >&5 +$as_echo_n "checking for cap_set_flag in -lcap... " >&6; } +if ${ac_cv_lib_cap_cap_set_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcap $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char cap_set_flag (); +int +main () +{ +return cap_set_flag (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_cap_cap_set_flag=yes +else + ac_cv_lib_cap_cap_set_flag=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cap_cap_set_flag" >&5 +$as_echo "$ac_cv_lib_cap_cap_set_flag" >&6; } +if test "x$ac_cv_lib_cap_cap_set_flag" = xyes; then : + have_libcap=yes + PROG_SETCAP="$setcap_program" + LIBCAP_LIBS="-lcap" + $as_echo "#define HAVE_LIBCAP 1" >>confdefs.h + +fi + + CPPFLAGS="$ac_save_CPPFLAGS" + LDFLAGS="$ac_save_LDFLAGS" +# LIBS="$ac_save_LIBS" + + fi +fi + + ############################################################################### # # Check for --with-record-animation @@ -16005,6 +16420,12 @@ else SETUID_HACKS=no fi +if test "$have_libcap" = yes; then + SETCAP_HACKS=yes +else + SETCAP_HACKS=no +fi + tab=' ' if test "$have_gl" = yes; then GL_EXES='$(GL_EXES)' @@ -16159,6 +16580,11 @@ INCLUDES=`echo "$INCLUDES" | sed 's@ -I${prefix}/include@@g;'` + + + + + @@ -17831,6 +18257,37 @@ if test "$have_xft" = no ; then fi +if test "$have_systemd" = no ; then + systemd_warned=no + if test "$with_systemd_req" = yes ; then + warnL "Use of systemd was requested, but it was not found." + systemd_warned=yes + elif test "$with_systemd_req" = no ; then + true + # noteL 'The systemd library is not being used.' + # systemd_warned=yes + else + true + # noteL "The systemd library was not found." + # systemd_warned=yes + fi + + if test "$systemd_halfassed" = yes ; then + echo '' + warn2 'More specifically, we found the headers, but not the' + warn2 'libraries; so either systemd is half-installed on this' + warn2 "system, or something else went wrong. The \`config.log'" + warn2 'file might contain some clues.' + echo '' + systemd_warned=yes + fi + + if test "$systemd_warned" = yes; then + warn2 "This means that xscreensaver-systemd won't be built." + fi +fi + + if test "$have_gl" = yes -a "$ac_have_mesa_gl" = yes ; then preferred_mesagl=3.4 mgv="$ac_mesagl_version_string" @@ -17930,6 +18387,10 @@ if test "$with_shadow_req" = yes -a "$have_shadow" = no ; then warn 'Use of shadow passwords was requested, but they were not found.' fi +if test "$setcap_hacks_req" = yes -a "$have_libcap" = no ; then + warn 'Use of libcap was requested, but it was not found.' +fi + if test "$ac_macosx" = yes ; then if test "$enable_locking" = yes ; then warn "You have specified --enable-locking on MacOS X." diff --git a/configure.in b/configure.in index f8ed25ea..20fb0f7a 100644 --- a/configure.in +++ b/configure.in @@ -181,6 +181,9 @@ AH_TEMPLATE([HAVE_XUTF8DRAWSTRING], AH_TEMPLATE([HAVE_XFT], [Define this if you have libXft2.]) +AH_TEMPLATE([HAVE_LIBSYSTEMD], + [Define this if you have libsystemd.]) + AH_TEMPLATE([HAVE_GL], [Define this if you have OpenGL. Some of the demos require it, so if you don't have it, then those particular demos won't be @@ -329,6 +332,9 @@ AH_TEMPLATE([XPointer], AH_TEMPLATE([HAVE_PTHREAD], [Define this if your system supports POSIX threads.]) +AH_TEMPLATE([HAVE_LIBCAP], + [Define this if your system has libcap.]) + AH_TEMPLATE([HAVE_RECORD_ANIM], [Define this to enable recording of videos.]) @@ -427,12 +433,15 @@ AC_DEFUN([AC_PROG_CC_ANSI], OBJCC="$CC" - AC_MSG_CHECKING([whether the compiler works on ANSI C]) - AC_TRY_RUN([ main(int ac, char **av) { return 0; } ], - AC_MSG_RESULT(yes), - AC_MSG_RESULT(no) - AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.), - AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.)) + # This test makes cross-compiling fail, so let's just assume that nobody + # is using a K&R compiler any more... + # +# AC_MSG_CHECKING([whether the compiler works on ANSI C]) +# AC_TRY_RUN([ main(int ac, char **av) { return 0; } ], +# AC_MSG_RESULT(yes), +# AC_MSG_RESULT(no) +# AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.), +# AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.)) if test -n "$GCC"; then AC_MSG_RESULT(Turning on gcc compiler warnings.) @@ -3561,6 +3570,81 @@ else fi +############################################################################### +# +# Check for -lsystemd +# +############################################################################### + +have_systemd=no +with_systemd_req=unspecified +systemd_halfassed=no +AC_ARG_WITH(systemd, +[ --with-systemd Build xscreensaver-systemd to lock on suspend.], + [with_systemd="$withval"; with_systemd_req="$withval"], + [with_systemd=yes]) + +HANDLE_X_PATH_ARG(with_systemd, --with-systemd, systemd) + +if test "$with_systemd" != yes -a "$with_systemd" != no ; then + echo "error: must be yes or no: --with-systemd=$with_systemd" + exit 1 +fi + +if test "$with_systemd" = yes; then + + pkgs='' + ok="yes" + pkg_check_version libsystemd 221 + have_systemd="$ok" + + if test "$have_systemd" = yes; then + AC_CACHE_CHECK([for libsystemd includes], ac_cv_systemd_config_cflags, + [ac_cv_systemd_config_cflags=`$pkg_config --cflags $pkgs`]) + AC_CACHE_CHECK([for libsystemd libs], ac_cv_systemd_config_libs, + [ac_cv_systemd_config_libs=`$pkg_config --libs $pkgs`]) + fi + + ac_systemd_config_cflags=$ac_cv_systemd_config_cflags + ac_systemd_config_libs=$ac_cv_systemd_config_libs + + if test "$have_systemd" = yes; then + # + # we appear to have libsystemd; check for headers/libs to be sure. + # + ac_save_systemd_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $ac_systemd_config_cflags" + + have_systemd=no + AC_CHECK_X_HEADER(systemd/sd-bus.h, [have_systemd=yes]) + + CPPFLAGS="$ac_save_systemd_CPPFLAGS" + fi + + if test "$have_systemd" = yes; then + # we have the headers, now check for the libraries + have_systemd=no + systemd_halfassed=yes + + AC_MSG_RESULT(checking for libsystemd usability...) + AC_CHECK_X_LIB(c, sd_bus_open_system, [have_systemd=yes],, + $ac_systemd_config_libs -lX11 -lXext -lm) + fi + + if test "$have_systemd" = no; then + AC_MSG_RESULT(checking for libsystemd usability... no) + fi +fi + +if test "$have_systemd" = yes; then + INCLUDES="$INCLUDES $ac_systemd_config_cflags" + EXES_SYSTEMD='$(EXES_SYSTEMD)' + AC_DEFINE(HAVE_LIBSYSTEMD) +else + EXES_SYSTEMD='' +fi + + ############################################################################### # # Check for pty support: this allows 'phosphor' and 'apple2' @@ -3885,8 +3969,7 @@ setuid_hacks_default=no setuid_hacks="$setuid_hacks_default" AC_ARG_WITH(setuid-hacks, [ --with-setuid-hacks Allow some demos to be installed `setuid root' - (which is needed in order to ping other hosts.) -], + (which is needed in order to ping other hosts.)], [setuid_hacks="$withval"], [setuid_hacks="$setuid_hacks_default"]) HANDLE_X_PATH_ARG(setuid_hacks, --with-setuid-hacks, setuid hacks) @@ -3899,6 +3982,45 @@ elif test "$setuid_hacks" != no; then fi +############################################################################### +# +# Check for setcap, which is less worrying than setuid. +# +############################################################################### + +have_libcap=no +setcap_hacks_default=yes +setcap_hacks="$setcap_hacks_default" +setcap_hacks_req=unspecified +AC_ARG_WITH(setcap-hacks, +[ --with-setcap-hacks Allow some demos to be installed with setcap + (which is needed in order to ping other hosts.)], + [setcap_hacks="$withval"; setcap_hacks_req="$withval"], + [setcap_hacks=yes]) + +HANDLE_X_PATH_ARG(setcap_hacks, --with-setcap-hacks, setcap hacks) + +if test "$setcap_hacks" != yes -a "$setcap_hacks" != no ; then + echo "error: must be yes or no: --with-setcap-hacks=$setcap_hacks" + exit 1 +fi + +if test "$setcap_hacks" = yes; then + + AC_CHECK_PROGS(setcap_program, setcap) + if test "$setcap_program" != ''; then + AC_CHECK_X_HEADER(sys/capability.h, [have_setcap=yes]) + fi + if test "$have_setcap" = yes; then + AC_CHECK_X_LIB(cap, cap_set_flag, + [have_libcap=yes + PROG_SETCAP="$setcap_program" + LIBCAP_LIBS="-lcap" + AC_DEFINE(HAVE_LIBCAP)]) + fi +fi + + ############################################################################### # # Check for --with-record-animation @@ -3908,8 +4030,7 @@ fi record_anim_default=no record_anim="$record_anim_default" AC_ARG_WITH(record-animation, -[ --with-record-animation Include code for generating MP4 videos. -], +[ --with-record-animation Include code for generating MP4 videos.], [record_anim="$withval"], [record_anim="$record_anim_default"]) HANDLE_X_PATH_ARG(record_anim, --with-record-animation, record animation) @@ -4020,6 +4141,12 @@ else SETUID_HACKS=no fi +if test "$have_libcap" = yes; then + SETCAP_HACKS=yes +else + SETCAP_HACKS=no +fi + tab=' ' if test "$have_gl" = yes; then GL_EXES='$(GL_EXES)' @@ -4121,8 +4248,12 @@ AC_SUBST(GLE_LIBS) AC_SUBST(XDPMS_LIBS) AC_SUBST(XINERAMA_LIBS) AC_SUBST(PASSWD_LIBS) +AC_SUBST(LIBCAP_CFLAGS) +AC_SUBST(LIBCAP_LIBS) +AC_SUBST(PROG_SETCAP) AC_SUBST(INSTALL_SETUID) AC_SUBST(SETUID_HACKS) +AC_SUBST(SETCAP_HACKS) AC_SUBST(INSTALL_DIRS) AC_SUBST(NEED_SETUID) AC_SUBST(INSTALL_PAM) @@ -4140,6 +4271,7 @@ AC_SUBST(COMMENT_DEMO_GLADE2_GTK_2_22_TAIL) AC_SUBST(OBJCC) AC_SUBST(EXES_OSX) +AC_SUBST(EXES_SYSTEMD) AC_SUBST(SCRIPTS_OSX) AC_SUBST(MEN_OSX) @@ -4520,6 +4652,37 @@ if test "$have_xft" = no ; then fi +if test "$have_systemd" = no ; then + systemd_warned=no + if test "$with_systemd_req" = yes ; then + warnL "Use of systemd was requested, but it was not found." + systemd_warned=yes + elif test "$with_systemd_req" = no ; then + true + # noteL 'The systemd library is not being used.' + # systemd_warned=yes + else + true + # noteL "The systemd library was not found." + # systemd_warned=yes + fi + + if test "$systemd_halfassed" = yes ; then + echo '' + warn2 'More specifically, we found the headers, but not the' + warn2 'libraries; so either systemd is half-installed on this' + warn2 "system, or something else went wrong. The \`config.log'" + warn2 'file might contain some clues.' + echo '' + systemd_warned=yes + fi + + if test "$systemd_warned" = yes; then + warn2 "This means that xscreensaver-systemd won't be built." + fi +fi + + if test "$have_gl" = yes -a "$ac_have_mesa_gl" = yes ; then preferred_mesagl=3.4 mgv="$ac_mesagl_version_string" @@ -4619,6 +4782,10 @@ if test "$with_shadow_req" = yes -a "$have_shadow" = no ; then warn 'Use of shadow passwords was requested, but they were not found.' fi +if test "$setcap_hacks_req" = yes -a "$have_libcap" = no ; then + warn 'Use of libcap was requested, but it was not found.' +fi + if test "$ac_macosx" = yes ; then if test "$enable_locking" = yes ; then warn "You have specified --enable-locking on MacOS X." diff --git a/driver/Makefile.in b/driver/Makefile.in index b13853e0..4ca00b68 100644 --- a/driver/Makefile.in +++ b/driver/Makefile.in @@ -113,6 +113,10 @@ LOCK_OBJS_1 = lock.o passwd.o NOLOCK_SRCS_1 = lock.c NOLOCK_OBJS_1 = lock.o +SYSTEMD_SRCS = xscreensaver-systemd.c +SYSTEMD_OBJS = xscreensaver-systemd.o +SYSTEMD_LIBS = -lsystemd + TEST_SRCS = test-passwd.c test-uid.c test-xdpms.c test-grab.c \ test-apm.c test-fade.c test-xinerama.c test-vp.c \ test-randr.c xdpyinfo.c test-mlstring.c test-screens.c \ @@ -216,9 +220,10 @@ GETIMG_LIBS = $(LIBS) $(X_LIBS) $(PNG_LIBS) $(JPEG_LIBS) \ $(X_PRE_LIBS) -lXt -lX11 $(XMU_LIBS) -lXext $(X_EXTRA_LIBS) EXES = xscreensaver xscreensaver-command xscreensaver-demo \ - xscreensaver-getimage @EXES_OSX@ + xscreensaver-getimage @EXES_OSX@ @EXES_SYSTEMD@ EXES2 = @ALL_DEMO_PROGRAMS@ EXES_OSX = pdf2jpeg +EXES_SYSTEMD = xscreensaver-systemd SCRIPTS_1 = xscreensaver-getimage-file xscreensaver-getimage-video \ xscreensaver-text @@ -233,7 +238,8 @@ MEN_1 = xscreensaver.man xscreensaver-demo.man \ xscreensaver-text.man \ xscreensaver-getimage.man \ xscreensaver-getimage-file.man \ - xscreensaver-getimage-video.man + xscreensaver-getimage-video.man \ + xscreensaver-systemd.man MEN_OSX = xscreensaver-getimage-desktop.man pdf2jpeg.man MEN = $(MEN_1) @MEN_OSX@ @@ -246,7 +252,7 @@ VMSFILES = compile_axp.com compile_decc.com link_axp.com link_decc.com \ vms-getpwnam.c vms-pwd.h vms-hpwd.c vms-validate.c \ vms_axp.opt vms_axp_12.opt vms_decc.opt vms_decc_12.opt -TARFILES = $(EXTRAS) $(VMSFILES) $(SAVER_SRCS_1) \ +TARFILES = $(EXTRAS) $(VMSFILES) $(SAVER_SRCS_1) $(SYSTEMD_SRCS) \ $(MOTIF_SRCS) $(GTK_SRCS) $(PWENT_SRCS) $(PWHELPER_SRCS) \ $(KERBEROS_SRCS) $(PAM_SRCS) $(LOCK_SRCS_1) $(DEMO_SRCS_1) \ $(CMD_SRCS) $(GETIMG_SRCS_1) $(PDF2JPEG_SRCS) $(HDRS) \ @@ -647,7 +653,7 @@ distdepend: check_men update_ad_version XScreenSaver_ad.h XScreenSaver_Xm_ad.h $(INCLUDES_1) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \ $(SAVER_SRCS_1) $(MOTIF_SRCS) $(GTK_SRCS) $(GETIMG_SRCS_1) \ $(PWENT_SRCS) $(LOCK_SRCS_1) $(DEMO_SRCS_1) $(CMD_SRCS) \ - $(TEST_SRCS) 2>/dev/null | \ + $(SYSTEMD_SRCS) $(TEST_SRCS) 2>/dev/null | \ sort -d | \ ( \ awk '/^# .*Makefile.in ---/,/^# DO .*distdepend/' < Makefile.in ; \ @@ -820,6 +826,8 @@ xscreensaver-getimage: $(GETIMG_OBJS) pdf2jpeg: $(PDF2JPEG_OBJS) $(OBJCC) $(LDFLAGS) -o $@ $(PDF2JPEG_OBJS) $(PDF2JPEG_LIBS) -lm +xscreensaver-systemd: $(SYSTEMD_OBJS) + $(CC) $(LDFLAGS) -o $@ $(SYSTEMD_OBJS) $(SYSTEMD_LIBS) -lm TEST_PASSWD_OBJS = test-passwd.o $(LOCK_OBJS_1) $(PASSWD_OBJS) \ subprocs.o setuid.o splash.o prefs.o mlstring.o exec.o \ diff --git a/driver/XScreenSaver.ad.in b/driver/XScreenSaver.ad.in index eec998f1..14f3e96f 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.42 -! 28-Dec-2018 +! version 5.43 +! 01-Jul-2019 ! ! See "man xscreensaver" for more info. The latest version is always ! available at https://www.jwz.org/xscreensaver/ @@ -55,7 +55,7 @@ *splash: True *splashDuration: 0:00:05 *visualID: default -*captureStderr: True +*installColormap: True *ignoreUninstalledPrograms: False *authWarningSlack: 20 @@ -65,12 +65,16 @@ *textProgram: fortune *textURL: https://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss +! When a saver writes an error message to stdout/stderr, it can be printed +! on the screen. +! +*captureStderr: True +*overlayStderr: True *overlayTextForeground: #FFFF00 *overlayTextBackground: #000000 -*overlayStderr: True *font: *-medium-r-*-140-*-m-* -! The default is to use these extensions if available (as noted.) +! The default is to use these server extensions if available (as noted.) *sgiSaverExtension: True *xidleExtension: True *procInterrupts: True @@ -80,14 +84,11 @@ ! Set this to True if you are experiencing longstanding XFree86 bug #421 ! (xscreensaver not covering the whole screen) -GetViewPortIsFullOfLies: False +*GetViewPortIsFullOfLies: False -! This is what the "Demo" button on the splash screen runs (/bin/sh syntax.) +! This is what the "Settings" button on the splash screen runs. *demoCommand: xscreensaver-demo -! This is what the "Prefs" button on the splash screen runs (/bin/sh syntax.) -*prefsCommand: xscreensaver-demo -prefs - ! This is the URL loaded by the "Help" button on the splash screen, ! and by the "Documentation" menu item in xscreensaver-demo. *helpURL: https://www.jwz.org/xscreensaver/man.html @@ -124,6 +125,8 @@ GetViewPortIsFullOfLies: False ! The format used for printing the date and time in the password dialog box ! (see the strftime(3) manual page for details.) *dateFormat: %d-%b-%y (%a); %I:%M %p +! For day month date: +! *dateFormat: %a %b %d, %I:%M %p ! To show the time only: ! *dateFormat: %I:%M %p ! For 24 hour time: @@ -139,15 +142,195 @@ GetViewPortIsFullOfLies: False @NEW_LOGIN_COMMAND_P@*newLoginCommand: @NEW_LOGIN_COMMAND@ -! Turning on "installColormap" on 8-bit systems interacts erratically with -! certain jurassic window managers. If your screen turns some color other -! than black, the window manager is buggy, and you need to set this resource -! to false. Or switch WMs. Or join the 21st century and get a 24-bit -! graphics card. +! Change these at your peril: ! -*installColormap: True +XScreenSaver.pointerPollTime: 0:00:05 +XScreenSaver.pointerHysteresis: 10 +XScreenSaver.initialDelay: 0:00:00 +XScreenSaver.windowCreationTimeout: 0:00:30 +XScreenSaver.bourneShell: /bin/sh + +!============================================================================= +! +! Colors and fonts for the unlock dialog and splash screen. +! +!============================================================================= +! Note, the daemon uses Xlib XLoadFont, not Xft. If these fonts don't +! exist, arcane heuristics are applied until we find something similar. +! +*Dialog.headingFont: -*-helvetica-bold-r-*-*-*-180-*-*-*-*-iso8859-1 +*Dialog.bodyFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1 +*Dialog.labelFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1 +*Dialog.unameFont: -*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-1 +*Dialog.buttonFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1 +*Dialog.dateFont: -*-helvetica-medium-r-*-*-*-80-*-*-*-*-iso8859-1 + +! Helvetica asterisks look terrible. +*passwd.passwdFont: -*-courier-bold-r-*-*-*-140-*-*-*-iso8859-1 + +! Whether to display the local host name in the unlock dialog. +*passwd.uname: True + +! Whether typed passwords should echo as asterisks (true) or nothing (false) +*passwd.asterisks: True + + +! The default color scheme for the unlock and splash dialogs. +! This looks pretty close to the default Gtk theme. +! +*Dialog.foreground: #000000 +*Dialog.background: #E6E6E6 +*Dialog.Button.foreground: #000000 +*Dialog.Button.background: #F5F5F5 +*Dialog.text.foreground: #000000 +*Dialog.text.background: #FFFFFF +*Dialog.topShadowColor: #FFFFFF +*Dialog.bottomShadowColor: #CECECE +*Dialog.logo.width: 210 +*Dialog.logo.height: 210 +*Dialog.internalBorderWidth: 24 +*Dialog.borderWidth: 1 +*Dialog.shadowThickness: 2 +*passwd.thermometer.foreground: #4464AC +*passwd.thermometer.background: #FFFFFF +*passwd.thermometer.width: 8 + + +! A few other example color schemes. +! +! A convenient way to debug these is to build and run "driver/test-passwd". +! Remember that configure overwrites XScreenSaver.ad from XScreenSaver.ad.in. + + +! Borderless theme: +! +! *Dialog.topShadowColor: #E6E6E6 +! *Dialog.bottomShadowColor: #E6E6E6 +! *passwd.thermometer.width: 6 + + +! Dark gray theme: +! +! *Dialog.foreground: #CCCCCC +! *Dialog.background: #333333 +! *Dialog.topShadowColor: #444444 +! *Dialog.bottomShadowColor: #111111 +! *Dialog.text.foreground: #DDDDDD +! *Dialog.text.background: #666666 +! *Dialog.Button.foreground: #CCCCCC +! *Dialog.Button.background: #666666 +! *passwd.thermometer.foreground: #4464AC +! *passwd.thermometer.background: #666666 + + +! Black borderless theme: +! +! *Dialog.foreground: #CCCCCC +! *Dialog.background: #000000 +! *Dialog.topShadowColor: #000000 +! *Dialog.bottomShadowColor: #000000 +! *Dialog.text.foreground: #CCCCCC +! *Dialog.text.background: #000000 +! *Dialog.Button.foreground: #CCCCCC +! *Dialog.Button.background: #333333 +! *passwd.thermometer.foreground: #CCCCCC +! *passwd.thermometer.background: #333333 +! *passwd.thermometer.width: 3 + + +! Green on black theme: +! +! *Dialog.foreground: #00FF00 +! *Dialog.background: #000000 +! *Dialog.topShadowColor: #000000 +! *Dialog.bottomShadowColor: #000000 +! *Dialog.shadowThickness: 1 +! *Dialog.text.foreground: #00FF00 +! *Dialog.text.background: #006600 +! *Dialog.Button.foreground: #00FF00 +! *Dialog.Button.background: #006600 +! *passwd.thermometer.foreground: #00CC00 +! *passwd.thermometer.background: #006600 + + +! White theme: +! +! *Dialog.foreground: #000000 +! *Dialog.background: #FFFFFF +! *Dialog.topShadowColor: #CCCCCC +! *Dialog.bottomShadowColor: #CCCCCC +! *Dialog.shadowThickness: 1 +! *Dialog.text.foreground: #000000 +! *Dialog.text.background: #FFFFFF +! *Dialog.Button.foreground: #000000 +! *Dialog.Button.background: #FFFFFF + + +! Blue theme: +! +! *Dialog.foreground: #000000 +! *Dialog.background: #BBCCDD +! *Dialog.topShadowColor: #CCDDEE +! *Dialog.bottomShadowColor: #AABBCC +! *Dialog.text.foreground: #000000 +! *Dialog.text.background: #DDEEFF +! *Dialog.Button.foreground: #000000 +! *Dialog.Button.background: #DDEEFF +! *passwd.thermometer.foreground: #5566AA +! *passwd.thermometer.background: #BBCCDD + + +! Aqua on black borderless theme: +! +! *Dialog.foreground: #00EFEF +! *Dialog.background: #000000 +! *Dialog.topShadowColor: #000000 +! *Dialog.bottomShadowColor: #000000 +! *Dialog.Button.foreground: #000000 +! *Dialog.Button.background: #2244EE +! *Dialog.text.foreground: #2244EE +! *Dialog.text.background: #EEEEEE +! *Dialog.internalBorderWidth: 36 +! *Dialog.borderWidth: 4 +! *Dialog.shadowThickness: 2 +! *passwd.thermometer.foreground: #2244EE +! *passwd.thermometer.background: #000088 + + +! Wine theme, similar to the login screen of "Ubuntu 18.04 Community". +! +! *Dialog.foreground: #AD8FA6 +! *Dialog.background: #2C041E +! *Dialog.topShadowColor: #2C041E +! *Dialog.bottomShadowColor: #2C041E +! *Dialog.text.foreground: #706B70 +! *Dialog.text.background: #F9F9F8 +! *Dialog.Button.foreground: #CFC8CB +! *Dialog.Button.background: #4D2946 +! *passwd.thermometer.foreground: #AD8FA6 +! *passwd.thermometer.background: #4D2946 +! *passwd.thermometer.width: 6 + + +! Static text in the dialog boxes: +! +*passwd.heading.label: XScreenSaver %s +*passwd.body.label: This screen is locked. +*passwd.unlock.label: OK +*passwd.login.label: New Login +*passwd.user.label: Username: + +*splash.heading.label: XScreenSaver %s +*splash.body.label: Copyright \251 1991-2019 by +*splash.body2.label: Jamie Zawinski +*splash.demo.label: Settings +*splash.help.label: Help + + +!============================================================================= +! ! This is the list of installed screen saver modes. See "man xscreensaver" ! for the syntax used here. ! @@ -157,6 +340,8 @@ GetViewPortIsFullOfLies: False ! You can use the `xscreensaver-demo' program to edit the current list of ! screen savers interactively. ! +!============================================================================= + *programs: \ maze -root \n\ @GL_KLUDGE@ GL: superquadrics -root \n\ @@ -390,75 +575,16 @@ GetViewPortIsFullOfLies: False @GL_KLUDGE@ GL: maze3d -root \n\ @GL_KLUDGE@ GL: peepers -root \n\ @GL_KLUDGE@ GL: razzledazzle -root \n\ - vfeedback -root \n - - - -!============================================================================= -! -! You probably don't want to change anything after this point. -! -!============================================================================= - - -XScreenSaver.pointerPollTime: 0:00:05 -XScreenSaver.pointerHysteresis: 10 -XScreenSaver.initialDelay: 0:00:00 -XScreenSaver.windowCreationTimeout: 0:00:30 -XScreenSaver.bourneShell: /bin/sh - - -! Resources for the password and splash-screen dialog boxes of -! the "xscreensaver" daemon. -! -*Dialog.headingFont: -*-helvetica-bold-r-*-*-*-180-*-*-*-*-iso8859-1 -*Dialog.bodyFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1 -*Dialog.labelFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1 -*Dialog.unameFont: -*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-1 -*Dialog.buttonFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1 -*Dialog.dateFont: -*-helvetica-medium-r-*-*-*-80-*-*-*-*-iso8859-1 - -! Helvetica asterisks look terrible. -*passwd.passwdFont: -*-courier-medium-r-*-*-*-140-*-*-*-iso8859-1 - - -*Dialog.foreground: #000000 -*Dialog.background: #E6E6E6 -*Dialog.Button.foreground: #000000 -*Dialog.Button.background: #F5F5F5 -!*Dialog.Button.pointBackground: #EAEAEA -!*Dialog.Button.clickBackground: #C3C3C3 -*Dialog.text.foreground: #000000 -*Dialog.text.background: #FFFFFF -*passwd.thermometer.foreground: #4464AC -*passwd.thermometer.background: #FFFFFF -*Dialog.topShadowColor: #FFFFFF -*Dialog.bottomShadowColor: #CECECE -*Dialog.logo.width: 210 -*Dialog.logo.height: 210 -*Dialog.internalBorderWidth: 24 -*Dialog.borderWidth: 1 -*Dialog.shadowThickness: 2 + vfeedback -root \n\ +@GL_KLUDGE@ GL: deepstars -root \n\ +@GL_KLUDGE@ GL: gravitywell -root \n -*passwd.heading.label: XScreenSaver %s -*passwd.body.label: This screen is locked. -*passwd.unlock.label: OK -*passwd.login.label: New Login -*passwd.user.label: Username: -*passwd.thermometer.width: 8 -*passwd.asterisks: True -*passwd.uname: True - -*splash.heading.label: XScreenSaver %s -*splash.body.label: Copyright \251 1991-2018 by -*splash.body2.label: Jamie Zawinski -*splash.demo.label: Settings -*splash.help.label: Help !============================================================================= ! ! Pretty names for the hacks that have unusual capitalization. +! Used by xscreensaver-demo. ! !============================================================================= @@ -483,6 +609,7 @@ XScreenSaver.bourneShell: /bin/sh *hacks.cwaves.name: CWaves *hacks.dangerball.name: DangerBall *hacks.decayscreen.name: DecayScreen +*hacks.deepstars.name: DeepStars *hacks.dnalogo.name: DNA Logo *hacks.dymaxionmap.name: DymaxionMap *hacks.energystream.name: EnergyStream @@ -501,6 +628,7 @@ XScreenSaver.bourneShell: /bin/sh *hacks.gleidescope.name: Gleidescope *hacks.glforestfire.name: GLForestFire *hacks.glitchpeg.name: GlitchPEG +*hacks.gravitywell.name: GravityWell *hacks.hyperball.name: HyperBall *hacks.hypercube.name: HyperCube *hacks.ifs.name: IFS diff --git a/driver/XScreenSaver_ad.h b/driver/XScreenSaver_ad.h index 2d7b1681..2b2dab85 100644 --- a/driver/XScreenSaver_ad.h +++ b/driver/XScreenSaver_ad.h @@ -27,7 +27,7 @@ "*splash: True", "*splashDuration: 0:00:05", "*visualID: default", -"*captureStderr: True", +"*installColormap: True", "*ignoreUninstalledPrograms: False", "*authWarningSlack: 20", "*textMode: file", @@ -35,23 +35,62 @@ "*textFile: ", "*textProgram: fortune", "*textURL: https://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss", +"*captureStderr: True", +"*overlayStderr: True", "*overlayTextForeground: #FFFF00", "*overlayTextBackground: #000000", -"*overlayStderr: True", "*font: *-medium-r-*-140-*-m-*", "*sgiSaverExtension: True", "*xidleExtension: True", "*procInterrupts: True", "*xinputExtensionDev: False", -"GetViewPortIsFullOfLies: False", +"*GetViewPortIsFullOfLies: False", "*demoCommand: xscreensaver-demo", -"*prefsCommand: xscreensaver-demo -prefs", "*helpURL: https://www.jwz.org/xscreensaver/man.html", "*loadURL: firefox '%s' || mozilla '%s' || netscape '%s'", "*manualCommand: xterm -sb -fg black -bg gray75 -T '%s manual' \ -e /bin/sh -c 'man \"%s\" ; read foo'", "*dateFormat: %d-%b-%y (%a); %I:%M %p", -"*installColormap: True", +"XScreenSaver.pointerPollTime: 0:00:05", +"XScreenSaver.pointerHysteresis: 10", +"XScreenSaver.initialDelay: 0:00:00", +"XScreenSaver.windowCreationTimeout: 0:00:30", +"XScreenSaver.bourneShell: /bin/sh", +"*Dialog.headingFont: -*-helvetica-bold-r-*-*-*-180-*-*-*-*-iso8859-1", +"*Dialog.bodyFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1", +"*Dialog.labelFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1", +"*Dialog.unameFont: -*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-1", +"*Dialog.buttonFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1", +"*Dialog.dateFont: -*-helvetica-medium-r-*-*-*-80-*-*-*-*-iso8859-1", +"*passwd.passwdFont: -*-courier-bold-r-*-*-*-140-*-*-*-iso8859-1", +"*passwd.uname: True", +"*passwd.asterisks: True", +"*Dialog.foreground: #000000", +"*Dialog.background: #E6E6E6", +"*Dialog.Button.foreground: #000000", +"*Dialog.Button.background: #F5F5F5", +"*Dialog.text.foreground: #000000", +"*Dialog.text.background: #FFFFFF", +"*Dialog.topShadowColor: #FFFFFF", +"*Dialog.bottomShadowColor: #CECECE", +"*Dialog.logo.width: 210", +"*Dialog.logo.height: 210", +"*Dialog.internalBorderWidth: 24", +"*Dialog.borderWidth: 1", +"*Dialog.shadowThickness: 2", +"*passwd.thermometer.foreground: #4464AC", +"*passwd.thermometer.background: #FFFFFF", +"*passwd.thermometer.width: 8", +"*passwd.heading.label: XScreenSaver %s", +"*passwd.body.label: This screen is locked.", +"*passwd.unlock.label: OK", +"*passwd.login.label: New Login", +"*passwd.user.label: Username:", +"*splash.heading.label: XScreenSaver %s", +"*splash.body.label: Copyright \\251 1991-2019 by", +"*splash.body2.label: Jamie Zawinski ", +"*splash.demo.label: Settings", +"*splash.help.label: Help", "*programs: \ maze -root \\n\ GL: superquadrics -root \\n\ @@ -285,47 +324,9 @@ GL: maze3d -root \\n\ GL: peepers -root \\n\ GL: razzledazzle -root \\n\ - vfeedback -root \\n", -"XScreenSaver.pointerPollTime: 0:00:05", -"XScreenSaver.pointerHysteresis: 10", -"XScreenSaver.initialDelay: 0:00:00", -"XScreenSaver.windowCreationTimeout: 0:00:30", -"XScreenSaver.bourneShell: /bin/sh", -"*Dialog.headingFont: -*-helvetica-bold-r-*-*-*-180-*-*-*-*-iso8859-1", -"*Dialog.bodyFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1", -"*Dialog.labelFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1", -"*Dialog.unameFont: -*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-1", -"*Dialog.buttonFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1", -"*Dialog.dateFont: -*-helvetica-medium-r-*-*-*-80-*-*-*-*-iso8859-1", -"*passwd.passwdFont: -*-courier-medium-r-*-*-*-140-*-*-*-iso8859-1", -"*Dialog.foreground: #000000", -"*Dialog.background: #E6E6E6", -"*Dialog.Button.foreground: #000000", -"*Dialog.Button.background: #F5F5F5", -"*Dialog.text.foreground: #000000", -"*Dialog.text.background: #FFFFFF", -"*passwd.thermometer.foreground: #4464AC", -"*passwd.thermometer.background: #FFFFFF", -"*Dialog.topShadowColor: #FFFFFF", -"*Dialog.bottomShadowColor: #CECECE", -"*Dialog.logo.width: 210", -"*Dialog.logo.height: 210", -"*Dialog.internalBorderWidth: 24", -"*Dialog.borderWidth: 1", -"*Dialog.shadowThickness: 2", -"*passwd.heading.label: XScreenSaver %s", -"*passwd.body.label: This screen is locked.", -"*passwd.unlock.label: OK", -"*passwd.login.label: New Login", -"*passwd.user.label: Username:", -"*passwd.thermometer.width: 8", -"*passwd.asterisks: True", -"*passwd.uname: True", -"*splash.heading.label: XScreenSaver %s", -"*splash.body.label: Copyright \\251 1991-2018 by", -"*splash.body2.label: Jamie Zawinski ", -"*splash.demo.label: Settings", -"*splash.help.label: Help", + vfeedback -root \\n\ + GL: deepstars -root \\n\ + GL: gravitywell -root \\n", "*hacks.antinspect.name: AntInspect", "*hacks.antmaze.name: AntMaze", "*hacks.antspotlight.name: AntSpotlight", @@ -347,6 +348,7 @@ "*hacks.cwaves.name: CWaves", "*hacks.dangerball.name: DangerBall", "*hacks.decayscreen.name: DecayScreen", +"*hacks.deepstars.name: DeepStars", "*hacks.dnalogo.name: DNA Logo", "*hacks.dymaxionmap.name: DymaxionMap", "*hacks.energystream.name: EnergyStream", @@ -365,6 +367,7 @@ "*hacks.gleidescope.name: Gleidescope", "*hacks.glforestfire.name: GLForestFire", "*hacks.glitchpeg.name: GlitchPEG", +"*hacks.gravitywell.name: GravityWell", "*hacks.hyperball.name: HyperBall", "*hacks.hypercube.name: HyperCube", "*hacks.ifs.name: IFS", diff --git a/driver/demo-Gtk.c b/driver/demo-Gtk.c index ef00d822..be4a2387 100644 --- a/driver/demo-Gtk.c +++ b/driver/demo-Gtk.c @@ -1,5 +1,5 @@ /* demo-Gtk.c --- implements the interactive demo-mode and options dialogs. - * xscreensaver, Copyright (c) 1993-2018 Jamie Zawinski + * xscreensaver, Copyright (c) 1993-2019 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 @@ -250,7 +250,8 @@ static state *global_state_kludge; Atom XA_VROOT; Atom XA_SCREENSAVER, XA_SCREENSAVER_RESPONSE, XA_SCREENSAVER_VERSION; Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO; -Atom XA_ACTIVATE, XA_BLANK, XA_LOCK, XA_RESTART, XA_EXIT; +Atom XA_ACTIVATE, XA_SUSPEND, XA_BLANK, XA_LOCK, XA_RESTART, XA_EXIT; +Atom XA_NEXT, XA_PREV; static void populate_demo_window (state *, int list_elt); @@ -5069,8 +5070,11 @@ main (int argc, char **argv) XA_SELECT = XInternAtom (dpy, "SELECT", False); XA_DEMO = XInternAtom (dpy, "DEMO", False); XA_ACTIVATE = XInternAtom (dpy, "ACTIVATE", False); + XA_SUSPEND = XInternAtom (dpy, "SUSPEND", False); XA_BLANK = XInternAtom (dpy, "BLANK", False); XA_LOCK = XInternAtom (dpy, "LOCK", False); + XA_NEXT = XInternAtom (dpy, "NEXT", False); + XA_PREV = XInternAtom (dpy, "PREV", False); XA_EXIT = XInternAtom (dpy, "EXIT", False); XA_RESTART = XInternAtom (dpy, "RESTART", False); diff --git a/driver/demo-Xm.c b/driver/demo-Xm.c index 149e7c51..3497641d 100644 --- a/driver/demo-Xm.c +++ b/driver/demo-Xm.c @@ -113,7 +113,7 @@ static char *short_version = 0; Atom XA_VROOT; Atom XA_SCREENSAVER, XA_SCREENSAVER_RESPONSE, XA_SCREENSAVER_VERSION; Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO; -Atom XA_ACTIVATE, XA_BLANK, XA_LOCK, XA_RESTART, XA_EXIT; +Atom XA_ACTIVATE, XA_SUSPEND, XA_BLANK, XA_LOCK, XA_RESTART, XA_EXIT; static void populate_demo_window (Widget toplevel, @@ -1800,6 +1800,7 @@ main (int argc, char **argv) XA_SELECT = XInternAtom (dpy, "SELECT", False); XA_DEMO = XInternAtom (dpy, "DEMO", False); XA_ACTIVATE = XInternAtom (dpy, "ACTIVATE", False); + XA_SUSPEND = XInternAtom (dpy, "SUSPEND", False); XA_BLANK = XInternAtom (dpy, "BLANK", False); XA_LOCK = XInternAtom (dpy, "LOCK", False); XA_EXIT = XInternAtom (dpy, "EXIT", False); diff --git a/driver/lock.c b/driver/lock.c index 10b879e2..7696f301 100644 --- a/driver/lock.c +++ b/driver/lock.c @@ -872,6 +872,7 @@ draw_passwd_window (saver_info *si) memset (buf, 0, sizeof(buf)); strftime (buf, sizeof(buf)-1, pw->date_label, tm); + XSetForeground (si->dpy, gc1, pw->foreground); XSetFont (si->dpy, gc1, pw->date_font->fid); y1 += pw->shadow_width; y1 += (spacing + tb_height); @@ -1148,7 +1149,8 @@ update_passwd_window (saver_info *si, const char *printed_passwd, float ratio) y = (pw->thermo_field_height - 2) * (1.0 - pw->ratio); if (y > 0) { - XFillRectangle (si->dpy, si->passwd_dialog, gc2, + XSetForeground (si->dpy, gc1, pw->thermo_background); + XFillRectangle (si->dpy, si->passwd_dialog, gc1, pw->thermo_field_x + 1, pw->thermo_field_y + 1, pw->thermo_width-2, diff --git a/driver/remote.c b/driver/remote.c index 775036ac..83254e01 100644 --- a/driver/remote.c +++ b/driver/remote.c @@ -1,4 +1,4 @@ -/* xscreensaver-command, Copyright (c) 1991-2009 Jamie Zawinski +/* xscreensaver-command, Copyright (c) 1991-2019 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 @@ -43,6 +43,7 @@ extern char *progname; extern Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE; extern Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_EXIT; extern Atom XA_VROOT, XA_SELECT, XA_DEMO, XA_BLANK, XA_LOCK; +extern Atom XA_ACTIVATE, XA_SUSPEND, XA_NEXT, XA_PREV, XA_EXIT; static XErrorHandler old_handler = 0; @@ -490,6 +491,109 @@ xscreensaver_command_response (Display *dpy, Window window, } +/* Wait until the window has been mapped, blanking the screen. + Catches errors, times out after a few seconds. + */ +static int +xscreensaver_command_wait_for_blank (Display *dpy, Window window, + Bool verbose_p, char **error_ret) +{ + time_t start = time((time_t*)0); + int max = 10; + char err[2048]; + Status status = -1; + + while (1) + { + XWindowAttributes xgwa; + xgwa.map_state = IsUnmapped; + + if (!window) + got_badwindow = True; + else + { + XSync (dpy, False); + if (old_handler) abort(); + got_badwindow = False; + old_handler = XSetErrorHandler (BadWindow_ehandler); + status = XGetWindowAttributes (dpy, window, &xgwa); + XSync (dpy, False); + XSetErrorHandler (old_handler); + old_handler = 0; + } + + if (got_badwindow) + { + /* If we got a BadWindow, it might be that in the course of + activating, xscreensaver had to destroy and re-create the + window to get one with the proper Visual. So wait for a + new window to come into existence. + */ + if (window && verbose_p > 1) + fprintf (stderr, + "%s: BadWindow 0x%08x waiting for screen to blank\n", + progname, (unsigned int) window); + window = find_screensaver_window (dpy, 0); + if (window && verbose_p > 1) + fprintf (stderr, "%s: new window is 0x%08x.\n", + progname, (unsigned int) window); + got_badwindow = False; + } + else if (status == 0) + { + sprintf (err, "error on 0x%08x waiting for screen to blank", + (unsigned int) window); + if (error_ret) + *error_ret = strdup (err); + else + fprintf (stderr, "%s: %s\n", progname, err); + return -1; + } + else if (xgwa.map_state == IsViewable) + { + if (verbose_p) + fprintf (stderr, "%s: window 0x%08x mapped.\n", + progname, (unsigned int) window); + return 0; + } + else + { + time_t now = time((time_t*)0); + + if (now >= start + max) + { + sprintf (err, "Timed out waiting for screen to blank on 0x%08x", + (unsigned int) window); + if (error_ret) + *error_ret = strdup (err); + else + fprintf (stderr, "%s: %s\n", progname, err); + return -1; + } + else if (verbose_p && now > start+1) + { + fprintf (stderr, "%s: waiting for window 0x%08x to map\n", + progname, (unsigned int) window); + } + } + +# if defined(HAVE_SELECT) + { + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 1000000L / 10; + select (0, 0, 0, 0, &tv); + } +# else + sleep (1); +# endif + } + + return 0; +} + + + int xscreensaver_command (Display *dpy, Atom command, long arg, Bool verbose_p, char **error_ret) @@ -501,6 +605,18 @@ xscreensaver_command (Display *dpy, Atom command, long arg, Bool verbose_p, (command == XA_EXIT), error_ret); + /* If this command should result in the screen being blank, wait until + the xscreensaver window is mapped before returning. */ + if (status == 0 && + (command == XA_ACTIVATE || + command == XA_SUSPEND || + command == XA_LOCK || + command == XA_NEXT || + command == XA_PREV || + command == XA_SELECT)) + status = xscreensaver_command_wait_for_blank (dpy, w, verbose_p, + error_ret); + fflush (stdout); fflush (stderr); return (status < 0 ? status : 0); diff --git a/driver/screens.c b/driver/screens.c index 1a2f41d1..f319c961 100644 --- a/driver/screens.c +++ b/driver/screens.c @@ -576,7 +576,7 @@ randr_versus_xinerama_fight (Display *dpy, monitor **randr_monitors, { *errP = append (*errP, "WARNING: RANDR reports 1 screen but Xinerama\n" - "\t\treports multiple. Believing Xinerama."); + " reports multiple. Believing Xinerama."); free_monitors (randr_monitors); return xinerama_monitors; } @@ -584,7 +584,7 @@ randr_versus_xinerama_fight (Display *dpy, monitor **randr_monitors, { *errP = append (*errP, "WARNING: RANDR and Xinerama report different\n" - "\t\tscreen layouts! Believing RANDR."); + " screen layouts! Believing RANDR."); free_monitors (xinerama_monitors); return randr_monitors; } diff --git a/driver/splash.c b/driver/splash.c index a4f17616..b971ade1 100644 --- a/driver/splash.c +++ b/driver/splash.c @@ -881,7 +881,7 @@ do_prefs (saver_screen_info *ssi) saver_preferences *p = &si->prefs; const char *cmd = p->prefs_command; - if (command && *command) + if (cmd && *cmd) fork_and_exec (ssi, cmd); else fprintf (stderr, "%s: no preferences command has been specified.\n", diff --git a/driver/subprocs.c b/driver/subprocs.c index 4f327e95..d500f70e 100644 --- a/driver/subprocs.c +++ b/driver/subprocs.c @@ -1,5 +1,5 @@ /* subprocs.c --- choosing, spawning, and killing screenhacks. - * xscreensaver, Copyright (c) 1991-2017 Jamie Zawinski + * xscreensaver, Copyright (c) 1991-2019 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 @@ -439,7 +439,7 @@ unblock_sigchld (void) block_sigchld_handler--; } -static int +int kill_job (saver_info *si, pid_t pid, int signal) { saver_preferences *p = &si->prefs; @@ -738,12 +738,18 @@ describe_dead_child (saver_info *si, pid_t kid, int wait_status) /* Clear out the pid so that screenhack_running_p() knows it's dead. */ if (!job || job->status == job_dead) + { for (i = 0; i < si->nscreens; i++) { saver_screen_info *ssi = &si->screens[i]; if (kid == ssi->pid) ssi->pid = 0; } +# ifdef HAVE_LIBSYSTEMD + if (kid == si->systemd_pid) + si->systemd_pid = 0; +# endif + } } #else /* VMS */ @@ -872,7 +878,12 @@ print_path_error (const char *program) pid_t fork_and_exec (saver_screen_info *ssi, const char *command) { - saver_info *si = ssi->global; + return fork_and_exec_1 (ssi->global, ssi, command); +} + +pid_t +fork_and_exec_1 (saver_info *si, saver_screen_info *ssi, const char *command) +{ saver_preferences *p = &si->prefs; pid_t forked; @@ -889,11 +900,12 @@ fork_and_exec (saver_screen_info *ssi, const char *command) case 0: close (ConnectionNumber (si->dpy)); /* close display fd */ limit_subproc_memory (p->inferior_memory_limit, p->verbose_p); - hack_subproc_environment (ssi->screen, ssi->screensaver_window); + if (ssi) + hack_subproc_environment (ssi->screen, ssi->screensaver_window); if (p->verbose_p) fprintf (stderr, "%s: %d: spawning \"%s\" in pid %lu.\n", - blurb(), ssi->number, command, + blurb(), (ssi ? ssi->number : 0), command, (unsigned long) getpid ()); exec_command (p->shell, command, p->nice_inferior); @@ -908,7 +920,7 @@ fork_and_exec (saver_screen_info *ssi, const char *command) break; default: /* parent */ - (void) make_job (forked, ssi->number, command); + (void) make_job (forked, (ssi ? ssi->number : 0), command); break; } diff --git a/driver/types.h b/driver/types.h index f1630b0d..35992ae9 100644 --- a/driver/types.h +++ b/driver/types.h @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1993-2014 Jamie Zawinski +/* xscreensaver, Copyright (c) 1993-2019 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 @@ -344,6 +344,9 @@ struct saver_info { XtIntervalId stderr_popup_timer; +# ifdef HAVE_LIBSYSTEMD + pid_t systemd_pid; +# endif }; /* This structure holds all the data that applies to the screen-specific parts diff --git a/driver/windows.c b/driver/windows.c index 9b2bf847..b7bea528 100644 --- a/driver/windows.c +++ b/driver/windows.c @@ -1,5 +1,5 @@ /* windows.c --- turning the screen black; dealing with visuals, virtual roots. - * xscreensaver, Copyright (c) 1991-2014 Jamie Zawinski + * xscreensaver, Copyright (c) 1991-2019 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 @@ -752,6 +752,16 @@ restore_real_vroot_handler (int sig) if (restore_real_vroot (si)) fprintf (real_stderr, "\n%s: %s intercepted, vroot restored.\n", blurb(), signal_name(sig)); +# ifdef HAVE_LIBSYSTEMD + if (si->systemd_pid) /* Kill background xscreensaver-systemd process */ + { + /* We're exiting, so there's no need to do a full kill_job() here, + which will waitpid(). */ + /* kill_job (si, si->systemd_pid, SIGTERM); */ + kill (si->systemd_pid, SIGTERM); + si->systemd_pid = 0; + } +# endif kill (getpid (), sig); } @@ -872,6 +882,14 @@ saver_exit (saver_info *si, int status, const char *dump_core_reason) if (p->verbose_p && vrs) fprintf (real_stderr, "%s: old vroot restored.\n", blurb()); +# ifdef HAVE_LIBSYSTEMD + if (si->systemd_pid) /* Kill background xscreensaver-systemd process */ + { + kill_job (si, si->systemd_pid, SIGTERM); + si->systemd_pid = 0; + } +# endif + fflush(real_stdout); #ifdef VMS /* on VMS, 1 is the "normal" exit code instead of 0. */ diff --git a/driver/xscreensaver-command.c b/driver/xscreensaver-command.c index f4a855df..4a4f0b46 100644 --- a/driver/xscreensaver-command.c +++ b/driver/xscreensaver-command.c @@ -1,4 +1,4 @@ -/* xscreensaver-command, Copyright (c) 1991-2013 Jamie Zawinski +/* xscreensaver-command, Copyright (c) 1991-2019 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 @@ -51,8 +51,8 @@ char *progname; Atom XA_VROOT; Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE; Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO, XA_EXIT; -Atom XA_BLANK, XA_LOCK; -static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_CYCLE, XA_NEXT, XA_PREV; +Atom XA_BLANK, XA_LOCK, XA_ACTIVATE, XA_SUSPEND, XA_NEXT, XA_PREV; +static Atom XA_DEACTIVATE, XA_CYCLE; static Atom XA_RESTART, XA_PREFS, XA_THROTTLE, XA_UNTHROTTLE; static char *screensaver_version; @@ -116,6 +116,11 @@ usage: %s -