From: Zygo Blaxell Date: Mon, 2 Mar 2009 05:43:54 +0000 (-0500) Subject: http://www.jwz.org/xscreensaver/xscreensaver-5.07.tar.gz X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=commitdiff_plain;h=c1b9b55ad8d59dc05ef55e316aebf5863e7dfa56 www.jwz.org/xscreensaver/xscreensaver-5.07.tar.gz -rw-r--r-- 1 zblaxell zblaxell 5513131 Aug 11 2008 xscreensaver-5.07.tar.gz 82c611ab271807ad871aa46a3a7f6b95706d31aa xscreensaver-5.07.tar.gz --- diff --git a/OSX/._PrefsReader.m b/OSX/._PrefsReader.m new file mode 100644 index 00000000..3d666b3f Binary files /dev/null and b/OSX/._PrefsReader.m differ diff --git a/OSX/._jwxyz.m b/OSX/._jwxyz.m new file mode 100644 index 00000000..3281d46d Binary files /dev/null and b/OSX/._jwxyz.m differ diff --git a/OSX/AppController.h b/OSX/AppController.h deleted file mode 100644 index 98d9f82f..00000000 --- a/OSX/AppController.h +++ /dev/null @@ -1,21 +0,0 @@ -/* xscreensaver, Copyright (c) 2006 Jamie Zawinski - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation. No representations are made about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - */ - -#import -#import - -@interface AppController : NSObject -{ - ScreenSaverView *saverView0; - ScreenSaverView *saverView1; -} - -@end diff --git a/OSX/AppController.m b/OSX/AppController.m deleted file mode 100644 index 76911b3a..00000000 --- a/OSX/AppController.m +++ /dev/null @@ -1,200 +0,0 @@ -/* xscreensaver, Copyright (c) 2006 Jamie Zawinski - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation. No representations are made about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - */ - -/* This is just a test harness, really -- it makes a window with an - XScreenSaverGLView in it and a Preferences button, because I don't want - to have to debug these programs by installing them as screen savers - first! - */ - -#import "AppController.h" -#import "XScreenSaverGLView.h" - -@implementation AppController - -- (ScreenSaverView *) makeSaverView -{ - const char *var = "SCREENSAVER_MODULE"; - const char *s = getenv (var); - if (!s || !*s) { - NSAssert1 (0, @"set $%s to the name of the module to run", var); - exit(1); - } - NSString *module = [NSString stringWithCString:s - encoding:NSUTF8StringEncoding]; - NSString *dir = [[[NSBundle mainBundle] bundlePath] - stringByDeletingLastPathComponent]; - NSString *name = [module stringByAppendingPathExtension:@"saver"]; - NSString *path = [dir stringByAppendingPathComponent:name]; - NSBundle *bundleToLoad = [NSBundle bundleWithPath:path]; - Class new_class = [bundleToLoad principalClass]; - NSAssert1 (new_class, @"unable to load \"%@\"", path); - - NSRect rect; - rect.origin.x = rect.origin.y = 0; - rect.size.width = 320; - rect.size.height = 240; - - id instance = [[new_class alloc] initWithFrame:rect isPreview:YES]; - NSAssert1 (instance, @"unable to instantiate %@", new_class); - return (ScreenSaverView *) instance; -} - - -- (void) openPreferences: (int) which -{ - ScreenSaverView *sv = (which ? saverView1 : saverView0); - NSAssert (sv, @"no saver view"); - NSWindow *prefs = [sv configureSheet]; - - [NSApp beginSheet:prefs - modalForWindow:[sv window] - modalDelegate:self - didEndSelector:@selector(preferencesClosed:returnCode:contextInfo:) - contextInfo:nil]; - int code = [NSApp runModalForWindow:prefs]; - - /* Restart the animation if the "OK" button was hit, but not if "Cancel". - We have to restart *both* animations, because the xlockmore-style - ones will blow up if one re-inits but the other doesn't. - */ - if (code != NSCancelButton) { - if (saverView0) [saverView0 stopAnimation]; - if (saverView1) [saverView1 stopAnimation]; - if (saverView0) [saverView0 startAnimation]; - if (saverView1) [saverView1 startAnimation]; - } -} - -- (void) openPreferences0: (NSObject *) button -{ - [self openPreferences:0]; -} - -- (void) openPreferences1: (NSObject *) button -{ - [self openPreferences:1]; -} - -- (void) preferencesClosed: (NSWindow *) sheet - returnCode: (int) returnCode - contextInfo: (void *) contextInfo -{ - [NSApp stopModalWithCode:returnCode]; -} - - -- (void) makeWindow: (ScreenSaverView *)sv which:(int)which -{ - NSRect rect; - - if (which) - saverView1 = sv; - else - saverView0 = sv; - - // make a "Preferences" button - // - rect.origin.x = rect.origin.y = 0; - rect.size.width = rect.size.height = 10; - NSButton *pb = [[NSButton alloc] initWithFrame:rect]; - [pb setTitle:@"Preferences"]; - [pb setBezelStyle:NSRoundedBezelStyle]; - [pb sizeToFit]; - rect.origin.x = ([sv frame].size.width - - [pb frame].size.width) / 2; - [pb setFrameOrigin:rect.origin]; - - // grab the click - // - [pb setTarget:self]; - if (which) - [pb setAction:@selector(openPreferences1:)]; - else - [pb setAction:@selector(openPreferences0:)]; - - // make a box to wrap the saverView - // - rect = [sv frame]; - rect.origin.x = 0; - rect.origin.y = [pb frame].origin.y + [pb frame].size.height; - NSBox *gbox = [[NSBox alloc] initWithFrame:rect]; - rect.size.width = rect.size.height = 10; - [gbox setContentViewMargins:rect.size]; - [gbox setTitlePosition:NSNoTitle]; - [gbox addSubview:sv]; - [gbox sizeToFit]; - - // make a box to wrap the other two boxes - // - rect.origin.x = rect.origin.y = 0; - rect.size.width = [gbox frame].size.width; - rect.size.height = [gbox frame].size.height + [gbox frame].origin.y; - NSBox *pbox = [[NSBox alloc] initWithFrame:rect]; - [pbox setTitlePosition:NSNoTitle]; - [pbox setBorderType:NSNoBorder]; - [pbox addSubview:gbox]; - [pbox addSubview:pb]; - [pbox sizeToFit]; - - // and make a window to hold that. - // - NSScreen *screen = [NSScreen mainScreen]; - rect = [pbox frame]; - rect.origin.x = ([screen frame].size.width - rect.size.width) / 2; - rect.origin.y = ([screen frame].size.height - rect.size.height) / 2; - - rect.origin.x += rect.size.width * (which ? 0.55 : -0.55); - - NSWindow *window = [[NSWindow alloc] - initWithContentRect:rect - styleMask:(NSTitledWindowMask | - NSClosableWindowMask | - NSMiniaturizableWindowMask | - NSResizableWindowMask) - backing:NSBackingStoreBuffered - defer:YES - screen:screen]; - [window setTitle:@"XScreenSaver"]; - [window setMinSize:[window frameRectForContentRect:rect].size]; - - [[window contentView] addSubview:pbox]; - - [sv setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; - [pb setAutoresizingMask:NSViewMinXMargin|NSViewMaxXMargin]; - [gbox setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; - [pbox setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; - - [window setFrameAutosaveName:(which - ? @"SaverDebugWindow1" - : @"SaverDebugWindow0")]; - [window setFrameUsingName:[window frameAutosaveName]]; - - [window makeKeyAndOrderFront:window]; - - [sv startAnimation]; -} - - -- (void)applicationDidFinishLaunching: (NSNotification *) n -{ - [self makeWindow:[self makeSaverView] which:0]; - [self makeWindow:[self makeSaverView] which:1]; -} - -/* When the window closes, exit (even if prefs still open.) -*/ -- (BOOL) applicationShouldTerminateAfterLastWindowClosed: (NSApplication *) n -{ - return YES; -} - -@end diff --git a/OSX/English.lproj/MainMenu.nib/classes.nib b/OSX/English.lproj/MainMenu.nib/classes.nib deleted file mode 100644 index cbc6c754..00000000 --- a/OSX/English.lproj/MainMenu.nib/classes.nib +++ /dev/null @@ -1,9 +0,0 @@ -{ - IBClasses = ( - {CLASS = AppController; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, - {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, - {CLASS = InvertedSlider; LANGUAGE = ObjC; SUPERCLASS = NSSlider; }, - {CLASS = PrefsReader; LANGUAGE = ObjC; SUPERCLASS = NSObject; } - ); - IBVersion = 1; -} \ No newline at end of file diff --git a/OSX/English.lproj/MainMenu.nib/info.nib b/OSX/English.lproj/MainMenu.nib/info.nib deleted file mode 100644 index a3bd34e1..00000000 --- a/OSX/English.lproj/MainMenu.nib/info.nib +++ /dev/null @@ -1,21 +0,0 @@ - - - - - IBDocumentLocation - 135 107 356 240 0 0 1680 1028 - IBEditorPositions - - 29 - 132 353 321 44 0 0 1680 1028 - - IBFramework Version - 443.0 - IBOpenObjects - - 29 - - IBSystem Version - 8G32 - - diff --git a/OSX/English.lproj/MainMenu.nib/keyedobjects.nib b/OSX/English.lproj/MainMenu.nib/keyedobjects.nib deleted file mode 100644 index e6c5e48a..00000000 Binary files a/OSX/English.lproj/MainMenu.nib/keyedobjects.nib and /dev/null differ diff --git a/OSX/English.lproj/SaverTester.nib/classes.nib b/OSX/English.lproj/SaverTester.nib/classes.nib new file mode 100644 index 00000000..15381b04 --- /dev/null +++ b/OSX/English.lproj/SaverTester.nib/classes.nib @@ -0,0 +1,27 @@ + + + + + IBClasses + + + CLASS + SaverTester + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + IBVersion + 1 + + diff --git a/OSX/English.lproj/SaverTester.nib/info.nib b/OSX/English.lproj/SaverTester.nib/info.nib new file mode 100644 index 00000000..235c169a --- /dev/null +++ b/OSX/English.lproj/SaverTester.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 670 + IBLastKnownRelativeProjectPath + ../../xscreensaver.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 29 + + IBSystem Version + 9E17 + targetFramework + IBCocoaFramework + + diff --git a/OSX/English.lproj/SaverTester.nib/keyedobjects.nib b/OSX/English.lproj/SaverTester.nib/keyedobjects.nib new file mode 100644 index 00000000..929e2e98 Binary files /dev/null and b/OSX/English.lproj/SaverTester.nib/keyedobjects.nib differ diff --git a/OSX/PrefsReader.m b/OSX/PrefsReader.m index 9ff55bba..e3be1456 100644 --- a/OSX/PrefsReader.m +++ b/OSX/PrefsReader.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2008 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 @@ -188,26 +188,29 @@ !strcmp(name, "font") || !strcmp(name, "labelFont") || // grabclient.c !strcmp(name, "titleFont") || + !strcmp(name, "fpsFont") || // fps.c + !strcmp(name, "foreground") || // fps.c !strcmp(name, "background") )) NSLog(@"warning: no preference \"%s\" [string]", name); return NULL; } -#if 0 - if (! [o isKindOfClass:[NSString class]]) { - NSAssert2(0, @"%s = \"%@\" but should have been an NSString", name, o); - abort(); - } -#else if (! [o isKindOfClass:[NSString class]]) { NSLog(@"asked for %s as a string, but it is a %@", name, [o class]); o = [(NSNumber *) o stringValue]; } -#endif NSString *os = (NSString *) o; - const char *result = [os cStringUsingEncoding:NSUTF8StringEncoding]; - return strdup (result); + char *result = strdup ([os cStringUsingEncoding:NSUTF8StringEncoding]); + + // Kludge: if the string is surrounded with single-quotes, remove them. + // This happens when the .xml file says things like arg="-foo 'bar baz'" + if (result[0] == '\'' && result[strlen(result)-1] == '\'') { + result[strlen(result)-1] = 0; + strcpy (result, result+1); + } + + return result; } @@ -227,6 +230,7 @@ !strcmp(name, "mono") || !strcmp(name, "count") || !strcmp(name, "ncolors") || + !strcmp(name, "doFPS") || // fps.c !strcmp(name, "eraseSeconds") // erase.c )) NSLog(@"warning: no preference \"%s\" [float]", name); @@ -245,7 +249,11 @@ - (int) getIntegerResource: (const char *) name { - return (int) [self getFloatResource:name]; + // Sliders might store float values for integral resources; round them. + float v = [self getFloatResource:name]; + int i = (int) (v + (v < 0 ? -0.5 : 0.5)); // ignore sign or -1 rounds to 0 + // if (i != v) NSLog(@"%s: rounded %.3f to %d", name, v, i); + return i; } diff --git a/OSX/SaverTester.h b/OSX/SaverTester.h new file mode 100644 index 00000000..7226b74e --- /dev/null +++ b/OSX/SaverTester.h @@ -0,0 +1,21 @@ +/* xscreensaver, Copyright (c) 2006-2008 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#import +#import + +@interface SaverTester : NSObject +{ + NSArray *saverNames; + NSArray *windows; +} + +@end diff --git a/OSX/SaverTester.m b/OSX/SaverTester.m new file mode 100644 index 00000000..4ea79aaa --- /dev/null +++ b/OSX/SaverTester.m @@ -0,0 +1,352 @@ +/* xscreensaver, Copyright (c) 2006-2008 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* This is just a test harness, really -- it makes a window with an + XScreenSaverGLView in it and a Preferences button, because I don't want + to have to debug these programs by installing them as screen savers + first! + */ + +#import "SaverTester.h" +#import "XScreenSaverGLView.h" + +@implementation SaverTester + +- (ScreenSaverView *) makeSaverView: (NSString *) module +{ + NSString *dir = [[[NSBundle mainBundle] bundlePath] + stringByDeletingLastPathComponent]; + NSString *name = [module stringByAppendingPathExtension:@"saver"]; + NSString *path = [dir stringByAppendingPathComponent:name]; + NSBundle *bundleToLoad = [NSBundle bundleWithPath:path]; + Class new_class = [bundleToLoad principalClass]; + NSAssert1 (new_class, @"unable to load \"%@\"", path); + + NSRect rect; + rect.origin.x = rect.origin.y = 0; + rect.size.width = 320; + rect.size.height = 240; + + id instance = [[new_class alloc] initWithFrame:rect isPreview:YES]; + NSAssert1 (instance, @"unable to instantiate %@", new_class); + return (ScreenSaverView *) instance; +} + + +static ScreenSaverView * +find_saverView_child (NSView *v) +{ + NSArray *kids = [v subviews]; + int nkids = [kids count]; + int i; + for (i = 0; i < nkids; i++) { + NSObject *kid = [kids objectAtIndex:i]; + if ([kid isKindOfClass:[ScreenSaverView class]]) { + return (ScreenSaverView *) kid; + } else { + ScreenSaverView *sv = find_saverView_child ((NSView *) kid); + if (sv) return sv; + } + } + return 0; +} + + +static ScreenSaverView * +find_saverView (NSView *v) +{ + while (1) { + NSView *p = [v superview]; + if (p) v = p; + else break; + } + return find_saverView_child (v); +} + + +- (void) openPreferences: (NSObject *) button +{ + ScreenSaverView *sv = find_saverView ((NSView *) button); + NSAssert (sv, @"no saver view"); + NSWindow *prefs = [sv configureSheet]; + + [NSApp beginSheet:prefs + modalForWindow:[sv window] + modalDelegate:self + didEndSelector:@selector(preferencesClosed:returnCode:contextInfo:) + contextInfo:nil]; + int code = [NSApp runModalForWindow:prefs]; + + /* Restart the animation if the "OK" button was hit, but not if "Cancel". + We have to restart *both* animations, because the xlockmore-style + ones will blow up if one re-inits but the other doesn't. + */ + if (code != NSCancelButton) { + [sv stopAnimation]; + [sv startAnimation]; + } +} + +- (void) preferencesClosed: (NSWindow *) sheet + returnCode: (int) returnCode + contextInfo: (void *) contextInfo +{ + [NSApp stopModalWithCode:returnCode]; +} + + +- (void)selectedSaverDidChange:(NSDictionary *)change +{ + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + NSString *module = [prefs stringForKey:@"selectedSaverName"]; + int i; + + if (! module) return; + + for (i = 0; i < [windows count]; i++) { + NSView *cv = [[windows objectAtIndex:i] contentView]; + ScreenSaverView *old_view = find_saverView (cv); + NSView *sup = [old_view superview]; + + [old_view stopAnimation]; + [old_view removeFromSuperview]; + + ScreenSaverView *new_view = [self makeSaverView:module]; + [new_view setFrame: [old_view frame]]; + [sup addSubview: new_view]; + [new_view setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; + [new_view startAnimation]; + } + + NSUserDefaultsController *ctl = + [NSUserDefaultsController sharedUserDefaultsController]; + [ctl save:self]; +} + + +- (NSArray *) listSaverBundleNames +{ + NSString *dir = [[[NSBundle mainBundle] bundlePath] + stringByDeletingLastPathComponent]; + NSString *longest = 0; + NSArray *matches = 0; + NSArray *exts = [NSArray arrayWithObjects:@"saver", nil]; + unsigned int n = [dir completePathIntoString: &longest + caseSensitive: NO + matchesIntoArray: &matches + filterTypes: exts]; + if (n <= 0) { + NSLog (@"no .saver bundles found in \"%@/\"!", dir); + exit (1); + } + + int i; + NSMutableArray *result = [NSMutableArray arrayWithCapacity: n+1]; + for (i = 0; i < n; i++) + [result addObject: [[[matches objectAtIndex: i] lastPathComponent] + stringByDeletingPathExtension]]; + return result; +} + + +- (NSPopUpButton *) makeMenu +{ + NSRect rect; + rect.origin.x = rect.origin.y = 0; + rect.size.width = 10; + rect.size.height = 10; + NSPopUpButton *popup = [[NSPopUpButton alloc] initWithFrame:rect + pullsDown:NO]; + int i; + float max_width = 0; + for (i = 0; i < [saverNames count]; i++) { + NSString *name = [saverNames objectAtIndex:i]; + [popup addItemWithTitle:name]; + [[popup itemWithTitle:name] setRepresentedObject:name]; + [popup sizeToFit]; + NSRect r = [popup frame]; + if (r.size.width > max_width) max_width = r.size.width; + } + + // Bind the menu to preferences, and trigger a callback when an item + // is selected. + // + NSString *key = @"values.selectedSaverName"; + NSUserDefaultsController *prefs = + [NSUserDefaultsController sharedUserDefaultsController]; + [prefs addObserver:self + forKeyPath:key + options:nil + context:@selector(selectedSaverDidChange:)]; + [popup bind:@"selectedObject" + toObject:prefs + withKeyPath:key + options:nil]; + [prefs setAppliesImmediately:YES]; + + NSRect r = [popup frame]; + r.size.width = max_width; + [popup setFrame:r]; + return popup; +} + + +/* This is called when the "selectedSaverName" pref changes, e.g., + when a menu selection is made. + */ +- (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(id)object + change:(NSDictionary *)change + context:(void *)context +{ + SEL dispatchSelector = (SEL)context; + if (dispatchSelector != NULL) { + [self performSelector:dispatchSelector withObject:change]; + } else { + [super observeValueForKeyPath:keyPath + ofObject:object + change:change + context:context]; + } +} + + + +- (NSWindow *) makeWindow +{ + NSRect rect; + static int count = 0; + + // make a "Preferences" button + // + rect.origin.x = rect.origin.y = 0; + rect.size.width = rect.size.height = 10; + NSButton *pb = [[NSButton alloc] initWithFrame:rect]; + [pb setTitle:@"Preferences"]; + [pb setBezelStyle:NSRoundedBezelStyle]; + [pb sizeToFit]; + + + NSRect sv_rect = rect; + sv_rect.size.width = 320; + sv_rect.size.height = 240; + ScreenSaverView *sv = [[ScreenSaverView alloc] // dummy placeholder + initWithFrame:sv_rect + isPreview:YES]; + + rect.origin.x = ([sv frame].size.width - + [pb frame].size.width) / 2; + [pb setFrameOrigin:rect.origin]; + + // grab the click + // + [pb setTarget:self]; + [pb setAction:@selector(openPreferences:)]; + + // Make a saver selection menu + // + NSPopUpButton *menu = [self makeMenu]; + rect.origin.x = 2; + rect.origin.y = 2; + [menu setFrameOrigin:rect.origin]; + + // make a box to wrap the saverView + // + rect = [sv frame]; + rect.origin.x = 0; + rect.origin.y = [pb frame].origin.y + [pb frame].size.height; + NSBox *gbox = [[NSBox alloc] initWithFrame:rect]; + rect.size.width = rect.size.height = 10; + [gbox setContentViewMargins:rect.size]; + [gbox setTitlePosition:NSNoTitle]; + [gbox addSubview:sv]; + [gbox sizeToFit]; + + // make a box to wrap the other two boxes + // + rect.origin.x = rect.origin.y = 0; + rect.size.width = [gbox frame].size.width; + rect.size.height = [gbox frame].size.height + [gbox frame].origin.y; + NSBox *pbox = [[NSBox alloc] initWithFrame:rect]; + [pbox setTitlePosition:NSNoTitle]; + [pbox setBorderType:NSNoBorder]; + [pbox addSubview:gbox]; + [pbox addSubview:menu]; + [pbox addSubview:pb]; + [pbox sizeToFit]; + + // and make a window to hold that. + // + NSScreen *screen = [NSScreen mainScreen]; + rect = [pbox frame]; + rect.origin.x = ([screen frame].size.width - rect.size.width) / 2; + rect.origin.y = ([screen frame].size.height - rect.size.height) / 2; + + rect.origin.x += rect.size.width * (count ? 0.55 : -0.55); + + NSWindow *window = [[NSWindow alloc] + initWithContentRect:rect + styleMask:(NSTitledWindowMask | + NSClosableWindowMask | + NSMiniaturizableWindowMask | + NSResizableWindowMask) + backing:NSBackingStoreBuffered + defer:YES + screen:screen]; + [window setTitle:@"XScreenSaver"]; + [window setMinSize:[window frameRectForContentRect:rect].size]; + + [[window contentView] addSubview:pbox]; + + [sv setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; + [pb setAutoresizingMask:NSViewMinXMargin|NSViewMaxXMargin]; + [menu setAutoresizingMask:NSViewMinXMargin|NSViewMaxXMargin]; + [gbox setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; + [pbox setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; + + char buf[100]; + sprintf (buf, "SaverDebugWindow%d", count); + [window setFrameAutosaveName: + [NSString stringWithCString:buf encoding:NSUTF8StringEncoding]]; + [window setFrameUsingName:[window frameAutosaveName]]; + + [window makeKeyAndOrderFront:window]; + + [sv startAnimation]; // this is the dummy saver + + count++; + + return window; +} + + +- (void)applicationDidFinishLaunching: (NSNotification *) notif +{ + saverNames = [[self listSaverBundleNames] retain]; + + int i, n = 2; + NSMutableArray *w = [[NSMutableArray arrayWithCapacity: n+1] retain]; + windows = w; + for (i = 0; i < n; i++) + [w addObject: [self makeWindow]]; + + [self selectedSaverDidChange:nil]; +} + + +/* When the window closes, exit (even if prefs still open.) +*/ +- (BOOL) applicationShouldTerminateAfterLastWindowClosed: (NSApplication *) n +{ + return YES; +} + +@end diff --git a/OSX/SaverTester.plist b/OSX/SaverTester.plist index 3a29f28b..8cddccac 100644 --- a/OSX/SaverTester.plist +++ b/OSX/SaverTester.plist @@ -1,11 +1,13 @@ - + CFBundleDevelopmentRegion English CFBundleExecutable ${EXECUTABLE_NAME} + CFBundleIconFile + XScreenSaver CFBundleIdentifier org.jwz.xscreensaver.${EXECUTABLE_NAME} CFBundleInfoDictionaryVersion @@ -15,15 +17,15 @@ CFBundlePackageType APPL CFBundleShortVersionString - 5.06 + 5.07 CFBundleSignature ???? CFBundleVersion - 5.06 + 5.07 LSMinimumSystemVersion 10.4.0 NSMainNibFile - MainMenu + SaverTester NSPrincipalClass NSApplication diff --git a/OSX/XScreenSaver.plist b/OSX/XScreenSaver.plist index cf398f13..3d0c849a 100644 --- a/OSX/XScreenSaver.plist +++ b/OSX/XScreenSaver.plist @@ -1,5 +1,5 @@ - + CFBundleDevelopmentRegion @@ -15,15 +15,15 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 5.06 + 5.07 CFBundleSignature ???? CFBundleVersion - 5.06 + 5.07 LSMinimumSystemVersion 10.4.0 NSMainNibFile - MainMenu + SaverTester NSPrincipalClass XScreenSaver${EXECUTABLE_NAME}View diff --git a/OSX/XScreenSaverConfigSheet.m b/OSX/XScreenSaverConfigSheet.m index 9601eac4..06804c70 100644 --- a/OSX/XScreenSaverConfigSheet.m +++ b/OSX/XScreenSaverConfigSheet.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2008 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 @@ -606,12 +606,21 @@ make_number_selector (NSUserDefaultsController *prefs, label); } + // If either the min or max field contains a decimal point, then this + // option may have a floating point value; otherwise, it is constrained + // to be an integer. + // + NSCharacterSet *dot = + [NSCharacterSet characterSetWithCharactersInString:@"."]; + BOOL float_p = ([low rangeOfCharacterFromSet:dot].location != NSNotFound || + [high rangeOfCharacterFromSet:dot].location != NSNotFound); + if ([type isEqualToString:@"slider"]) { NSRect rect; rect.origin.x = rect.origin.y = 0; rect.size.width = 150; - rect.size.height = 20; + rect.size.height = 23; // apparent min height for slider with ticks... NSSlider *slider; if (cvt) slider = [[InvertedSlider alloc] initWithFrame:rect]; @@ -621,6 +630,31 @@ make_number_selector (NSUserDefaultsController *prefs, [slider setMaxValue:[high doubleValue]]; [slider setMinValue:[low doubleValue]]; + int range = [slider maxValue] - [slider minValue] + 1; + int range2 = range; + int max_ticks = 21; + while (range2 > max_ticks) + range2 /= 10; + + // If we have elided ticks, leave it at the max number of ticks. + if (range != range2 && range2 < max_ticks) + range2 = max_ticks; + + // If it's a float, always display the max number of ticks. + if (float_p && range2 < max_ticks) + range2 = max_ticks; + + [slider setNumberOfTickMarks:range2]; + + [slider setAllowsTickMarkValuesOnly: + (range == range2 && // we are showing the actual number of ticks + !float_p)]; // and we want integer results + + // #### Note: when the slider's range is large enough that we aren't + // showing all possible ticks, the slider's value is not constrained + // to be an integer, even though it should be... + // Maybe we need to use a value converter or something? + if (label) { NSTextField *lab = make_label (label); place_child (parent, lab, NO); @@ -711,8 +745,8 @@ make_number_selector (NSUserDefaultsController *prefs, [step sizeToFit]; place_child (parent, step, YES); rect = [step frame]; - rect.size.height = [txt frame].size.height; rect.origin.x -= COLUMN_SPACING; // this one goes close + rect.origin.y += ([txt frame].size.height - rect.size.height) / 2; [step setFrame:rect]; [step setMinValue:[low doubleValue]]; @@ -728,6 +762,18 @@ make_number_selector (NSUserDefaultsController *prefs, else [step setIncrement:1.0]; + NSNumberFormatter *fmt = [[[NSNumberFormatter alloc] init] autorelease]; + [fmt setFormatterBehavior:NSNumberFormatterBehavior10_4]; + [fmt setNumberStyle:NSNumberFormatterDecimalStyle]; + [fmt setMinimum:[NSNumber numberWithDouble:[low doubleValue]]]; + [fmt setMaximum:[NSNumber numberWithDouble:[high doubleValue]]]; + [fmt setMinimumFractionDigits: (float_p ? 1 : 0)]; + [fmt setMaximumFractionDigits: (float_p ? 2 : 0)]; + + [fmt setGeneratesDecimalNumbers:float_p]; + [[txt cell] setFormatter:fmt]; + + bind_switch_to_preferences (prefs, step, arg, opts); bind_switch_to_preferences (prefs, txt, arg, opts); @@ -997,6 +1043,45 @@ unwrap (NSString *text) } +static char * +anchorize (const char *url) +{ + const char *wiki = "http://en.wikipedia.org/wiki/"; + if (!strncmp (wiki, url, strlen(wiki))) { + char *anchor = (char *) malloc (strlen(url) * 3 + 10); + strcpy (anchor, "Wikipedia: \""); + const char *in = url + strlen(wiki); + char *out = anchor + strlen(anchor); + while (*in) { + if (*in == '_') { + *out++ = ' '; + } else if (*in == '#') { + *out++ = ':'; + *out++ = ' '; + } else if (*in == '%') { + char hex[3]; + hex[0] = in[1]; + hex[1] = in[2]; + hex[2] = 0; + int n = 0; + sscanf (hex, "%x", &n); + *out++ = (char) n; + in += 2; + } else { + *out++ = *in; + } + in++; + } + *out++ = '"'; + *out = 0; + return anchor; + + } else { + return strdup (url); + } +} + + /* Converts any http: URLs in the given text field to clickable links. */ static void @@ -1040,15 +1125,24 @@ hreffify (NSText *nstext) NSString *nsurl = [text substringWithRange:r2]; const char *url = [nsurl UTF8String]; - // Construct the RTF corresponding to url + // If this is a Wikipedia URL, make the linked text be prettier. + // + char *anchor = anchorize(url); + + // Construct the RTF corresponding to anchor // const char *fmt = "{\\field{\\*\\fldinst{HYPERLINK \"%s\"}}%s}"; - char *rtf = malloc (strlen (fmt) + (strlen (url) * 2) + 10); - sprintf (rtf, fmt, url, url); + char *rtf = malloc (strlen (fmt) + strlen(url) + strlen(anchor) + 10); + sprintf (rtf, fmt, url, anchor); + free (anchor); NSData *rtfdata = [NSData dataWithBytesNoCopy:rtf length:strlen(rtf)]; // Insert the RTF into the NSText. [nstext replaceCharactersInRange:r2 withRTF:rtfdata]; + + int L2 = [text length]; // might have changed + start.location -= (L - L2); + L = L2; } } @@ -1147,7 +1241,7 @@ make_text_controls (NSUserDefaultsController *prefs, { /* Display Text: - (x) Computer Name and Time + (x) Computer name and time ( ) Text [__________________________] ( ) Text file [_________________] [Choose] ( ) URL [__________________________] @@ -1183,7 +1277,7 @@ make_text_controls (NSUserDefaultsController *prefs, [matrix setAllowsEmptySelection:NO]; NSArrayController *cnames = [[NSArrayController alloc] initWithContent:nil]; - [cnames addObject:@"Computer Name and Time"]; + [cnames addObject:@"Computer name and time"]; [cnames addObject:@"Text"]; [cnames addObject:@"File"]; [cnames addObject:@"URL"]; @@ -1301,13 +1395,13 @@ make_image_controls (NSUserDefaultsController *prefs, NSView *parent, NSXMLNode *node) { /* - [x] Grab Desktop Images - [ ] Choose Random Image: + [x] Grab desktop images + [ ] Choose random image: [__________________________] [Choose] - - */ @@ -1318,7 +1412,7 @@ make_image_controls (NSUserDefaultsController *prefs, [node2 setAttributesAsDictionary: [NSDictionary dictionaryWithObjectsAndKeys: @"grabDesktopImages", @"id", - @"Grab Desktop Images", @"_label", + @"Grab desktop images", @"_label", @"-no-grab-desktop", @"arg-unset", nil]]; make_checkbox (prefs, opts, parent, node2); @@ -1328,7 +1422,7 @@ make_image_controls (NSUserDefaultsController *prefs, [node2 setAttributesAsDictionary: [NSDictionary dictionaryWithObjectsAndKeys: @"chooseRandomImages", @"id", - @"Choose Random Images", @"_label", + @"Choose random images", @"_label", @"-choose-random-images", @"arg-set", nil]]; make_checkbox (prefs, opts, parent, node2); @@ -1338,7 +1432,7 @@ make_image_controls (NSUserDefaultsController *prefs, [node2 setAttributesAsDictionary: [NSDictionary dictionaryWithObjectsAndKeys: @"imageDirectory", @"id", - @"Images Directory:", @"_label", + @"Images directory:", @"_label", @"-image-directory %", @"arg", nil]]; make_file_selector (prefs, opts, parent, node2, YES, NO); @@ -1654,9 +1748,16 @@ wrap_with_buttons (NSWindow *window, NSView *panel) [pbox setTitlePosition:NSNoTitle]; [pbox setBorderType:NSBezelBorder]; + // Enforce a max height on the dialog, so that it's obvious to me + // (on a big screen) when the dialog will fall off the bottom of + // a small screen (e.g., 1024x768 laptop with a huge bottom dock). { NSRect f = [panel frame]; - int screen_height = 800 - 64; + int screen_height = (768 // shortest "modern" Mac display + - 22 // menu bar + - 56 // System Preferences toolbar + - 140 // default magnified bottom dock icon + ); if (f.size.height > screen_height) { NSLog(@"%@ height was %.0f; clipping to %d", [panel class], f.size.height, screen_height); diff --git a/OSX/XScreenSaverGLView.m b/OSX/XScreenSaverGLView.m index 265654a1..b7ac9c1e 100644 --- a/OSX/XScreenSaverGLView.m +++ b/OSX/XScreenSaverGLView.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006, 2007 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2008 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 diff --git a/OSX/XScreenSaverView.h b/OSX/XScreenSaverView.h index 5fe08959..a201786c 100644 --- a/OSX/XScreenSaverView.h +++ b/OSX/XScreenSaverView.h @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2008 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 @@ -34,6 +34,7 @@ Display *xdpy; Window xwindow; void *xdata; + fps_state *fpst; } - (void) prepareContext; diff --git a/OSX/XScreenSaverView.m b/OSX/XScreenSaverView.m index 2baf2c69..932e7db7 100644 --- a/OSX/XScreenSaverView.m +++ b/OSX/XScreenSaverView.m @@ -126,9 +126,12 @@ add_default_options (const XrmOptionDescRec *opts, { "-choose-random-images", ".chooseRandomImages",XrmoptionNoArg, "True" }, { "-no-choose-random-images",".chooseRandomImages",XrmoptionNoArg, "False"}, { "-image-directory", ".imageDirectory", XrmoptionSepArg, 0 }, + { "-fps", ".doFPS", XrmoptionNoArg, "True" }, + { "-no-fps", ".doFPS", XrmoptionNoArg, "False"}, { 0, 0, 0, 0 } }; static const char *default_defaults [] = { + ".doFPS: False", ".textMode: date", // ".textLiteral: ", // ".textFile: ", @@ -262,6 +265,13 @@ add_default_options (const XrmOptionDescRec *opts, [self lockFocus]; // in case something tries to draw from here [self prepareContext]; + + /* I considered just not even calling the free callback at all... + But webcollage-cocoa needs it, to kill the inferior webcollage + processes (since the screen saver framework never generates a + SIGPIPE for them...) Instead, I turned off the free call in + xlockmore.c, which is where all of the bogus calls are anyway. + */ xsft->free_cb (xdpy, xwindow, xdata); [self unlockFocus]; @@ -286,6 +296,15 @@ add_default_options (const XrmOptionDescRec *opts, { } + +static void +screenhack_do_fps (Display *dpy, Window w, fps_state *fpst, void *closure) +{ + fps_compute (fpst, 0); + fps_draw (fpst); +} + + - (void) animateOneFrame { if (!initted_p) { @@ -333,6 +352,11 @@ add_default_options (const XrmOptionDescRec *opts, (void *(*) (Display *, Window, void *)) xsft->init_cb; xdata = init_cb (xdpy, xwindow, xsft->setup_arg); + + if (get_boolean_resource (xdpy, "doFPS", "DoFPS")) { + fpst = fps_init (xdpy, xwindow); + if (! xsft->fps_cb) xsft->fps_cb = screenhack_do_fps; + } } /* I don't understand why we have to do this *every frame*, but we do, @@ -341,6 +365,18 @@ add_default_options (const XrmOptionDescRec *opts, if (![self isPreview]) [NSCursor setHiddenUntilMouseMoves:YES]; + + if (fpst) + { + /* This is just a guess, but the -fps code wants to know how long + we were sleeping between frames. + */ + unsigned long usecs = 1000000 * [self animationTimeInterval]; + usecs -= 200; // caller apparently sleeps for slightly less sometimes... + fps_slept (fpst, usecs); + } + + /* It turns out that [ScreenSaverView setAnimationTimeInterval] does nothing. This is bad, because some of the screen hacks want to delay for long periods (like 5 seconds or a minute!) between frames, and running them @@ -386,6 +422,7 @@ add_default_options (const XrmOptionDescRec *opts, // NSDisableScreenUpdates(); unsigned long delay = xsft->draw_cb (xdpy, xwindow, xdata); + if (fpst) xsft->fps_cb (xdpy, xwindow, fpst, xdata); XSync (xdpy, 0); NSEnableScreenUpdates(); @@ -517,7 +554,7 @@ add_default_options (const XrmOptionDescRec *opts, case KeyRelease: { NSString *nss = [e characters]; - const char *s = [nss cStringUsingEncoding:NSUTF8StringEncoding]; + const char *s = [nss cStringUsingEncoding:NSISOLatin1StringEncoding]; xe.xkey.keycode = (s && *s ? *s : 0); xe.xkey.state = state; break; diff --git a/OSX/bindist.rtf b/OSX/bindist.rtf index dc18b3ea..fbfe64d4 100644 --- a/OSX/bindist.rtf +++ b/OSX/bindist.rtf @@ -15,7 +15,7 @@ XScreenSaver \f1\b0 \ by Jamie Zawinski \uc0\u8232 and many others\ \ -version 5.06 \uc0\u8232 16-Jul-2008\ +version 5.07 \uc0\u8232 10-Aug-2008\ \ {\field{\*\fldinst{HYPERLINK "http://www.jwz.org/xscreensaver/"}}{\fldrslt \cf2 \ul \ulc2 http://www.jwz.org/xscreensaver/}}\ \pard\pardeftab720\li720 @@ -38,6 +38,8 @@ If you want to install all of them, then drag all of the .saver files to the "Sc \cf0 \ Open the "Screen Savers" folder in your "Library" folder, and drag any unwanted savers into the trash.\ \ +If you've previously installed screen savers for "all users" instead of "current user", they might be in "/Library/Screen Savers/" or "/System/Library/Screen Savers/" instead.\ +\ \pard\pardeftab720 \f0\b \cf0 For More Information:\ diff --git a/OSX/jwxyz.m b/OSX/jwxyz.m index 55913380..c1984c93 100644 --- a/OSX/jwxyz.m +++ b/OSX/jwxyz.m @@ -1479,6 +1479,13 @@ XPutImage (Display *dpy, Drawable d, GC gc, XImage *ximage, { CGRect wr = d->frame; + Assert ((w < 65535), "improbably large width"); + Assert ((h < 65535), "improbably large height"); + Assert ((src_x < 65535 && src_x > -65535), "improbably large src_x"); + Assert ((src_y < 65535 && src_y > -65535), "improbably large src_y"); + Assert ((dest_x < 65535 && dest_x > -65535), "improbably large dest_x"); + Assert ((dest_y < 65535 && dest_y > -65535), "improbably large dest_y"); + // Clip width and height to the bounds of the Drawable // if (dest_x + w > wr.size.width) { @@ -1608,6 +1615,11 @@ XGetImage (Display *dpy, Drawable d, int x, int y, int depth, ibpp, ibpl; NSBitmapImageRep *bm = 0; + Assert ((width < 65535), "improbably large width"); + Assert ((height < 65535), "improbably large height"); + Assert ((x < 65535 && x > -65535), "improbably large x"); + Assert ((y < 65535 && y > -65535), "improbably large y"); + if (d->type == PIXMAP) { depth = d->pixmap.depth; ibpp = CGBitmapContextGetBitsPerPixel (d->cgc); @@ -1628,10 +1640,11 @@ XGetImage (Display *dpy, Drawable d, int x, int y, ibpl = [bm bytesPerRow]; data = [bm bitmapData]; Assert (data, "NSBitmapImageRep initWithFocusedViewRect failed"); - - data += (y * ibpl) + (x * (ibpp/8)); } + // data points at (x,y) with ibpl rowstride. ignore x,y from now on. + data += (y * ibpl) + (x * (ibpp/8)); + format = (depth == 1 ? XYPixmap : ZPixmap); XImage *image = XCreateImage (dpy, 0, depth, format, 0, 0, width, height, 0, 0); @@ -1646,10 +1659,10 @@ XGetImage (Display *dpy, Drawable d, int x, int y, int xx, yy; if (depth == 1) { const unsigned char *iline = data; - for (yy = y; yy < y+height; yy++) { + for (yy = 0; yy < height; yy++) { const unsigned char *iline2 = iline; - for (xx = x; xx < x+width; xx++) { + for (xx = 0; xx < width; xx++) { iline2++; // ignore b or a iline2++; // ignore g or r @@ -1664,12 +1677,11 @@ XGetImage (Display *dpy, Drawable d, int x, int y, Assert (ibpp == 24 || ibpp == 32, "weird obpp"); const unsigned char *iline = data; unsigned char *oline = (unsigned char *) image->data; - oline += (y * obpl); - for (yy = y; yy < y+height; yy++) { + for (yy = 0; yy < height; yy++) { const unsigned char *iline2 = iline; unsigned char *oline2 = oline; - for (xx = x; xx < x+width; xx++) { + for (xx = 0; xx < width; xx++) { unsigned char a = (ibpp == 32 ? (*iline2++) : 0xFF); unsigned char r = *iline2++; @@ -1681,7 +1693,7 @@ XGetImage (Display *dpy, Drawable d, int x, int y, (b << 0)); *((unsigned int *) oline2) = pixel; oline2 += 4; - } + } oline += obpl; iline += ibpl; } @@ -2014,23 +2026,44 @@ try_font (BOOL fixed, BOOL bold, BOOL ital, BOOL serif, float size, char **name_ret) { Assert (size > 0, "zero font size"); - const char *prefix = (fixed ? "Monaco" : (serif ? "Times" : "Helvetica")); - const char *suffix = (bold && ital - ? (serif ? "-BoldItalic" : "-BoldOblique") - : (bold ? "-Bold" : - ital ? (serif ? "-Italic" : "-Oblique") : "")); - char *name = (char *) malloc (strlen(prefix) + strlen(suffix) + 1); - strcpy (name, prefix); - strcat (name, suffix); + const char *name; + + if (fixed) { + // + // "Monaco" only exists in plain. + // "LucidaSansTypewriterStd" gets an AGL bad value error. + // + if (bold && ital) name = "Courier-BoldOblique"; + else if (bold) name = "Courier-Bold"; + else if (ital) name = "Courier-Oblique"; + else name = "Courier"; + + } else if (serif) { + // + // "Georgia" looks better than "Times". + // + if (bold && ital) name = "Georgia-BoldItalic"; + else if (bold) name = "Georgia-Bold"; + else if (ital) name = "Georgia-Italic"; + else name = "Georgia"; + + } else { + // + // "Geneva" only exists in plain. + // "LucidaSansStd-BoldItalic" gets an AGL bad value error. + // "Verdana" renders smoother than "Helvetica" for some reason. + // + if (bold && ital) name = "Verdana-BoldItalic"; + else if (bold) name = "Verdana-Bold"; + else if (ital) name = "Verdana-Italic"; + else name = "Verdana"; + } NSString *nsname = [NSString stringWithCString:name encoding:NSUTF8StringEncoding]; NSFont *f = [NSFont fontWithName:nsname size:size]; - if (f) { - *name_ret = name; - } else { - free (name); - } + if (f) + *name_ret = strdup(name); return f; } @@ -2065,8 +2098,8 @@ try_native_font (const char *name, char **name_ret, float *size_ret) static NSFont * random_font (BOOL bold, BOOL ital, float size, char **name_ret) { - NSFontTraitMask mask = ((bold ? NSUnboldFontMask : NSBoldFontMask) | - (ital ? NSUnitalicFontMask : NSItalicFontMask)); + NSFontTraitMask mask = ((bold ? NSBoldFontMask : NSUnboldFontMask) | + (ital ? NSItalicFontMask : NSUnitalicFontMask)); NSArray *fonts = [[NSFontManager sharedFontManager] availableFontNamesWithTraits:mask]; if (!fonts) return 0; diff --git a/OSX/update-info-plist.pl b/OSX/update-info-plist.pl index 16a2bed0..aac1f48c 100755 --- a/OSX/update-info-plist.pl +++ b/OSX/update-info-plist.pl @@ -23,7 +23,7 @@ require 5; use strict; my $progname = $0; $progname =~ s@.*/@@g; -my $version = q{ $Revision: 1.7 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; +my $version = q{ $Revision: 1.9 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; my $verbose = 1; @@ -113,17 +113,15 @@ sub update_saver_xml($$) { } } - my $cc = "\302\251"; # unicode "©" - - my $desc1 = ("$name, version $vers.\n\n" . + my $desc1 = ("$name, version $vers.\n\n" . # savername.xml $desc . "\n" . "\n" . - "From the XScreenSaver collection:\n" . + "From the XScreenSaver collection: " . "http://www.jwz.org/xscreensaver/\n" . "Copyright \251 $year by $authors.\n"); - my $desc2 = ("$name $vers,\n" . - "$cc $year $authors.\n" . + my $desc2 = ("$name $vers,\n" . # Info.plist + "\302\251 $year $authors.\n" . "From the XScreenSaver collection:\n" . "http://www.jwz.org/xscreensaver/\n" . "\n" . @@ -216,6 +214,11 @@ sub update($) { my $copyright = "$1"; $copyright =~ s/\b\d{4}-(\d{4})\b/$1/; + # Lose the Wikipedia URLs. + $info_str =~ s@http:.*\bwikipedia\b[^\s]+[ \t]*\n?@@gm; + + $info_str =~ s/(\n\n)\n+/$1/gs; + $info_str =~ s/(^\s+|\s+$)//gs; $plist = set_plist_key ($filename, $plist, "NSHumanReadableCopyright", $copyright); $plist = set_plist_key ($filename, $plist, diff --git a/README b/README index 5a016924..f0bc5f86 100644 --- a/README +++ b/README @@ -38,6 +38,23 @@ XScreenSaver has an extensive manual -- please read it! =============================================================================== +Changes since 5.06: * Xinerama/RANDR tweaks for old-style multi-screen. + * Fixed the bouncing ball in `stairs'. + * `flipflop' can load images onto the tiles. + * Improved layout of the preferences dialogs: they + should all now be usable even on ridiculously tiny + laptop screens. + * MacOS preferences text fields now prevent you from + entering numbers that are out of range. + * Added "Reset to Defaults" button on X11. + * Added relevant Wikipedia links to many of the screen + saver descriptions. + * All hacks support the `-fps' option, not just GL ones. + * The `-fps' option now shows CPU load. + * Added bumpy skin and cel shading to `skytentacles'. + * Added the missing Utah Teapotahedron to `polyhedra'. + * `blitspin' works with color images on OSX now. + * Added transparency to `stonerview'. Changes since 5.05: * Xinerama/RANDR fixes: this time for sure. It should now work to add/remove monitors or resize screens at any time. diff --git a/README.hacking b/README.hacking index 4e5170e4..72489a2d 100644 --- a/README.hacking +++ b/README.hacking @@ -98,7 +98,7 @@ The XLockMore API hacks like "Flag". The XLockMore ones are the ones that begin with "#ifdef STANDALONE" and #include "xlockmore.h". - All of the OpenGL screen savers follow the XLockMore API. + But, all OpenGL screen savers have to follow the XLockMore API. The XLockMore API is similar to the XScreenSaver API, in that you define (roughly) the same set of functions, but the naming conventions are diff --git a/configure b/configure index a6e9a4c3..4e352b60 100755 --- a/configure +++ b/configure @@ -20218,16 +20218,16 @@ if test "$have_gl" = yes; then GL_EXES='$(GL_EXES)' GL_UTIL_EXES='$(GL_UTIL_EXES)' GL_MEN='$(GL_MEN)' - GL_KLUDGE="${tab} " + GL_KLUDGE=" " else - GL_KLUDGE="-${tab} " + GL_KLUDGE="-" fi if test "$have_gle" = yes; then GLE_EXES='$(GLE_EXES)' - GLE_KLUDGE="${tab} " + GLE_KLUDGE=" " else - GLE_KLUDGE="-${tab} " + GLE_KLUDGE="-" fi if test "$have_jpeg" = yes -a "$have_gdk_pixbuf" = yes; then diff --git a/configure.in b/configure.in index ee131deb..c486f2a1 100644 --- a/configure.in +++ b/configure.in @@ -3592,16 +3592,16 @@ if test "$have_gl" = yes; then GL_EXES='$(GL_EXES)' GL_UTIL_EXES='$(GL_UTIL_EXES)' GL_MEN='$(GL_MEN)' - GL_KLUDGE="${tab} " + GL_KLUDGE=" " else - GL_KLUDGE="-${tab} " + GL_KLUDGE="-" fi if test "$have_gle" = yes; then GLE_EXES='$(GLE_EXES)' - GLE_KLUDGE="${tab} " + GLE_KLUDGE=" " else - GLE_KLUDGE="-${tab} " + GLE_KLUDGE="-" fi if test "$have_jpeg" = yes -a "$have_gdk_pixbuf" = yes; then diff --git a/driver/Makefile.in b/driver/Makefile.in index 13504008..746dd1a8 100644 --- a/driver/Makefile.in +++ b/driver/Makefile.in @@ -432,8 +432,8 @@ install-pam: $(INSTALL_DATA) $$src $$dir/$$dest ; \ else \ src="xscreensaver.pam.$$$$" ; \ - echo "grep '^#%\|^auth' $$src2 > $$src" ; \ - grep '^#%\|^auth' $$src2 > $$src ; \ + echo "grep '^#%\|^auth\|^@include' $$src2 > $$src" ; \ + grep '^#%\|^auth\|^@include' $$src2 > $$src ; \ echo $(INSTALL_DATA) $$src $$dir/$$dest ; \ $(INSTALL_DATA) $$src $$dir/$$dest ; \ echo rm -f $$src ; \ diff --git a/driver/XScreenSaver.ad.in b/driver/XScreenSaver.ad.in index a6d59545..43bb50f8 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.06 -! 16-Jul-2008 +! version 5.07 +! 10-Aug-2008 ! ! See "man xscreensaver" for more info. The latest version is always ! available at http://www.jwz.org/xscreensaver/ @@ -150,273 +150,221 @@ GetViewPortIsFullOfLies: False ! screen savers interactively. ! *programs: \ - "Qix (solid)" qix -root -solid -segments 100 \n\ - "Qix (transparent)" qix -root -count 4 -solid -transparent \n\ - "Qix (linear)" qix -root -count 5 -solid -transparent \ - -linear -segments 250 -size 100 \n\ - \ - "Attraction (balls)" attraction -root -mode balls \n\ - "Attraction (lines)" attraction -root -mode lines -points 3 \ - -segments 200 \n\ -- "Attraction (splines)" attraction -root -mode splines -segments \ - 300 \n\ -- "Attraction (orbital)" attraction -root -mode lines -radius 300 \ - -orbit -vmult 0.5 \n\ - \ - pyro -root \n\ - rocks -root \n\ +- sphere -root \n\ +@GL_KLUDGE@ GL: superquadrics -root \n\ +- worm -root \n\ + attraction -root \n\ + blitspin -root \n\ + greynetic -root \n\ helix -root \n\ - pedal -root \n\ - rorschach -root \n\ hopalong -root \n\ - greynetic -root \n\ - imsmap -root \n\ - slidescreen -root \n\ - decayscreen -root \n\ - jigsaw -root \n\ - blitspin -root \n\ - slip -root \n\ - distort -root \n\ - spotlight -root \n\ - "Ripples (stir)" ripples -root -oily -light 2 -stir \n\ - "Ripples (desktop)" ripples -root -water -light 6 \n\ hypercube -root \n\ -- hyperball -root \n\ - halo -root \n\ + imsmap -root \n\ maze -root \n\ noseguy -root \n\ + pyro -root \n\ + qix -root \n\ + rocks -root \n\ + rorschach -root \n\ + decayscreen -root \n\ flame -root \n\ + halo -root \n\ + slidescreen -root \n\ - lmorph -root \n\ + pedal -root \n\ + bubbles -root \n\ + bouboule -root \n\ + braid -root \n\ + coral -root \n\ deco -root \n\ - moire -root \n\ - moire2 -root \n\ - lightning -root \n\ - strange -root \n\ -- spiral -root \n\ - laser -root \n\ - grav -root \n\ drift -root \n\ - ifs -root \n\ - julia -root \n\ - penrose -root \n\ -- sierpinski -root \n\ - braid -root \n\ - galaxy -root \n\ - bouboule -root \n\ - swirl -root \n\ + fadeplot -root \n\ flag -root \n\ - sphere -root \n\ forest -root \n\ + galaxy -root \n\ + goop -root \n\ + grav -root \n\ + ifs -root \n\ + julia -root \n\ + kaleidescope -root \n\ +- laser -root \n\ +- lightning -root \n\ - lisa -root \n\ - lissie -root \n\ - goop -root \n\ - starfish -root \n\ - munch -root \n\ - mismunch -root \n\ - fadeplot -root \n\ - coral -root \n\ +@GL_KLUDGE@ GL: moebius -root \n\ + moire -root \n\ +@GL_KLUDGE@ GL: morph3d -root \n\ mountain -root \n\ - triangle -root \n\ -- worm -root \n\ + munch -root \n\ + penrose -root \n\ +@GL_KLUDGE@ GL: pipes -root \n\ + rd-bomb -root \n\ - rotor -root \n\ -- demon -root \n\ -- loop -root \n\ +@GL_KLUDGE@ GL: rubik -root \n\ +- sierpinski -root \n\ + slip -root \n\ +- spiral -root \n\ +@GL_KLUDGE@ GL: sproingies -root \n\ + starfish -root \n\ + strange -root \n\ + swirl -root \n\ + triangle -root \n\ - vines -root \n\ - kaleidescope -root \n\ xjack -root \n\ xlyap -root \n\ - cynosure -root \n\ - flow -root \n\ - epicycle -root \n\ - interference -root \n\ - truchet -root \n\ +@GL_KLUDGE@ GL: atlantis -root \n\ bsod -root \n\ +@GL_KLUDGE@ GL: bubble3d -root \n\ +@GL_KLUDGE@ GL: cage -root \n\ crystal -root \n\ + cynosure -root \n\ discrete -root \n\ + distort -root \n\ + epicycle -root \n\ + flow -root \n\ +@GL_KLUDGE@ GL: glplanet -root \n\ + interference -root \n\ + jigsaw -root \n\ kumppa -root \n\ - rd-bomb -root \n\ - "RD-Bomb (mobile)" rd-bomb -root -speed 1 -size 0.1 \n\ +@GL_KLUDGE@ GL: lament -root \n\ + moire2 -root \n\ sonar -root \n\ - t3d -root \n\ - penetrate -root \n\ - deluxe -root \n\ +@GL_KLUDGE@ GL: stairs -root \n\ + truchet -root \n\ +- vidwhacker -root \n\ + blaster -root \n\ + bumps -root \n\ + ccurve -root \n\ compass -root \n\ - squiral -root \n\ - xflame -root \n\ - wander -root \n\ - "Wander (spots)" wander -root -advance 0 -size 10 -circles \ - -length 10000 -reset 100000 \n\ - critical -root \n\ - phosphor -root \n\ - xmatrix -root \n\ + deluxe -root \n\ +- demon -root \n\ +@GLE_KLUDGE@ GL: extrusion -root \n\ +- loop -root \n\ + penetrate -root \n\ petri -root \n\ - "Petri 2" petri -root -minlifespeed 0.02 \ - -maxlifespeed 0.03 -minlifespan 1 \ - -maxlifespan 1 -instantdeathchan 0 \ - -minorchan 0 -anychan 0.3 \n\ + phosphor -root \n\ +@GL_KLUDGE@ GL: pulsar -root \n\ + ripples -root \n\ shadebobs -root \n\ - ccurve -root \n\ - blaster -root \n\ - bumps -root \n\ - xanalogtv -root \n\ - xspirograph -root \n\ +@GL_KLUDGE@ GL: sierpinski3d -root \n\ + spotlight -root \n\ + squiral -root \n\ + t3d -root \n\ + wander -root \n\ +- webcollage -root \n\ + xflame -root \n\ + xmatrix -root \n\ +@GL_KLUDGE@ GL: gflux -root \n\ +- hyperball -root \n\ nerverot -root \n\ xrayswarm -root \n\ -- "Zoom (Fatbits)" zoom -root \n\ - "Zoom (Lenses)" zoom -root -lenses \n\ + xspirograph -root \n\ +@GL_KLUDGE@ GL: circuit -root \n\ +@GL_KLUDGE@ GL: dangerball -root \n\ +- GL: dnalogo -root \n\ +@GL_KLUDGE@ GL: engine -root \n\ +@GL_KLUDGE@ GL: flipscreen3d -root \n\ +@GL_KLUDGE@ GL: gltext -root \n\ +@GL_KLUDGE@ GL: menger -root \n\ +@GL_KLUDGE@ GL: molecule -root \n\ rotzoomer -root \n\ + speedmine -root \n\ +@GL_KLUDGE@ GL: starwars -root \n\ +@GL_KLUDGE@ GL: stonerview -root \n\ + vermiculate -root \n\ whirlwindwarp -root \n\ - whirlygig -root \n\ - speedmine -root \n\ - "SpeedWorm" speedmine -root -worm \n\ - vermiculate -root \n\ - twang -root \n\ - apollonian -root \n\ - euler2d -root \n\ - "Euler2d (dense)" euler2d -root -count 4000 -eulertail 400 \ - -ncolors 230 \n\ -- juggle -root \n\ - polyominoes -root \n\ -- thornbird -root \n\ - fluidballs -root \n\ - anemone -root \n\ - halftone -root \n\ - metaballs -root \n\ - eruption -root \n\ - popsquares -root \n\ - barcode -root \n\ - piecewise -root \n\ - cloudlife -root \n\ - fontglide -root \n\ + whirlygig -root \n\ + zoom -root \n\ + anemone -root \n\ + apollonian -root \n\ +@GL_KLUDGE@ GL: boxed -root \n\ +@GL_KLUDGE@ GL: cubenetic -root \n\ +@GL_KLUDGE@ GL: endgame -root \n\ + euler2d -root \n\ + fluidballs -root \n\ +@GL_KLUDGE@ GL: flurry -root \n\ +- GL: glblur -root \n\ +- GL: glforestfire -root \n\ +@GL_KLUDGE@ GL: glsnake -root \n\ + halftone -root \n\ +- juggle -root \n\ +@GL_KLUDGE@ GL: lavalite -root \n\ + polyominoes -root \n\ +@GL_KLUDGE@ GL: queens -root \n\ +- GL: sballs -root \n\ +@GL_KLUDGE@ GL: spheremonics -root \n\ +- thornbird -root \n\ + twang -root \n\ +@GL_KLUDGE@ GL: antspotlight -root \n\ apple2 -root \n\ - bubbles -root \n\ +@GL_KLUDGE@ GL: atunnel -root \n\ + barcode -root \n\ +@GL_KLUDGE@ GL: blinkbox -root \n\ +@GL_KLUDGE@ GL: blocktube -root \n\ +@GL_KLUDGE@ GL: bouncingcow -root \n\ + cloudlife -root \n\ +@GL_KLUDGE@ GL: cubestorm -root \n\ + eruption -root \n\ +@GL_KLUDGE@ GL: flipflop -root \n\ +@GL_KLUDGE@ GL: flyingtoasters -root \n\ + fontglide -root \n\ +@GL_KLUDGE@ GL: gleidescope -root \n\ +@GL_KLUDGE@ GL: glknots -root \n\ +@GL_KLUDGE@ GL: glmatrix -root \n\ +- GL: glslideshow -root \n\ +@GL_KLUDGE@ GL: hypertorus -root \n\ +@GL_KLUDGE@ GL: jigglypuff -root \n\ +@GL_KLUDGE@ GL: klein -root \n\ + metaballs -root \n\ +@GL_KLUDGE@ GL: mirrorblob -root \n\ + piecewise -root \n\ +@GL_KLUDGE@ GL: polytopes -root \n\ pong -root \n\ - wormhole -root \n\ - pacman -root \n\ - fuzzyflakes -root \n\ + popsquares -root \n\ + xanalogtv -root \n\ +- abstractile -root \n\ anemotaxis -root \n\ +- GL: antinspect -root \n\ + fireworkx -root \n\ + fuzzyflakes -root \n\ + interaggregate -root \n\ + intermomentary -root \n\ memscroller -root \n\ + mismunch -root \n\ +@GL_KLUDGE@ GL: noof -root \n\ + pacman -root \n\ +@GL_KLUDGE@ GL: pinion -root \n\ +@GL_KLUDGE@ GL: polyhedra -root \n\ +@GL_KLUDGE@ GL: providence -root \n\ substrate -root \n\ - intermomentary -root \n\ - interaggregate -root \n\ - fireworkx -root \n\ - fiberlamp -root \n\ + wormhole -root \n\ +- GL: antmaze -root \n\ +@GL_KLUDGE@ GL: boing -root \n\ boxfit -root \n\ +- GL: carousel -root \n\ celtic -root \n\ +@GL_KLUDGE@ GL: crackberg -root \n\ +@GL_KLUDGE@ GL: cube21 -root \n\ + fiberlamp -root \n\ +@GL_KLUDGE@ GL: fliptext -root \n\ +@GL_KLUDGE@ GL: glhanoi -root \n\ +@GL_KLUDGE@ GL: juggler3d -root \n\ +@GL_KLUDGE@ GL: tangram -root \n\ +@GL_KLUDGE@ GL: timetunnel -root \n\ +@GL_KLUDGE@ GL: glschool -root \n\ +@GL_KLUDGE@ GL: topblock -root \n\ +@GL_KLUDGE@ GL: cubicgrid -root \n\ cwaves -root \n\ +@GL_KLUDGE@ GL: gears -root \n\ +@GL_KLUDGE@ GL: glcells -root \n\ +@GL_KLUDGE@ GL: lockward -root \n\ m6502 -root \n\ - abstractile -root \n\ +@GL_KLUDGE@ GL: moebiusgears -root \n\ +@GL_KLUDGE@ GL: voronoi -root \n\ +@GL_KLUDGE@ GL: hypnowheel -root \n\ - lcdscrub -root \n\ -- default-n: webcollage -root \n\ -- default-n: "WebCollage (whacked)" \ - webcollage -root -filter \ - 'vidwhacker -stdin -stdout' \n\ -- default-n: vidwhacker -root \n\ - \ -@GL_KLUDGE@ GL: gears -root \n\ -@GL_KLUDGE@ GL: superquadrics -root \n\ -@GL_KLUDGE@ GL: morph3d -root \n\ -@GL_KLUDGE@ GL: cage -root \n\ -@GL_KLUDGE@ GL: moebius -root \n\ -@GL_KLUDGE@ GL: stairs -root \n\ -@GL_KLUDGE@ GL: pipes -root \n\ -@GL_KLUDGE@ GL: sproingies -root \n\ -@GL_KLUDGE@ GL: rubik -root \n\ -@GL_KLUDGE@ GL: atlantis -root \n\ -@GL_KLUDGE@ GL: lament -root \n\ -@GL_KLUDGE@ GL: bubble3d -root \n\ -@GL_KLUDGE@ GL: glplanet -root \n\ -@GL_KLUDGE@ GL: flurry -root \n\ -@GL_KLUDGE@ GL: pulsar -root \n\ -- GL: "Pulsar (textures)" \ - pulsar -root -texture -mipmap \ - -texture_quality -light -fog \n\ -@GLE_KLUDGE@GL: extrusion -root \n\ -@GL_KLUDGE@ GL: sierpinski3d -root \n\ -@GL_KLUDGE@ GL: menger -root \n\ -@GL_KLUDGE@ GL: gflux -root \n\ -@GL_KLUDGE@ GL: "GFlux (grab)" gflux -root -mode grab \n\ -@GL_KLUDGE@ GL: stonerview -root \n\ -@GL_KLUDGE@ GL: starwars -root \n\ -@GL_KLUDGE@ GL: gltext -root \n\ -@GL_KLUDGE@ GL: "GLText (clock)" gltext -text "%A%n%d %b %Y%n%r" -root \n\ -@GL_KLUDGE@ GL: molecule -root \n\ -@GL_KLUDGE@ GL: dangerball -root \n\ -@GL_KLUDGE@ GL: circuit -root \n\ -@GL_KLUDGE@ GL: engine -root \n\ -@GL_KLUDGE@ GL: flipscreen3d -root \n\ -@GL_KLUDGE@ GL: glsnake -root \n\ -@GL_KLUDGE@ GL: boxed -root \n\ -- GL: glforestfire -root \n\ -- GL: "GLForestFire (rain)" glforestfire -root -count 0 \n\ -- GL: sballs -root \n\ -@GL_KLUDGE@ GL: cubenetic -root \n\ -@GL_KLUDGE@ GL: spheremonics -root \n\ -@GL_KLUDGE@ GL: lavalite -root \n\ -@GL_KLUDGE@ GL: queens -root \n\ -@GL_KLUDGE@ GL: endgame -root \n\ -- GL: glblur -root \n\ -@GL_KLUDGE@ GL: atunnel -root \n\ -@GL_KLUDGE@ GL: flyingtoasters -root \n\ -@GL_KLUDGE@ GL: bouncingcow -root \n\ -@GL_KLUDGE@ GL: jigglypuff -root \n\ -@GL_KLUDGE@ GL: klein -root \n\ -@GL_KLUDGE@ GL: hypertorus -root \n\ -@GL_KLUDGE@ GL: glmatrix -root \n\ -@GL_KLUDGE@ GL: cubestorm -root \n\ -@GL_KLUDGE@ GL: glknots -root \n\ -@GL_KLUDGE@ GL: blocktube -root \n\ -@GL_KLUDGE@ GL: flipflop -root \n\ -@GL_KLUDGE@ GL: antspotlight -root \n\ -- GL: glslideshow -root \n\ -@GL_KLUDGE@ GL: polytopes -root \n\ -@GL_KLUDGE@ GL: gleidescope -root \n\ -- GL: mirrorblob -root \n\ -@GL_KLUDGE@ GL: "MirrorBlob (color only)" \ - mirrorblob -root -colour -no-texture \n\ -@GL_KLUDGE@ GL: blinkbox -root \n\ -@GL_KLUDGE@ GL: noof -root \n\ -@GL_KLUDGE@ GL: polyhedra -root \n\ -- GL: antinspect -root \n\ -@GL_KLUDGE@ GL: providence -root \n\ -@GL_KLUDGE@ GL: "Pinion (large gears)" pinion -root \n\ -@GL_KLUDGE@ GL: "Pinion (small gears)" pinion -root -size 0.2 -scroll 0.3 \n\ -@GL_KLUDGE@ GL: boing -root -lighting -smooth \n\ -- GL: carousel -root \n\ -@GL_KLUDGE@ GL: fliptext -root \n\ -- GL: antmaze -root \n\ -@GL_KLUDGE@ GL: tangram -root \n\ -@GL_KLUDGE@ GL: crackberg -root \n\ -@GL_KLUDGE@ GL: glhanoi -root \n\ -@GL_KLUDGE@ GL: cube21 -root \n\ -@GL_KLUDGE@ GL: timetunnel -root \n\ -@GL_KLUDGE@ GL: juggler3d -root \n\ -@GL_KLUDGE@ GL: topblock -root \n\ -@GL_KLUDGE@ GL: glschool -root \n\ -@GL_KLUDGE@ GL: glcells -root \n\ -@GL_KLUDGE@ GL: voronoi -root \n\ -@GL_KLUDGE@ GL: moebiusgears -root \n\ -@GL_KLUDGE@ GL: lockward -root \n\ -@GL_KLUDGE@ GL: cubicgrid -root \n\ -@GL_KLUDGE@ GL: hypnowheel -root \n\ -@GL_KLUDGE@ GL: "Hypnowheel (dense)" hypnowheel -root -count 3 -layers 50 \n\ -@GL_KLUDGE@ GL: "Hypnowheel (trifoil)" hypnowheel -root -count 3 -layers 2 -speed 9 -twist 9 -wander \n\ -@GL_KLUDGE@ GL: skytentacles -root \n\ - \ -- xdaliclock -root -font BUILTIN3 \n\ -- xplanet -vroot -wait 1 -timewarp 90000 \ - -label -origin moon \n\ -- xmountains -b -M -Z 0 -r 1 \n\ -- "XMountains (top)" xmountains -b -M -Z 0 -r 1 -m \n\ -- xaos -root -autopilot -nogui -delay 10000 \ - -maxframerate 30 \ - -incoloring -1 -outcoloring -1 \n\ -- xsnow -root \n\ -- goban -root \n\ -- electricsheep \n\ -- cosmos -root \n\ -- GL: sphereEversion --root \n\ -- GL: fireflies -root \n +@GL_KLUDGE@ GL: skytentacles -root \n @@ -487,69 +435,72 @@ XScreenSaver.bourneShell: /bin/sh ! !============================================================================= -*hacks.imsmap.name: IMSmap -*hacks.slidescreen.name: SlideScreen -*hacks.decayscreen.name: DecayScreen +*hacks.antinspect.name: AntInspect +*hacks.antmaze.name: AntMaze +*hacks.antspotlight.name: AntSpotlight +*hacks.blinkbox.name: BlinkBox *hacks.blitspin.name: BlitSpin -*hacks.lmorph.name: LMorph -*hacks.ifs.name: IFS -*hacks.fadeplot.name: FadePlot +*hacks.blocktube.name: BlockTube +*hacks.bouncingcow.name: BouncingCow +*hacks.boxfit.name: BoxFit *hacks.bsod.name: BSOD -*hacks.rd-bomb.name: RD-Bomb -*hacks.t3d.name: T3D -*hacks.shadebobs.name: ShadeBobs -*hacks.ccurve.name: C Curve -*hacks.xanalogtv.name: XAnalogTV -*hacks.xspirograph.name: XSpiroGraph -*hacks.nerverot.name: NerveRot -*hacks.webcollage.name: WebCollage -*hacks.vidwhacker.name: VidWhacker -*hacks.morph3d.name: Morph3D *hacks.bubble3d.name: Bubble3D -*hacks.sierpinski3d.name: Sierpinski3D -*hacks.gflux.name: GFlux -*hacks.xrayswarm.name: XRaySwarm -*hacks.whirlwindwarp.name: WhirlwindWarp -*hacks.rotzoomer.name: RotZoomer -*hacks.stonerview.name: StonerView -*hacks.starwars.name: StarWars +*hacks.ccurve.name: CCurve +*hacks.cloudlife.name: CloudLife +*hacks.cubestorm.name: CubeStorm +*hacks.cubicgrid.name: CubicGrid +*hacks.cwaves.name: CWaves *hacks.dangerball.name: DangerBall -*hacks.whirlygig.name: WhirlyGig -*hacks.speedmine.name: SpeedMine -*hacks.glforestfire.name: GLForestFire -*hacks.sballs.name: SBalls -*hacks.xdaliclock.name: XDaliClock -*hacks.xplanetbg.name: XPlanet -*hacks.xplanet.name: XPlanet -*hacks.xaos.name: XaoS -*hacks.xfishtank.name: XFishTank -*hacks.electricsheep.name: ElectricSheep -*hacks.sphereEversion.name: SphereEversion +*hacks.decayscreen.name: DecayScreen +*hacks.dnalogo.name: DNA Logo +*hacks.euler2d.name: Euler2D +*hacks.fadeplot.name: FadePlot +*hacks.flipflop.name: FlipFlop +*hacks.flipscreen3d.name: FlipScreen3D +*hacks.fliptext.name: FlipText *hacks.fluidballs.name: FluidBalls *hacks.flyingtoasters.name: FlyingToasters -*hacks.bouncingcow.name: BouncingCow -*hacks.jigglypuff.name: JigglyPuff -*hacks.hypertorus.name: HyperTorus -*hacks.cubestorm.name: CubeStorm -*hacks.blocktube.name: BlockTube -*hacks.flipflop.name: FlipFlop -*hacks.antspotlight.name: AntSpotlight *hacks.fontglide.name: FontGlide -*hacks.mirrorblob.name: MirrorBlob -*hacks.blinkbox.name: BlinkBox *hacks.fuzzyflakes.name: FuzzyFlakes +*hacks.gflux.name: GFlux +*hacks.gleidescope.name: Gleidescope +*hacks.glforestfire.name: GLForestFire +*hacks.hyperball.name: HyperBall +*hacks.hypercube.name: HyperCube +*hacks.ifs.name: IFS +*hacks.imsmap.name: IMSMap +*hacks.jigglypuff.name: JigglyPuff +*hacks.juggler3d.name: Juggler3D +*hacks.lcdscrub.name: LCDscrub +*hacks.lmorph.name: LMorph +*hacks.m6502.name: m6502 *hacks.memscroller.name: MemScroller -*hacks.boxfit.name: BoxFit -*hacks.fliptext.name: FlipText -*hacks.glhanoi.name: GLHanoi -*hacks.topblock.name: TopBlock -*hacks.glschool.name: GLSchool -*hacks.glcells.name: GLCells +*hacks.metaballs.name: MetaBalls +*hacks.mirrorblob.name: MirrorBlob *hacks.moebiusgears.name: MoebiusGears -*hacks.cubicgrid.name: CubicGrid -*hacks.lcdscrub.name: LCDscrub -*hacks.hypnowheel.name: HypnoWheel +*hacks.morph3d.name: Morph3D +*hacks.nerverot.name: NerveRot +*hacks.noseguy.name: NoseGuy +*hacks.popsquares.name: PopSquares +*hacks.rd-bomb.name: RDbomb +*hacks.rdbomb.name: RDbomb +*hacks.rotzoomer.name: RotZoomer +*hacks.sballs.name: SBalls +*hacks.shadebobs.name: ShadeBobs +*hacks.sierpinski3d.name: Sierpinski3D *hacks.skytentacles.name: SkyTentacles +*hacks.slidescreen.name: SlideScreen +*hacks.speedmine.name: SpeedMine +*hacks.starwars.name: StarWars +*hacks.stonerview.name: StonerView +*hacks.t3d.name: T3D +*hacks.timetunnel.name: TimeTunnel +*hacks.topblock.name: TopBlock +*hacks.vidwhacker.name: VidWhacker +*hacks.webcollage.name: WebCollage +*hacks.whirlwindwarp.name: WhirlWindWarp +*hacks.xanalogtv.name: XAnalogTV +*hacks.xrayswarm.name: XRaySwarm ! obsolete, but still used by xscreensaver-demo-Xm. *hacks.documentation.isInstalled: True diff --git a/driver/XScreenSaver_ad.h b/driver/XScreenSaver_ad.h index 26632eca..833a26a2 100644 --- a/driver/XScreenSaver_ad.h +++ b/driver/XScreenSaver_ad.h @@ -50,273 +50,221 @@ "*dateFormat: %d-%b-%y (%a); %I:%M %p", "*installColormap: True", "*programs: \ - \"Qix (solid)\" qix -root -solid -segments 100 \\n\ - \"Qix (transparent)\" qix -root -count 4 -solid -transparent \\n\ - \"Qix (linear)\" qix -root -count 5 -solid -transparent \ - -linear -segments 250 -size 100 \\n\ - \ - \"Attraction (balls)\" attraction -root -mode balls \\n\ - \"Attraction (lines)\" attraction -root -mode lines -points 3 \ - -segments 200 \\n\ -- \"Attraction (splines)\" attraction -root -mode splines -segments \ - 300 \\n\ -- \"Attraction (orbital)\" attraction -root -mode lines -radius 300 \ - -orbit -vmult 0.5 \\n\ - \ - pyro -root \\n\ - rocks -root \\n\ +- sphere -root \\n\ + GL: superquadrics -root \\n\ +- worm -root \\n\ + attraction -root \\n\ + blitspin -root \\n\ + greynetic -root \\n\ helix -root \\n\ - pedal -root \\n\ - rorschach -root \\n\ hopalong -root \\n\ - greynetic -root \\n\ - imsmap -root \\n\ - slidescreen -root \\n\ - decayscreen -root \\n\ - jigsaw -root \\n\ - blitspin -root \\n\ - slip -root \\n\ - distort -root \\n\ - spotlight -root \\n\ - \"Ripples (stir)\" ripples -root -oily -light 2 -stir \\n\ - \"Ripples (desktop)\" ripples -root -water -light 6 \\n\ hypercube -root \\n\ -- hyperball -root \\n\ - halo -root \\n\ + imsmap -root \\n\ maze -root \\n\ noseguy -root \\n\ + pyro -root \\n\ + qix -root \\n\ + rocks -root \\n\ + rorschach -root \\n\ + decayscreen -root \\n\ flame -root \\n\ + halo -root \\n\ + slidescreen -root \\n\ - lmorph -root \\n\ + pedal -root \\n\ + bubbles -root \\n\ + bouboule -root \\n\ + braid -root \\n\ + coral -root \\n\ deco -root \\n\ - moire -root \\n\ - moire2 -root \\n\ - lightning -root \\n\ - strange -root \\n\ -- spiral -root \\n\ - laser -root \\n\ - grav -root \\n\ drift -root \\n\ - ifs -root \\n\ - julia -root \\n\ - penrose -root \\n\ -- sierpinski -root \\n\ - braid -root \\n\ - galaxy -root \\n\ - bouboule -root \\n\ - swirl -root \\n\ + fadeplot -root \\n\ flag -root \\n\ - sphere -root \\n\ forest -root \\n\ + galaxy -root \\n\ + goop -root \\n\ + grav -root \\n\ + ifs -root \\n\ + julia -root \\n\ + kaleidescope -root \\n\ +- laser -root \\n\ +- lightning -root \\n\ - lisa -root \\n\ - lissie -root \\n\ - goop -root \\n\ - starfish -root \\n\ - munch -root \\n\ - mismunch -root \\n\ - fadeplot -root \\n\ - coral -root \\n\ + GL: moebius -root \\n\ + moire -root \\n\ + GL: morph3d -root \\n\ mountain -root \\n\ - triangle -root \\n\ -- worm -root \\n\ + munch -root \\n\ + penrose -root \\n\ + GL: pipes -root \\n\ + rd-bomb -root \\n\ - rotor -root \\n\ -- demon -root \\n\ -- loop -root \\n\ + GL: rubik -root \\n\ +- sierpinski -root \\n\ + slip -root \\n\ +- spiral -root \\n\ + GL: sproingies -root \\n\ + starfish -root \\n\ + strange -root \\n\ + swirl -root \\n\ + triangle -root \\n\ - vines -root \\n\ - kaleidescope -root \\n\ xjack -root \\n\ xlyap -root \\n\ - cynosure -root \\n\ - flow -root \\n\ - epicycle -root \\n\ - interference -root \\n\ - truchet -root \\n\ + GL: atlantis -root \\n\ bsod -root \\n\ + GL: bubble3d -root \\n\ + GL: cage -root \\n\ crystal -root \\n\ + cynosure -root \\n\ discrete -root \\n\ + distort -root \\n\ + epicycle -root \\n\ + flow -root \\n\ + GL: glplanet -root \\n\ + interference -root \\n\ + jigsaw -root \\n\ kumppa -root \\n\ - rd-bomb -root \\n\ - \"RD-Bomb (mobile)\" rd-bomb -root -speed 1 -size 0.1 \\n\ + GL: lament -root \\n\ + moire2 -root \\n\ sonar -root \\n\ - t3d -root \\n\ - penetrate -root \\n\ - deluxe -root \\n\ + GL: stairs -root \\n\ + truchet -root \\n\ +- vidwhacker -root \\n\ + blaster -root \\n\ + bumps -root \\n\ + ccurve -root \\n\ compass -root \\n\ - squiral -root \\n\ - xflame -root \\n\ - wander -root \\n\ - \"Wander (spots)\" wander -root -advance 0 -size 10 -circles \ - -length 10000 -reset 100000 \\n\ - critical -root \\n\ - phosphor -root \\n\ - xmatrix -root \\n\ + deluxe -root \\n\ +- demon -root \\n\ +- GL: extrusion -root \\n\ +- loop -root \\n\ + penetrate -root \\n\ petri -root \\n\ - \"Petri 2\" petri -root -minlifespeed 0.02 \ - -maxlifespeed 0.03 -minlifespan 1 \ - -maxlifespan 1 -instantdeathchan 0 \ - -minorchan 0 -anychan 0.3 \\n\ + phosphor -root \\n\ + GL: pulsar -root \\n\ + ripples -root \\n\ shadebobs -root \\n\ - ccurve -root \\n\ - blaster -root \\n\ - bumps -root \\n\ - xanalogtv -root \\n\ - xspirograph -root \\n\ + GL: sierpinski3d -root \\n\ + spotlight -root \\n\ + squiral -root \\n\ + t3d -root \\n\ + wander -root \\n\ +- webcollage -root \\n\ + xflame -root \\n\ + xmatrix -root \\n\ + GL: gflux -root \\n\ +- hyperball -root \\n\ nerverot -root \\n\ xrayswarm -root \\n\ -- \"Zoom (Fatbits)\" zoom -root \\n\ - \"Zoom (Lenses)\" zoom -root -lenses \\n\ + xspirograph -root \\n\ + GL: circuit -root \\n\ + GL: dangerball -root \\n\ +- GL: dnalogo -root \\n\ + GL: engine -root \\n\ + GL: flipscreen3d -root \\n\ + GL: gltext -root \\n\ + GL: menger -root \\n\ + GL: molecule -root \\n\ rotzoomer -root \\n\ + speedmine -root \\n\ + GL: starwars -root \\n\ + GL: stonerview -root \\n\ + vermiculate -root \\n\ whirlwindwarp -root \\n\ - whirlygig -root \\n\ - speedmine -root \\n\ - \"SpeedWorm\" speedmine -root -worm \\n\ - vermiculate -root \\n\ - twang -root \\n\ - apollonian -root \\n\ - euler2d -root \\n\ - \"Euler2d (dense)\" euler2d -root -count 4000 -eulertail 400 \ - -ncolors 230 \\n\ -- juggle -root \\n\ - polyominoes -root \\n\ -- thornbird -root \\n\ - fluidballs -root \\n\ - anemone -root \\n\ - halftone -root \\n\ - metaballs -root \\n\ - eruption -root \\n\ - popsquares -root \\n\ - barcode -root \\n\ - piecewise -root \\n\ - cloudlife -root \\n\ - fontglide -root \\n\ + whirlygig -root \\n\ + zoom -root \\n\ + anemone -root \\n\ + apollonian -root \\n\ + GL: boxed -root \\n\ + GL: cubenetic -root \\n\ + GL: endgame -root \\n\ + euler2d -root \\n\ + fluidballs -root \\n\ + GL: flurry -root \\n\ +- GL: glblur -root \\n\ +- GL: glforestfire -root \\n\ + GL: glsnake -root \\n\ + halftone -root \\n\ +- juggle -root \\n\ + GL: lavalite -root \\n\ + polyominoes -root \\n\ + GL: queens -root \\n\ +- GL: sballs -root \\n\ + GL: spheremonics -root \\n\ +- thornbird -root \\n\ + twang -root \\n\ + GL: antspotlight -root \\n\ apple2 -root \\n\ - bubbles -root \\n\ + GL: atunnel -root \\n\ + barcode -root \\n\ + GL: blinkbox -root \\n\ + GL: blocktube -root \\n\ + GL: bouncingcow -root \\n\ + cloudlife -root \\n\ + GL: cubestorm -root \\n\ + eruption -root \\n\ + GL: flipflop -root \\n\ + GL: flyingtoasters -root \\n\ + fontglide -root \\n\ + GL: gleidescope -root \\n\ + GL: glknots -root \\n\ + GL: glmatrix -root \\n\ +- GL: glslideshow -root \\n\ + GL: hypertorus -root \\n\ + GL: jigglypuff -root \\n\ + GL: klein -root \\n\ + metaballs -root \\n\ + GL: mirrorblob -root \\n\ + piecewise -root \\n\ + GL: polytopes -root \\n\ pong -root \\n\ - wormhole -root \\n\ - pacman -root \\n\ - fuzzyflakes -root \\n\ + popsquares -root \\n\ + xanalogtv -root \\n\ +- abstractile -root \\n\ anemotaxis -root \\n\ +- GL: antinspect -root \\n\ + fireworkx -root \\n\ + fuzzyflakes -root \\n\ + interaggregate -root \\n\ + intermomentary -root \\n\ memscroller -root \\n\ + mismunch -root \\n\ + GL: noof -root \\n\ + pacman -root \\n\ + GL: pinion -root \\n\ + GL: polyhedra -root \\n\ + GL: providence -root \\n\ substrate -root \\n\ - intermomentary -root \\n\ - interaggregate -root \\n\ - fireworkx -root \\n\ - fiberlamp -root \\n\ + wormhole -root \\n\ +- GL: antmaze -root \\n\ + GL: boing -root \\n\ boxfit -root \\n\ +- GL: carousel -root \\n\ celtic -root \\n\ + GL: crackberg -root \\n\ + GL: cube21 -root \\n\ + fiberlamp -root \\n\ + GL: fliptext -root \\n\ + GL: glhanoi -root \\n\ + GL: juggler3d -root \\n\ + GL: tangram -root \\n\ + GL: timetunnel -root \\n\ + GL: glschool -root \\n\ + GL: topblock -root \\n\ + GL: cubicgrid -root \\n\ cwaves -root \\n\ + GL: gears -root \\n\ + GL: glcells -root \\n\ + GL: lockward -root \\n\ m6502 -root \\n\ - abstractile -root \\n\ + GL: moebiusgears -root \\n\ + GL: voronoi -root \\n\ + GL: hypnowheel -root \\n\ - lcdscrub -root \\n\ -- default-n: webcollage -root \\n\ -- default-n: \"WebCollage (whacked)\" \ - webcollage -root -filter \ - 'vidwhacker -stdin -stdout' \\n\ -- default-n: vidwhacker -root \\n\ - \ - GL: gears -root \\n\ - GL: superquadrics -root \\n\ - GL: morph3d -root \\n\ - GL: cage -root \\n\ - GL: moebius -root \\n\ - GL: stairs -root \\n\ - GL: pipes -root \\n\ - GL: sproingies -root \\n\ - GL: rubik -root \\n\ - GL: atlantis -root \\n\ - GL: lament -root \\n\ - GL: bubble3d -root \\n\ - GL: glplanet -root \\n\ - GL: flurry -root \\n\ - GL: pulsar -root \\n\ -- GL: \"Pulsar (textures)\" \ - pulsar -root -texture -mipmap \ - -texture_quality -light -fog \\n\ -- GL: extrusion -root \\n\ - GL: sierpinski3d -root \\n\ - GL: menger -root \\n\ - GL: gflux -root \\n\ - GL: \"GFlux (grab)\" gflux -root -mode grab \\n\ - GL: stonerview -root \\n\ - GL: starwars -root \\n\ - GL: gltext -root \\n\ - GL: \"GLText (clock)\" gltext -text \"%A%n%d %b %Y%n%r\" -root \\n\ - GL: molecule -root \\n\ - GL: dangerball -root \\n\ - GL: circuit -root \\n\ - GL: engine -root \\n\ - GL: flipscreen3d -root \\n\ - GL: glsnake -root \\n\ - GL: boxed -root \\n\ -- GL: glforestfire -root \\n\ -- GL: \"GLForestFire (rain)\" glforestfire -root -count 0 \\n\ -- GL: sballs -root \\n\ - GL: cubenetic -root \\n\ - GL: spheremonics -root \\n\ - GL: lavalite -root \\n\ - GL: queens -root \\n\ - GL: endgame -root \\n\ -- GL: glblur -root \\n\ - GL: atunnel -root \\n\ - GL: flyingtoasters -root \\n\ - GL: bouncingcow -root \\n\ - GL: jigglypuff -root \\n\ - GL: klein -root \\n\ - GL: hypertorus -root \\n\ - GL: glmatrix -root \\n\ - GL: cubestorm -root \\n\ - GL: glknots -root \\n\ - GL: blocktube -root \\n\ - GL: flipflop -root \\n\ - GL: antspotlight -root \\n\ -- GL: glslideshow -root \\n\ - GL: polytopes -root \\n\ - GL: gleidescope -root \\n\ -- GL: mirrorblob -root \\n\ - GL: \"MirrorBlob (color only)\" \ - mirrorblob -root -colour -no-texture \\n\ - GL: blinkbox -root \\n\ - GL: noof -root \\n\ - GL: polyhedra -root \\n\ -- GL: antinspect -root \\n\ - GL: providence -root \\n\ - GL: \"Pinion (large gears)\" pinion -root \\n\ - GL: \"Pinion (small gears)\" pinion -root -size 0.2 -scroll 0.3 \\n\ - GL: boing -root -lighting -smooth \\n\ -- GL: carousel -root \\n\ - GL: fliptext -root \\n\ -- GL: antmaze -root \\n\ - GL: tangram -root \\n\ - GL: crackberg -root \\n\ - GL: glhanoi -root \\n\ - GL: cube21 -root \\n\ - GL: timetunnel -root \\n\ - GL: juggler3d -root \\n\ - GL: topblock -root \\n\ - GL: glschool -root \\n\ - GL: glcells -root \\n\ - GL: voronoi -root \\n\ - GL: moebiusgears -root \\n\ - GL: lockward -root \\n\ - GL: cubicgrid -root \\n\ - GL: hypnowheel -root \\n\ - GL: \"Hypnowheel (dense)\" hypnowheel -root -count 3 -layers 50 \\n\ - GL: \"Hypnowheel (trifoil)\" hypnowheel -root -count 3 -layers 2 -speed 9 -twist 9 -wander \\n\ - GL: skytentacles -root \\n\ - \ -- xdaliclock -root -font BUILTIN3 \\n\ -- xplanet -vroot -wait 1 -timewarp 90000 \ - -label -origin moon \\n\ -- xmountains -b -M -Z 0 -r 1 \\n\ -- \"XMountains (top)\" xmountains -b -M -Z 0 -r 1 -m \\n\ -- xaos -root -autopilot -nogui -delay 10000 \ - -maxframerate 30 \ - -incoloring -1 -outcoloring -1 \\n\ -- xsnow -root \\n\ -- goban -root \\n\ -- electricsheep \\n\ -- cosmos -root \\n\ -- GL: sphereEversion --root \\n\ -- GL: fireflies -root \\n", + GL: skytentacles -root \\n", "XScreenSaver.pointerPollTime: 0:00:05", "XScreenSaver.pointerHysteresis: 10", "XScreenSaver.initialDelay: 0:00:00", @@ -357,67 +305,70 @@ "*splash.body2.label: Jamie Zawinski ", "*splash.demo.label: Settings", "*splash.help.label: Help", -"*hacks.imsmap.name: IMSmap", -"*hacks.slidescreen.name: SlideScreen", -"*hacks.decayscreen.name: DecayScreen", +"*hacks.antinspect.name: AntInspect", +"*hacks.antmaze.name: AntMaze", +"*hacks.antspotlight.name: AntSpotlight", +"*hacks.blinkbox.name: BlinkBox", "*hacks.blitspin.name: BlitSpin", -"*hacks.lmorph.name: LMorph", -"*hacks.ifs.name: IFS", -"*hacks.fadeplot.name: FadePlot", +"*hacks.blocktube.name: BlockTube", +"*hacks.bouncingcow.name: BouncingCow", +"*hacks.boxfit.name: BoxFit", "*hacks.bsod.name: BSOD", -"*hacks.rd-bomb.name: RD-Bomb", -"*hacks.t3d.name: T3D", -"*hacks.shadebobs.name: ShadeBobs", -"*hacks.ccurve.name: C Curve", -"*hacks.xanalogtv.name: XAnalogTV", -"*hacks.xspirograph.name: XSpiroGraph", -"*hacks.nerverot.name: NerveRot", -"*hacks.webcollage.name: WebCollage", -"*hacks.vidwhacker.name: VidWhacker", -"*hacks.morph3d.name: Morph3D", "*hacks.bubble3d.name: Bubble3D", -"*hacks.sierpinski3d.name: Sierpinski3D", -"*hacks.gflux.name: GFlux", -"*hacks.xrayswarm.name: XRaySwarm", -"*hacks.whirlwindwarp.name: WhirlwindWarp", -"*hacks.rotzoomer.name: RotZoomer", -"*hacks.stonerview.name: StonerView", -"*hacks.starwars.name: StarWars", +"*hacks.ccurve.name: CCurve", +"*hacks.cloudlife.name: CloudLife", +"*hacks.cubestorm.name: CubeStorm", +"*hacks.cubicgrid.name: CubicGrid", +"*hacks.cwaves.name: CWaves", "*hacks.dangerball.name: DangerBall", -"*hacks.whirlygig.name: WhirlyGig", -"*hacks.speedmine.name: SpeedMine", -"*hacks.glforestfire.name: GLForestFire", -"*hacks.sballs.name: SBalls", -"*hacks.xdaliclock.name: XDaliClock", -"*hacks.xplanetbg.name: XPlanet", -"*hacks.xplanet.name: XPlanet", -"*hacks.xaos.name: XaoS", -"*hacks.xfishtank.name: XFishTank", -"*hacks.electricsheep.name: ElectricSheep", -"*hacks.sphereEversion.name: SphereEversion", +"*hacks.decayscreen.name: DecayScreen", +"*hacks.dnalogo.name: DNA Logo", +"*hacks.euler2d.name: Euler2D", +"*hacks.fadeplot.name: FadePlot", +"*hacks.flipflop.name: FlipFlop", +"*hacks.flipscreen3d.name: FlipScreen3D", +"*hacks.fliptext.name: FlipText", "*hacks.fluidballs.name: FluidBalls", "*hacks.flyingtoasters.name: FlyingToasters", -"*hacks.bouncingcow.name: BouncingCow", -"*hacks.jigglypuff.name: JigglyPuff", -"*hacks.hypertorus.name: HyperTorus", -"*hacks.cubestorm.name: CubeStorm", -"*hacks.blocktube.name: BlockTube", -"*hacks.flipflop.name: FlipFlop", -"*hacks.antspotlight.name: AntSpotlight", "*hacks.fontglide.name: FontGlide", -"*hacks.mirrorblob.name: MirrorBlob", -"*hacks.blinkbox.name: BlinkBox", "*hacks.fuzzyflakes.name: FuzzyFlakes", +"*hacks.gflux.name: GFlux", +"*hacks.gleidescope.name: Gleidescope", +"*hacks.glforestfire.name: GLForestFire", +"*hacks.hyperball.name: HyperBall", +"*hacks.hypercube.name: HyperCube", +"*hacks.ifs.name: IFS", +"*hacks.imsmap.name: IMSMap", +"*hacks.jigglypuff.name: JigglyPuff", +"*hacks.juggler3d.name: Juggler3D", +"*hacks.lcdscrub.name: LCDscrub", +"*hacks.lmorph.name: LMorph", +"*hacks.m6502.name: m6502", "*hacks.memscroller.name: MemScroller", -"*hacks.boxfit.name: BoxFit", -"*hacks.fliptext.name: FlipText", -"*hacks.glhanoi.name: GLHanoi", -"*hacks.topblock.name: TopBlock", -"*hacks.glschool.name: GLSchool", -"*hacks.glcells.name: GLCells", +"*hacks.metaballs.name: MetaBalls", +"*hacks.mirrorblob.name: MirrorBlob", "*hacks.moebiusgears.name: MoebiusGears", -"*hacks.cubicgrid.name: CubicGrid", -"*hacks.lcdscrub.name: LCDscrub", -"*hacks.hypnowheel.name: HypnoWheel", +"*hacks.morph3d.name: Morph3D", +"*hacks.nerverot.name: NerveRot", +"*hacks.noseguy.name: NoseGuy", +"*hacks.popsquares.name: PopSquares", +"*hacks.rd-bomb.name: RDbomb", +"*hacks.rdbomb.name: RDbomb", +"*hacks.rotzoomer.name: RotZoomer", +"*hacks.sballs.name: SBalls", +"*hacks.shadebobs.name: ShadeBobs", +"*hacks.sierpinski3d.name: Sierpinski3D", "*hacks.skytentacles.name: SkyTentacles", +"*hacks.slidescreen.name: SlideScreen", +"*hacks.speedmine.name: SpeedMine", +"*hacks.starwars.name: StarWars", +"*hacks.stonerview.name: StonerView", +"*hacks.t3d.name: T3D", +"*hacks.timetunnel.name: TimeTunnel", +"*hacks.topblock.name: TopBlock", +"*hacks.vidwhacker.name: VidWhacker", +"*hacks.webcollage.name: WebCollage", +"*hacks.whirlwindwarp.name: WhirlWindWarp", +"*hacks.xanalogtv.name: XAnalogTV", +"*hacks.xrayswarm.name: XRaySwarm", "*hacks.documentation.isInstalled: True", diff --git a/driver/demo-Gtk-conf.c b/driver/demo-Gtk-conf.c index d41b5857..787e15b8 100644 --- a/driver/demo-Gtk-conf.c +++ b/driver/demo-Gtk-conf.c @@ -1,5 +1,5 @@ /* demo-Gtk-conf.c --- implements the dynamic configuration dialogs. - * xscreensaver, Copyright (c) 2001, 2003, 2004, 2006 Jamie Zawinski + * xscreensaver, Copyright (c) 2001-2008 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 @@ -72,6 +72,11 @@ const char *hack_configuration_path = HACK_CONFIGURATION_PATH; static gboolean debug_p = FALSE; +#define MIN_SLIDER_WIDTH 150 +#define MIN_SPINBUTTON_WIDTH 48 +#define MIN_LABEL_WIDTH 70 + + typedef enum { COMMAND, FAKE, @@ -127,8 +132,8 @@ typedef struct { static parameter *make_select_option (const char *file, xmlNodePtr); -static void make_parameter_widget (const char *filename, - parameter *, GtkWidget *, int *); +static void make_parameter_widget (const char *filename, + parameter *, GtkWidget *); static void browse_button_cb (GtkButton *button, gpointer user_data); @@ -668,8 +673,7 @@ sanity_check_parameters (const char *filename, GList *parms) /* Helper for make_parameters() */ static GList * -make_parameters_1 (const char *filename, xmlNodePtr node, - GtkWidget *parent, int *row) +make_parameters_1 (const char *filename, xmlNodePtr node, GtkWidget *parent) { GList *list = 0; @@ -684,17 +688,9 @@ make_parameters_1 (const char *filename, xmlNodePtr node, : gtk_vbox_new (FALSE, 0)); GList *list2; gtk_widget_show (box); + gtk_box_pack_start (GTK_BOX (parent), box, FALSE, FALSE, 0); - if (row) - gtk_table_attach (GTK_TABLE (parent), box, 0, 3, *row, *row + 1, - 0, 0, 0, 0); - else - gtk_box_pack_start (GTK_BOX (parent), box, FALSE, FALSE, 0); - - if (row) - (*row)++; - - list2 = make_parameters_1 (filename, node->xmlChildrenNode, box, 0); + list2 = make_parameters_1 (filename, node->xmlChildrenNode, box); if (list2) list = g_list_concat (list, list2); } @@ -704,7 +700,7 @@ make_parameters_1 (const char *filename, xmlNodePtr node, if (p) { list = g_list_append (list, p); - make_parameter_widget (filename, p, parent, row); + make_parameter_widget (filename, p, parent); } } } @@ -719,13 +715,11 @@ make_parameters_1 (const char *filename, xmlNodePtr node, static GList * make_parameters (const char *filename, xmlNodePtr node, GtkWidget *parent) { - int row = 0; for (; node; node = node->next) { if (node->type == XML_ELEMENT_NODE && !strcmp ((char *) node->name, "screensaver")) - return make_parameters_1 (filename, node->xmlChildrenNode, - parent, &row); + return make_parameters_1 (filename, node->xmlChildrenNode, parent); } return 0; } @@ -793,14 +787,40 @@ make_adjustment (const char *filename, parameter *p) +static void +set_widget_min_width (GtkWidget *w, int width) +{ + GtkRequisition req; + gtk_widget_size_request (GTK_WIDGET (w), &req); + if (req.width < width) + gtk_widget_set_size_request (GTK_WIDGET (w), width, -1); +} + + +/* If we're inside a vbox, we need to put an hbox in it, or labels appear + on top instead of to the left, and things stretch to the full width of + the window. + */ +static GtkWidget * +insert_fake_hbox (GtkWidget *parent) +{ + if (GTK_IS_VBOX (parent)) + { + GtkWidget *hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (parent), hbox, FALSE, FALSE, 4); + gtk_widget_show (hbox); + return hbox; + } + return parent; +} + + /* Given a `parameter' struct, allocates an appropriate GtkWidget for it, and stores it in `p->widget'. - `row' is used for keeping track of our position during table layout. - `parent' must be a GtkTable or a GtkBox. + `parent' must be a GtkBox. */ static void -make_parameter_widget (const char *filename, - parameter *p, GtkWidget *parent, int *row) +make_parameter_widget (const char *filename, parameter *p, GtkWidget *parent) { const char *label = (char *) p->label; if (p->widget) return; @@ -809,28 +829,21 @@ make_parameter_widget (const char *filename, { case STRING: { + parent = insert_fake_hbox (parent); if (label) { GtkWidget *w = gtk_label_new (_(label)); gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_RIGHT); gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5); + set_widget_min_width (GTK_WIDGET (w), MIN_LABEL_WIDTH); gtk_widget_show (w); - if (row) - gtk_table_attach (GTK_TABLE (parent), w, 0, 1, *row, *row + 1, - GTK_FILL, 0, 0, 0); - else - gtk_box_pack_start (GTK_BOX (parent), w, FALSE, FALSE, 4); + gtk_box_pack_start (GTK_BOX (parent), w, FALSE, FALSE, 4); } p->widget = gtk_entry_new (); if (p->string) gtk_entry_set_text (GTK_ENTRY (p->widget), (char *) p->string); - if (row) - gtk_table_attach (GTK_TABLE (parent), p->widget, 1, 3, - *row, *row + 1, - GTK_FILL, 0, 0, 0); - else - gtk_box_pack_start (GTK_BOX (parent), p->widget, FALSE, FALSE, 4); + gtk_box_pack_start (GTK_BOX (parent), p->widget, FALSE, FALSE, 4); break; } case FILENAME: @@ -848,29 +861,16 @@ make_parameter_widget (const char *filename, gtk_label_set_justify (GTK_LABEL (L), GTK_JUSTIFY_RIGHT); gtk_misc_set_alignment (GTK_MISC (L), 1.0, 0.5); + set_widget_min_width (GTK_WIDGET (L), MIN_LABEL_WIDTH); gtk_widget_show (L); if (p->string) gtk_entry_set_text (GTK_ENTRY (entry), (char *) p->string); - if (row) - { - gtk_table_attach (GTK_TABLE (parent), L, 0, 1, - *row, *row + 1, - GTK_FILL, 0, 0, 0); - gtk_table_attach (GTK_TABLE (parent), entry, 1, 2, - *row, *row + 1, - GTK_EXPAND | GTK_FILL, 0, 0, 0); - gtk_table_attach (GTK_TABLE (parent), button, 2, 3, - *row, *row + 1, - 0, 0, 0, 0); - } - else - { - gtk_box_pack_start (GTK_BOX (parent), L, FALSE, FALSE, 4); - gtk_box_pack_start (GTK_BOX (parent), entry, TRUE, TRUE, 4); - gtk_box_pack_start (GTK_BOX (parent), button, FALSE, FALSE, 4); - } + parent = insert_fake_hbox (parent); + gtk_box_pack_start (GTK_BOX (parent), L, FALSE, FALSE, 4); + gtk_box_pack_start (GTK_BOX (parent), entry, TRUE, TRUE, 4); + gtk_box_pack_start (GTK_BOX (parent), button, FALSE, FALSE, 4); break; } case SLIDER: @@ -884,79 +884,30 @@ make_parameter_widget (const char *filename, labelw = gtk_label_new (_(label)); gtk_label_set_justify (GTK_LABEL (labelw), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (labelw), 0.0, 0.5); + set_widget_min_width (GTK_WIDGET (labelw), MIN_LABEL_WIDTH); gtk_widget_show (labelw); + gtk_box_pack_start (GTK_BOX (parent), labelw, FALSE, FALSE, 2); } - if (GTK_IS_VBOX (parent)) - { - /* If we're inside a vbox, we need to put an hbox in it, to get - the low/high labels to be to the left/right of the slider. - */ - GtkWidget *hbox = gtk_hbox_new (FALSE, 0); - - /* But if we have a label, put that above the slider's hbox. */ - if (labelw) - { - gtk_box_pack_start (GTK_BOX (parent), labelw, FALSE, TRUE, 2); - labelw = 0; - } - - gtk_box_pack_start (GTK_BOX (parent), hbox, TRUE, TRUE, 6); - gtk_widget_show (hbox); - parent = hbox; - } - - if (labelw) - { - if (row) - { - gtk_table_attach (GTK_TABLE (parent), labelw, - 0, 3, *row, *row + 1, - GTK_EXPAND | GTK_FILL, 0, 0, 0); - (*row)++; - } - else - { - if (GTK_IS_HBOX (parent)) - { - GtkWidget *box = gtk_vbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (parent), box, FALSE, TRUE, 0); - gtk_widget_show (box); - gtk_box_pack_start (GTK_BOX (box), labelw, FALSE, TRUE, 4); - parent = box; - box = gtk_hbox_new (FALSE, 0); - gtk_widget_show (box); - gtk_box_pack_start (GTK_BOX (parent), box, TRUE, TRUE, 0); - parent = box; - } - else - gtk_box_pack_start (GTK_BOX (parent), labelw, - FALSE, TRUE, 0); - } - } + /* Do this after 'labelw' so that it appears above, not to left. */ + parent = insert_fake_hbox (parent); if (p->low_label) { GtkWidget *w = gtk_label_new (_((char *) p->low_label)); gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_RIGHT); gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5); + set_widget_min_width (GTK_WIDGET (w), MIN_LABEL_WIDTH); gtk_widget_show (w); - if (row) - gtk_table_attach (GTK_TABLE (parent), w, 0, 1, *row, *row + 1, - GTK_FILL, 0, 0, 0); - else - gtk_box_pack_start (GTK_BOX (parent), w, FALSE, FALSE, 4); + gtk_box_pack_start (GTK_BOX (parent), w, FALSE, FALSE, 4); } gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_BOTTOM); gtk_scale_set_draw_value (GTK_SCALE (scale), debug_p); gtk_scale_set_digits (GTK_SCALE (scale), (p->integer_p ? 0 : 2)); - if (row) - gtk_table_attach (GTK_TABLE (parent), scale, 1, 2, - *row, *row + 1, - GTK_EXPAND | GTK_FILL, 0, 0, 0); - else - gtk_box_pack_start (GTK_BOX (parent), scale, TRUE, TRUE, 4); + set_widget_min_width (GTK_WIDGET (scale), MIN_SLIDER_WIDTH); + + gtk_box_pack_start (GTK_BOX (parent), scale, FALSE, FALSE, 4); gtk_widget_show (scale); @@ -965,12 +916,9 @@ make_parameter_widget (const char *filename, GtkWidget *w = gtk_label_new (_((char *) p->high_label)); gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5); + set_widget_min_width (GTK_WIDGET (w), MIN_LABEL_WIDTH); gtk_widget_show (w); - if (row) - gtk_table_attach (GTK_TABLE (parent), w, 2, 3, *row, *row + 1, - GTK_FILL, 0, 0, 0); - else - gtk_box_pack_start (GTK_BOX (parent), w, FALSE, FALSE, 4); + gtk_box_pack_start (GTK_BOX (parent), w, FALSE, FALSE, 4); } p->widget = scale; @@ -983,32 +931,21 @@ make_parameter_widget (const char *filename, gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spin), TRUE); gtk_spin_button_set_snap_to_ticks (GTK_SPIN_BUTTON (spin), TRUE); gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), adj->value); + set_widget_min_width (GTK_WIDGET (spin), MIN_SPINBUTTON_WIDTH); if (label) { GtkWidget *w = gtk_label_new (_(label)); gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_RIGHT); gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5); + set_widget_min_width (GTK_WIDGET (w), MIN_LABEL_WIDTH); gtk_widget_show (w); - if (row) - gtk_table_attach (GTK_TABLE (parent), w, 0, 1, *row, *row + 1, - GTK_FILL, 0, 0, 0); - else - gtk_box_pack_start (GTK_BOX (parent), w, TRUE, TRUE, 4); + parent = insert_fake_hbox (parent); + gtk_box_pack_start (GTK_BOX (parent), w, FALSE, FALSE, 4); } gtk_widget_show (spin); - if (row) - { - GtkWidget *hbox = gtk_hbox_new (FALSE, 0); - gtk_widget_show (hbox); - gtk_table_attach (GTK_TABLE (parent), hbox, 1, 3, - *row, *row + 1, - GTK_EXPAND | GTK_FILL, 0, 8, 0); - gtk_box_pack_start (GTK_BOX (hbox), spin, FALSE, FALSE, 0); - } - else - gtk_box_pack_start (GTK_BOX (parent), spin, FALSE, FALSE, 4); + gtk_box_pack_start (GTK_BOX (parent), spin, FALSE, FALSE, 4); p->widget = spin; break; @@ -1016,12 +953,10 @@ make_parameter_widget (const char *filename, case BOOLEAN: { p->widget = gtk_check_button_new_with_label (_(label)); - if (row) - gtk_table_attach (GTK_TABLE (parent), p->widget, 0, 3, - *row, *row + 1, - GTK_EXPAND | GTK_FILL, 0, 0, 0); - else - gtk_box_pack_start (GTK_BOX (parent), p->widget, FALSE, FALSE, 4); + /* Let these stretch -- doesn't hurt. + parent = insert_fake_hbox (parent); + */ + gtk_box_pack_start (GTK_BOX (parent), p->widget, FALSE, FALSE, 4); break; } case SELECT: @@ -1030,17 +965,6 @@ make_parameter_widget (const char *filename, GtkWidget *menu = gtk_menu_new (); GList *opts; - if (label && row) - { - GtkWidget *w = gtk_label_new (_(label)); - gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT); - gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5); - gtk_widget_show (w); - gtk_table_attach (GTK_TABLE (parent), w, 0, 3, *row, *row + 1, - GTK_EXPAND | GTK_FILL, 0, 0, 0); - (*row)++; - } - for (opts = p->options; opts; opts = opts->next) { parameter *s = (parameter *) opts->data; @@ -1051,12 +975,8 @@ make_parameter_widget (const char *filename, gtk_option_menu_set_menu (GTK_OPTION_MENU (opt), menu); p->widget = opt; - if (row) - gtk_table_attach (GTK_TABLE (parent), p->widget, 0, 3, - *row, *row + 1, - GTK_EXPAND | GTK_FILL, 0, 0, 0); - else - gtk_box_pack_start (GTK_BOX (parent), p->widget, TRUE, TRUE, 4); + parent = insert_fake_hbox (parent); + gtk_box_pack_start (GTK_BOX (parent), p->widget, FALSE, FALSE, 4); break; } @@ -1073,8 +993,6 @@ make_parameter_widget (const char *filename, { gtk_widget_set_name (p->widget, (char *) p->id); gtk_widget_show (p->widget); - if (row) - (*row)++; } } @@ -1360,25 +1278,29 @@ parameter_to_switch (parameter *p) All arguments will be properly quoted. */ static char * -parameters_to_cmd_line (GList *parms) +parameters_to_cmd_line (GList *parms, gboolean default_p) { int L = g_list_length (parms); int LL = 0; char **strs = (char **) calloc (sizeof (*parms), L); char *result; char *out; - int i; + int i, j; - for (i = 0; parms; parms = parms->next, i++) + for (i = 0, j = 0; parms; parms = parms->next, i++) { - char *s = parameter_to_switch ((parameter *) parms->data); - strs[i] = s; - LL += (s ? strlen(s) : 0) + 1; + parameter *p = (parameter *) parms->data; + if (!default_p || p->type == COMMAND) + { + char *s = parameter_to_switch (p); + strs[j++] = s; + LL += (s ? strlen(s) : 0) + 1; + } } result = (char *) malloc (LL + 10); out = result; - for (i = 0; i < L; i++) + for (i = 0; i < j; i++) if (strs[i]) { strcpy (out, strs[i]); @@ -1777,6 +1699,8 @@ get_description (GList *parms, gboolean verbose_p) s++; else if (s[1] == ' ' || s[1] == '\t') s++; /* next line is indented: leave newline */ + else if (!strncmp(s+1, "http:", 5)) + s++; /* next line begins a URL: leave newline */ else s[0] = ' '; /* delete newline to un-fold this line */ } @@ -1865,7 +1789,7 @@ load_configurator_1 (const char *program, const char *arguments, char chars[1024]; xmlParserCtxtPtr ctxt; xmlDocPtr doc = 0; - GtkWidget *table; + GtkWidget *vbox0; GList *parms; if (verbose_p) @@ -1889,13 +1813,10 @@ load_configurator_1 (const char *program, const char *arguments, /* Parsed the XML file. Now make some widgets. */ - table = gtk_table_new (1, 3, FALSE); - gtk_table_set_row_spacings (GTK_TABLE (table), 4); - gtk_table_set_col_spacings (GTK_TABLE (table), 4); - gtk_container_set_border_width (GTK_CONTAINER (table), 8); - gtk_widget_show (table); + vbox0 = gtk_vbox_new (FALSE, 0); + gtk_widget_show (vbox0); - parms = make_parameters (file, doc->xmlRootNode, table); + parms = make_parameters (file, doc->xmlRootNode, vbox0); sanity_check_parameters (file, parms); xmlFreeDoc (doc); @@ -1904,7 +1825,7 @@ load_configurator_1 (const char *program, const char *arguments, if (arguments && *arguments) parse_command_line_into_parameters (program, arguments, parms); - data->widget = table; + data->widget = vbox0; data->parameters = parms; data->description = get_description (parms, verbose_p); } @@ -1982,9 +1903,9 @@ load_configurator (const char *full_command_line, gboolean verbose_p) char * -get_configurator_command_line (conf_data *data) +get_configurator_command_line (conf_data *data, gboolean default_p) { - char *args = parameters_to_cmd_line (data->parameters); + char *args = parameters_to_cmd_line (data->parameters, default_p); char *result = (char *) malloc (strlen (data->progname) + strlen (args) + 2); strcpy (result, data->progname); diff --git a/driver/demo-Gtk-conf.h b/driver/demo-Gtk-conf.h index 9292d810..f462152c 100644 --- a/driver/demo-Gtk-conf.h +++ b/driver/demo-Gtk-conf.h @@ -1,5 +1,5 @@ /* demo-Gtk-conf.c --- implements the dynamic configuration dialogs. - * xscreensaver, Copyright (c) 2001, 2002 Jamie Zawinski + * xscreensaver, Copyright (c) 2001-2008 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 @@ -22,7 +22,7 @@ typedef struct { } conf_data; extern conf_data *load_configurator (const char *cmd_line, gboolean verbose_p); -extern char *get_configurator_command_line (conf_data *); +extern char *get_configurator_command_line (conf_data *, gboolean default_p); extern void set_configurator_command_line (conf_data *, const char *cmd_line); extern void free_conf_data (conf_data *); diff --git a/driver/demo-Gtk-stubs.h b/driver/demo-Gtk-stubs.h index 65d65487..c897d3ed 100644 --- a/driver/demo-Gtk-stubs.h +++ b/driver/demo-Gtk-stubs.h @@ -77,6 +77,10 @@ void settings_std_cb (GtkButton *button, gpointer user_data); +void +settings_reset_cb (GtkButton *button, + gpointer user_data); + void settings_ok_cb (GtkButton *button, gpointer user_data); diff --git a/driver/demo-Gtk-widgets.c b/driver/demo-Gtk-widgets.c index 3ac260ae..176eaf68 100644 --- a/driver/demo-Gtk-widgets.c +++ b/driver/demo-Gtk-widgets.c @@ -1431,6 +1431,7 @@ create_xscreensaver_settings_dialog (void) GtkWidget *dialog_hbuttonbox; GtkWidget *adv_button; GtkWidget *std_button; + GtkWidget *reset_button; GtkWidget *ok_cancel_hbuttonbox; GtkWidget *ok_button; GtkWidget *cancel_button; @@ -1697,6 +1698,16 @@ create_xscreensaver_settings_dialog (void) STFU GTK_WIDGET_SET_FLAGS (std_button, GTK_CAN_DEFAULT); gtk_tooltips_set_tip (tooltips, std_button, _("Back to the graphical configuration options."), NULL); + reset_button = gtk_button_new_with_label (_("Reset to Defaults")); + gtk_widget_set_name (reset_button, "reset_button"); + gtk_widget_ref (reset_button); + gtk_object_set_data_full (GTK_OBJECT (xscreensaver_settings_dialog), "reset_button", reset_button, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (reset_button); + gtk_container_add (GTK_CONTAINER (dialog_hbuttonbox), reset_button); + STFU GTK_WIDGET_SET_FLAGS (reset_button, GTK_CAN_DEFAULT); + gtk_tooltips_set_tip (tooltips, reset_button, _("Reset this screen saver to the default settings."), NULL); + ok_cancel_hbuttonbox = gtk_hbutton_box_new (); gtk_widget_set_name (ok_cancel_hbuttonbox, "ok_cancel_hbuttonbox"); gtk_widget_ref (ok_cancel_hbuttonbox); @@ -1736,6 +1747,9 @@ create_xscreensaver_settings_dialog (void) gtk_signal_connect (GTK_OBJECT (std_button), "clicked", GTK_SIGNAL_FUNC (settings_std_cb), NULL); + gtk_signal_connect (GTK_OBJECT (reset_button), "clicked", + GTK_SIGNAL_FUNC (settings_reset_cb), + NULL); gtk_signal_connect (GTK_OBJECT (ok_button), "clicked", GTK_SIGNAL_FUNC (settings_ok_cb), NULL); diff --git a/driver/demo-Gtk.c b/driver/demo-Gtk.c index 9ab83cbc..a62d0b77 100644 --- a/driver/demo-Gtk.c +++ b/driver/demo-Gtk.c @@ -267,6 +267,7 @@ void browse_text_program_cb (GtkButton *, gpointer user_data); void settings_cb (GtkButton *, gpointer user_data); void settings_adv_cb (GtkButton *, gpointer user_data); void settings_std_cb (GtkButton *, gpointer user_data); +void settings_reset_cb (GtkButton *, gpointer user_data); void settings_switch_page_cb (GtkNotebook *, GtkNotebookPage *, gint page_num, gpointer user_data); void settings_cancel_cb (GtkButton *, gpointer user_data); @@ -2253,7 +2254,7 @@ settings_sync_cmd_text (state *s) { # ifdef HAVE_XML GtkWidget *cmd = GTK_WIDGET (name_to_widget (s, "cmd_text")); - char *cmd_line = get_configurator_command_line (s->cdata); + char *cmd_line = get_configurator_command_line (s->cdata, False); gtk_entry_set_text (GTK_ENTRY (cmd), cmd_line); gtk_entry_set_position (GTK_ENTRY (cmd), strlen (cmd_line)); free (cmd_line); @@ -2284,6 +2285,20 @@ settings_std_cb (GtkButton *button, gpointer user_data) gtk_notebook_set_page (notebook, 0); } +G_MODULE_EXPORT void +settings_reset_cb (GtkButton *button, gpointer user_data) +{ +# ifdef HAVE_XML + state *s = global_state_kludge; /* I hate C so much... */ + GtkWidget *cmd = GTK_WIDGET (name_to_widget (s, "cmd_text")); + char *cmd_line = get_configurator_command_line (s->cdata, True); + gtk_entry_set_text (GTK_ENTRY (cmd), cmd_line); + gtk_entry_set_position (GTK_ENTRY (cmd), strlen (cmd_line)); + free (cmd_line); + populate_popup_window (s); +# endif /* HAVE_XML */ +} + G_MODULE_EXPORT void settings_switch_page_cb (GtkNotebook *notebook, GtkNotebookPage *page, gint page_num, gpointer user_data) @@ -3223,7 +3238,7 @@ populate_demo_window (state *s, int list_elt) screenhack *hack; char *pretty_name; GtkFrame *frame1 = GTK_FRAME (name_to_widget (s, "preview_frame")); - GtkFrame *frame2 = GTK_FRAME (name_to_widget (s, "doc_frame")); + GtkFrame *frame2 = GTK_FRAME (name_to_widget (s, "opt_frame")); GtkEntry *cmd = GTK_ENTRY (name_to_widget (s, "cmd_text")); GtkCombo *vis = GTK_COMBO (name_to_widget (s, "visual_combo")); GtkWidget *list = GTK_WIDGET (name_to_widget (s, "list")); @@ -4047,6 +4062,13 @@ update_subproc_timer (gpointer data) return FALSE; /* do not re-execute timer */ } +static int +settings_timer (gpointer data) +{ + settings_cb (0, 0); + return FALSE; +} + /* Call this when you think you might want a preview process running. It will set a timer that will actually launch that program a second @@ -4553,7 +4575,7 @@ static struct poptOption crapplet_options[] = { #endif /* HAVE_CRAPPLET */ #endif /* 0 */ -const char *usage = "[--display dpy] [--prefs]" +const char *usage = "[--display dpy] [--prefs | --settings]" # ifdef HAVE_CRAPPLET " [--crapplet]" # endif @@ -4654,7 +4676,8 @@ main (int argc, char **argv) XtAppContext app; state S, *s; saver_preferences *p; - Bool prefs = False; + Bool prefs_p = False; + Bool settings_p = False; int i; Display *dpy; Widget toplevel_shell; @@ -4920,7 +4943,9 @@ main (int argc, char **argv) if (str[0] == '-' && str[1] == '-') str++; if (!strcmp (str, "-prefs")) - prefs = True; + prefs_p = True; + else if (!strcmp (str, "-settings")) + settings_p = True; else if (crapplet_p) /* There are lots of random args that we don't care about when we're started as a crapplet, so just ignore unknown args in that case. */ @@ -5026,6 +5051,8 @@ main (int argc, char **argv) gtk_widget_set_sensitive (std, False); std = GTK_WIDGET (name_to_widget (s, "adv_button")); gtk_widget_hide (std); + std = GTK_WIDGET (name_to_widget (s, "reset_button")); + gtk_widget_hide (std); page = 1; # endif /* !HAVE_XML */ @@ -5090,7 +5117,7 @@ main (int argc, char **argv) /* Handle the -prefs command-line argument. */ - if (prefs) + if (prefs_p) { GtkNotebook *notebook = GTK_NOTEBOOK (name_to_widget (s, "notebook")); @@ -5180,6 +5207,11 @@ main (int argc, char **argv) gtk_timeout_add (60 * 1000, check_blanked_timer, s); + /* Handle the --settings command-line argument. */ + if (settings_p) + gtk_timeout_add (500, settings_timer, 0); + + /* Issue any warnings about the running xscreensaver daemon. */ if (! s->debug_p) the_network_is_not_the_computer (s); diff --git a/driver/screens.c b/driver/screens.c index cef66b78..6516ade7 100644 --- a/driver/screens.c +++ b/driver/screens.c @@ -98,6 +98,16 @@ * to put seperate savers on those duplicated-or-overlapping * monitors, xscreensaver just ignores them (which allows them to * display duplicates or overlaps). + * + * 5a) Nvidia fucks it up: + * + * Nvidia drivers as of Aug 2008 running in "TwinView" mode + * apparently report correct screen geometry via Xinerama, but + * report one giant screen via RANDR. The response from the + * nvidia developers is, "we don't support RANDR, use Xinerama + * instead." Which is a seriously lame answer. So, xscreensaver + * has to query *both* extensions, and make a guess as to which + * is to be believed. */ #ifdef HAVE_CONFIG_H @@ -143,6 +153,9 @@ struct _monitor { int enemy; /* which monitor it overlaps or duplicates */ }; +static Bool layouts_differ_p (monitor **a, monitor **b); + + static void free_monitors (monitor **monitors) { @@ -342,7 +355,7 @@ randr_scan_monitors (Display *dpy) for (i = 0, j = 0; i < ScreenCount (dpy); i++) { - Screen *screen = ScreenOfDisplay (dpy, j); + Screen *screen = ScreenOfDisplay (dpy, i); if (! new_randr_p) /* RANDR 1.0 */ { @@ -358,12 +371,17 @@ randr_scan_monitors (Display *dpy) SizeID size = -1; Rotation rot = ~0; XRRScreenSize *rrsizes; - int nsizes; + int nsizes = 0; size = XRRConfigCurrentConfiguration (rrc, &rot); rrsizes = XRRConfigSizes (rrc, &nsizes); - if (rot & (RR_Rotate_90|RR_Rotate_270)) + if (nsizes <= 0) /* WTF? Shouldn't happen but does. */ + { + m->width = DisplayWidth (dpy, i); + m->height = DisplayHeight (dpy, i); + } + else if (rot & (RR_Rotate_90|RR_Rotate_270)) { m->width = rrsizes[size].height; m->height = rrsizes[size].width; @@ -454,6 +472,66 @@ basic_scan_monitors (Display *dpy) } +#if defined(HAVE_RANDR) && defined(HAVE_XINERAMA) + +/* From: Aaron Plattner + Date: August 7, 2008 10:21:25 AM PDT + To: linux-bugs@nvidia.com + + The NVIDIA X driver does not yet support RandR 1.2. The X server has + a compatibility layer in it that allows RandR 1.2 clients to talk to + RandR 1.1 drivers through an RandR 1.2 pseudo-output called "default". + This reports the total combined resolution of the TwinView display, + since it doesn't have any visibility into TwinView metamodes. There + is no way for the driver to prevent the server from turning on this + compatibility layer. + + The intention is for X client applications to continue to use the + Xinerama extension to query the screen geometry. RandR 1.2 reports + its own Xinerama info for this purpose. I would recommend against + modifying xscreensaver to try to get this information from RandR. + */ +static monitor ** +randr_versus_xinerama_fight (Display *dpy, monitor **randr_monitors) +{ + monitor **xinerama_monitors; + + if (!randr_monitors) + return 0; + + xinerama_monitors = xinerama_scan_monitors (dpy); + if (!xinerama_monitors) + return randr_monitors; + + if (! layouts_differ_p (randr_monitors, xinerama_monitors)) + { + free_monitors (xinerama_monitors); + return randr_monitors; + } + else if ( randr_monitors[0] && !randr_monitors[1] && /* 1 monitor */ + xinerama_monitors[0] && xinerama_monitors[1]) /* >1 monitor */ + { + fprintf (stderr, + "%s: WARNING: RANDR reports 1 screen but Xinerama\n" + "%s: reports multiple. Believing Xinerama.\n", + blurb(), blurb()); + free_monitors (randr_monitors); + return xinerama_monitors; + } + else + { + fprintf (stderr, + "%s: WARNING: RANDR and Xinerama report different\n" + "%s: screen layouts! Believing RANDR.\n", + blurb(), blurb()); + free_monitors (xinerama_monitors); + return randr_monitors; + } +} + +#endif /* HAVE_RANDR && HAVE_XINERAMA */ + + #ifdef DEBUG_MULTISCREEN /* If DEBUG_MULTISCREEN is defined, then in "-debug" mode, xscreensaver @@ -557,13 +635,17 @@ scan_monitors (saver_info *si) # ifdef HAVE_RANDR if (! p->getviewport_full_of_lies_p) if (! monitors) monitors = randr_scan_monitors (si->dpy); -# endif + +# ifdef HAVE_XINERAMA + monitors = randr_versus_xinerama_fight (si->dpy, monitors); +# endif +# endif /* HAVE_RANDR */ # ifdef HAVE_XF86VMODE if (! monitors) monitors = vidmode_scan_monitors (si->dpy); # endif -# ifdef HAVE_XF86VMODE +# ifdef HAVE_XINERAMA if (! monitors) monitors = xinerama_scan_monitors (si->dpy); # endif @@ -598,6 +680,38 @@ monitors_overlap_p (monitor *a, monitor *b) } +static Bool +plausible_aspect_ratio_p (monitor **monitors) +{ + /* Modern wide-screen monitors come in the following aspect ratios: + + One monitor: If you tack a 640x480 monitor + onto the right, the ratio is: + 16 x 9 --> 1.78 + 852 x 480 --> 1.77 852+640 x 480 --> 3.11 "SD 480p" + 1280 x 720 --> 1.78 1280+640 x 720 --> 2.67 "HD 720p" + 1280 x 920 --> 1.39 1280+640 x 920 --> 2.09 + 1366 x 768 --> 1.78 1366+640 x 768 --> 2.61 "HD 768p" + 1440 x 900 --> 1.60 1440+640 x 900 --> 2.31 + 1680 x 1050 --> 1.60 1680+640 x 1050 --> 2.21 + 1690 x 1050 --> 1.61 1690+640 x 1050 --> 2.22 + 1920 x 1080 --> 1.78 1920+640 x 1080 --> 2.37 "HD 1080p" + 1920 x 1200 --> 1.60 1920+640 x 1200 --> 2.13 + 2560 x 1600 --> 1.60 2560+640 x 1600 --> 2.00 + + So that implies that if we ever see an aspect ratio >= 2.0, + we can be pretty sure that the X server is lying to us, and + that's actually two monitors, not one. + */ + if (monitors[0] && !monitors[1] && /* exactly 1 monitor */ + monitors[0]->height && + monitors[0]->width / (double) monitors[0]->height >= 1.9) + return False; + else + return True; +} + + /* Mark the ones that overlap, etc. */ static void @@ -624,6 +738,7 @@ check_monitor_sanity (monitor **monitors) if (i != j && monitors[i]->sanity == S_SANE && monitors[j]->sanity == S_SANE && + monitors[i]->screen == monitors[j]->screen && X2 >= X1 && Y2 >= Y1 && (X2+W2) <= (X1+W1) && @@ -648,6 +763,7 @@ check_monitor_sanity (monitor **monitors) { if (monitors[i]->sanity != S_SANE) continue; /* already marked */ if (monitors[j]->sanity != S_SANE) continue; + if (monitors[i]->screen != monitors[j]->screen) continue; if (monitors_overlap_p (monitors[i], monitors[j])) { @@ -656,17 +772,15 @@ check_monitor_sanity (monitor **monitors) } } - /* Finally, make sure all monitors are enclosed by their X screen. + /* Finally, make sure all monitors have sane positions and sizes. Xinerama sometimes reports 1024x768 VPs at -1936862040, -1953705044. */ for (i = 0; i < count; i++) { - int sw = WidthOfScreen (monitors[i]->screen) * 2; - int sh = HeightOfScreen (monitors[i]->screen) * 2; if (monitors[i]->sanity != S_SANE) continue; /* already marked */ - if (X1 < 0 || Y1 < 0 || - W1 <= 0 || H1 <= 0 || - X1+W1 > sw || Y1+H1 > sh) + if (X1 < 0 || Y1 < 0 || + W1 <= 0 || H1 <= 0 || + X1+W1 >= 0x7FFF || Y1+H1 >= 0x7FFF) { monitors[i]->sanity = S_OFFSCREEN; monitors[i]->enemy = 0; @@ -715,6 +829,8 @@ describe_monitor_layout (saver_info *si) int count = 0; int good_count = 0; int bad_count = 0; + int implausible_p = !plausible_aspect_ratio_p (monitors); + while (monitors[count]) { if (monitors[count]->sanity == S_SANE) @@ -778,6 +894,14 @@ describe_monitor_layout (saver_info *si) } } } + + if (implausible_p) + fprintf (stderr, + "%s: WARNING: single screen aspect ratio is %dx%d = %.2f\n" + "%s: probable X server bug in Xinerama/RANDR!\n", + blurb(), monitors[0]->width, monitors[0]->height, + monitors[0]->width / (double) monitors[0]->height, + blurb()); } } diff --git a/driver/test-screens.c b/driver/test-screens.c index 60bd569d..2fb3e35d 100644 --- a/driver/test-screens.c +++ b/driver/test-screens.c @@ -33,7 +33,7 @@ #define HeightOfScreen(s) 10240 #undef screen_number -#define screen_number(s) (0) +#define screen_number(s) ((int) s) #include "screens.c" /* to get at static void check_monitor_sanity() */ @@ -57,6 +57,7 @@ failstr (monitor_sanity san) case S_OVERLAP: return "OVR"; case S_OFFSCREEN: return "OFF"; case S_DISABLED: return "DIS"; + default: abort(); break; } } @@ -74,8 +75,12 @@ test (int testnum, const char *screens, const char *desired) monitor *m = calloc (1, sizeof (monitor)); char c; m->id = (testnum * 1000) + nscreens; - if (4 != sscanf (token, "%dx%d+%d+%d%c", - &m->width, &m->height, &m->x, &m->y, &c)) + if (5 == sscanf (token, "%dx%d+%d+%d@%d%c", + &m->width, &m->height, &m->x, &m->y, + (int *) &m->screen, &c)) + ; + else if (4 != sscanf (token, "%dx%d+%d+%d%c", + &m->width, &m->height, &m->x, &m->y, &c)) { fprintf (stderr, "%s: unparsable geometry: %s\n", blurb(), token); exit (1); @@ -94,7 +99,11 @@ test (int testnum, const char *screens, const char *desired) monitor *m = monitors[i]; if (out != result) *out++ = ','; if (m->sanity == S_SANE) - sprintf (out, "%dx%d+%d+%d", m->width, m->height, m->x, m->y); + { + sprintf (out, "%dx%d+%d+%d", m->width, m->height, m->x, m->y); + if (m->screen) + sprintf (out + strlen(out), "@%d", (int) m->screen); + } else strcpy (out, failstr (m->sanity)); out += strlen(out); @@ -135,6 +144,7 @@ run_tests(void) A("1024x768+0+0,1024x768+1024+0"); A("1024x768+0+0,1024x768+0+768"); A("1024x768+0+0,1024x768+0+768,1024x768+1024+0"); + A("800x600+0+0,800x600+0+0@1,800x600+10+0@2"); B("1024x768+999999+0", "OFF"); @@ -174,6 +184,8 @@ run_tests(void) "800x600+0+0,DUP,800x600+800+0"); B("1600x1200+0+0,1360x768+0+0", "1600x1200+0+0,ENC"); + B("1600x1200+0+0,1360x768+0+0,1600x1200+0+0@1,1360x768+0+0@1", + "1600x1200+0+0,ENC,1600x1200+0+0@1,ENC"); } diff --git a/driver/xscreensaver-demo.glade2 b/driver/xscreensaver-demo.glade2 index 92078445..d1c782a0 100644 --- a/driver/xscreensaver-demo.glade2 +++ b/driver/xscreensaver-demo.glade2 @@ -2,6 +2,7 @@ + XScreenSaver @@ -15,6 +16,8 @@ False GDK_WINDOW_TYPE_HINT_NORMAL GDK_GRAVITY_NORTH_WEST + True + False @@ -25,6 +28,8 @@ True + GTK_PACK_DIRECTION_LTR + GTK_PACK_DIRECTION_LTR @@ -180,6 +185,10 @@ 8 0 cycle_spinbutton + PANGO_ELLIPSIZE_NONE + -1 + False + 0 1 @@ -315,6 +324,10 @@ 0.5 8 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 3 @@ -338,6 +351,10 @@ 0.5 8 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 3 @@ -361,6 +378,10 @@ 0.5 8 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 3 @@ -385,6 +406,10 @@ 8 0 timeout_spinbutton + PANGO_ELLIPSIZE_NONE + -1 + False + 0 1 @@ -477,6 +502,10 @@ 0 0 mode_menu + PANGO_ELLIPSIZE_NONE + -1 + False + 0 0 @@ -573,6 +602,9 @@ True False True + False + False + False @@ -701,7 +733,7 @@ GTK_SHADOW_ETCHED_IN 0.5 0.5 - 1.33 + 1.33000004292 False @@ -729,6 +761,10 @@ 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 tab @@ -749,6 +785,10 @@ Available 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 False @@ -769,6 +809,10 @@ Available 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 tab @@ -789,6 +833,10 @@ Installed 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 False @@ -809,6 +857,10 @@ Installed 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 tab @@ -831,6 +883,10 @@ This probably means that the "xscreensaver-extras" and 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 False @@ -851,6 +907,10 @@ This probably means that the "xscreensaver-extras" and 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 tab @@ -872,6 +932,10 @@ This probably means that the "xscreensaver-extras" and 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 label_item @@ -909,6 +973,10 @@ This probably means that the "xscreensaver-extras" and 0 0 notebook + PANGO_ELLIPSIZE_NONE + -1 + False + 0 tab @@ -1043,6 +1111,10 @@ This probably means that the "xscreensaver-extras" and 0.5 8 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 0 @@ -1061,7 +1133,7 @@ This probably means that the "xscreensaver-extras" and 0 True - * + * False @@ -1119,6 +1191,10 @@ This probably means that the "xscreensaver-extras" and 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 label_item @@ -1307,7 +1383,7 @@ This probably means that the "xscreensaver-extras" and 0 True - * + * False @@ -1351,7 +1427,7 @@ This probably means that the "xscreensaver-extras" and 0 True - * + * False @@ -1375,7 +1451,7 @@ This probably means that the "xscreensaver-extras" and 0 True - * + * False @@ -1419,7 +1495,7 @@ This probably means that the "xscreensaver-extras" and 0 True - * + * False @@ -1455,6 +1531,10 @@ This probably means that the "xscreensaver-extras" and 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 label_item @@ -1551,6 +1631,10 @@ This probably means that the "xscreensaver-extras" and 10 0 dpms_standby_spinbutton + PANGO_ELLIPSIZE_NONE + -1 + False + 0 0 @@ -1576,6 +1660,10 @@ This probably means that the "xscreensaver-extras" and 10 0 dpms_suspend_spinbutton + PANGO_ELLIPSIZE_NONE + -1 + False + 0 0 @@ -1601,6 +1689,10 @@ This probably means that the "xscreensaver-extras" and 10 0 dpms_off_spinbutton + PANGO_ELLIPSIZE_NONE + -1 + False + 0 0 @@ -1625,6 +1717,10 @@ This probably means that the "xscreensaver-extras" and 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 2 @@ -1649,6 +1745,10 @@ This probably means that the "xscreensaver-extras" and 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 2 @@ -1673,6 +1773,10 @@ This probably means that the "xscreensaver-extras" and 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 2 @@ -1791,6 +1895,10 @@ This probably means that the "xscreensaver-extras" and 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 label_item @@ -1904,6 +2012,10 @@ This probably means that the "xscreensaver-extras" and 0.5 3 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 0 @@ -1926,6 +2038,10 @@ This probably means that the "xscreensaver-extras" and 0 0 fade_spinbutton + PANGO_ELLIPSIZE_NONE + -1 + False + 0 14 @@ -1970,6 +2086,10 @@ This probably means that the "xscreensaver-extras" and 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 2 @@ -2039,6 +2159,10 @@ This probably means that the "xscreensaver-extras" and 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 label_item @@ -2075,6 +2199,10 @@ This probably means that the "xscreensaver-extras" and 0 0 notebook + PANGO_ELLIPSIZE_NONE + -1 + False + 0 tab @@ -2150,6 +2278,8 @@ This probably means that the "xscreensaver-extras" and False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST + True + False False @@ -2191,6 +2321,20 @@ This probably means that the "xscreensaver-extras" and + + + True + True + True + _Reset to Defaults + True + GTK_RELIEF_NORMAL + True + 0 + + + + True @@ -2228,16 +2372,16 @@ This probably means that the "xscreensaver-extras" and - + True False - 8 + 0 True 0 - 0.5 + 0 GTK_SHADOW_ETCHED_IN @@ -2263,8 +2407,9 @@ This probably means that the "xscreensaver-extras" and - False + True True + GTK_PACK_END @@ -2281,6 +2426,10 @@ This probably means that the "xscreensaver-extras" and 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 tab @@ -2329,6 +2478,10 @@ This probably means that the "xscreensaver-extras" and 0 0 cmd_text + PANGO_ELLIPSIZE_NONE + -1 + False + 0 1 @@ -2349,7 +2502,7 @@ This probably means that the "xscreensaver-extras" and 0 True - * + * False @@ -2381,6 +2534,10 @@ This probably means that the "xscreensaver-extras" and 3 0 visual_entry + PANGO_ELLIPSIZE_NONE + -1 + False + 0 0 @@ -2407,7 +2564,7 @@ This probably means that the "xscreensaver-extras" and 0 True - * + * False @@ -2525,8 +2682,8 @@ This probably means that the "xscreensaver-extras" and 0 - True - True + False + False @@ -2559,6 +2716,10 @@ This probably means that the "xscreensaver-extras" and 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 tab @@ -2580,6 +2741,10 @@ This probably means that the "xscreensaver-extras" and 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 label_item @@ -2597,8 +2762,8 @@ This probably means that the "xscreensaver-extras" and True 0 - 0.5 - GTK_SHADOW_ETCHED_IN + 0 + GTK_SHADOW_NONE @@ -2617,31 +2782,14 @@ This probably means that the "xscreensaver-extras" and GTK_JUSTIFY_LEFT True True - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 + 0 + 0 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 0 @@ -2651,14 +2799,28 @@ This probably means that the "xscreensaver-extras" and - + True - True - _Documentation... - True - GTK_RELIEF_NORMAL - True - + False + 0 + + + + True + True + _Documentation... + True + GTK_RELIEF_NORMAL + True + + + + 0 + False + False + GTK_PACK_END + + 0 @@ -2672,7 +2834,7 @@ This probably means that the "xscreensaver-extras" and True - Description + False False GTK_JUSTIFY_LEFT @@ -2682,6 +2844,10 @@ This probably means that the "xscreensaver-extras" and 0.5 0 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 label_item @@ -2690,8 +2856,8 @@ This probably means that the "xscreensaver-extras" and 0 - True - True + False + False diff --git a/driver/xscreensaver.c b/driver/xscreensaver.c index 2fb1ecd3..1ac1d68c 100644 --- a/driver/xscreensaver.c +++ b/driver/xscreensaver.c @@ -166,14 +166,52 @@ # include "xmu.h" #endif /* !HAVE_XMU */ +#ifdef HAVE_MIT_SAVER_EXTENSION +#include +#endif /* HAVE_MIT_SAVER_EXTENSION */ + #ifdef HAVE_XIDLE_EXTENSION # include #endif /* HAVE_XIDLE_EXTENSION */ +#ifdef HAVE_SGI_VC_EXTENSION +# include +#endif /* HAVE_SGI_VC_EXTENSION */ + +#ifdef HAVE_READ_DISPLAY_EXTENSION +# include +#endif /* HAVE_READ_DISPLAY_EXTENSION */ + +#ifdef HAVE_XSHM_EXTENSION +# include +#endif /* HAVE_XSHM_EXTENSION */ + +#ifdef HAVE_DPMS_EXTENSION +# include +#endif /* HAVE_DPMS_EXTENSION */ + + +#ifdef HAVE_DOUBLE_BUFFER_EXTENSION +# include +#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */ + +#ifdef HAVE_XF86VMODE +# include +#endif /* HAVE_XF86VMODE */ + +#ifdef HAVE_XF86MISCSETGRABKEYSSTATE +# include +#endif /* HAVE_XF86MISCSETGRABKEYSSTATE */ + #ifdef HAVE_XINERAMA # include #endif /* HAVE_XINERAMA */ +#ifdef HAVE_RANDR +# include +#endif /* HAVE_RANDR */ + + #include "xscreensaver.h" #include "version.h" #include "yarandom.h" @@ -827,13 +865,22 @@ initialize_server_extensions (saver_info *si) si->using_proc_interrupts = p->use_proc_interrupts; #ifdef HAVE_XIDLE_EXTENSION - server_has_xidle_extension_p = query_xidle_extension (si); + { + int ev, er; + server_has_xidle_extension_p = XidleQueryExtension (si->dpy, &ev, &er); + } #endif #ifdef HAVE_SGI_SAVER_EXTENSION - server_has_sgi_saver_extension_p = query_sgi_saver_extension (si); + server_has_sgi_saver_extension_p = + XScreenSaverQueryExtension (si->dpy, + &si->sgi_saver_ext_event_number, + &si->sgi_saver_ext_error_number); #endif #ifdef HAVE_MIT_SAVER_EXTENSION - server_has_mit_saver_extension_p = query_mit_saver_extension (si); + server_has_mit_saver_extension_p = + XScreenSaverQueryExtension (si->dpy, + &si->mit_saver_ext_event_number, + &si->mit_saver_ext_error_number); #endif #ifdef HAVE_PROC_INTERRUPTS system_has_proc_interrupts_p = query_proc_interrupts_available (si, &piwhy); @@ -875,8 +922,23 @@ initialize_server_extensions (saver_info *si) } #ifdef HAVE_RANDR - query_randr_extension (si); -#endif + if (XRRQueryExtension (si->dpy, + &si->randr_event_number, &si->randr_error_number)) + { + int nscreens = ScreenCount (si->dpy); /* number of *real* screens */ + int i; + + if (p->verbose_p) + fprintf (stderr, "%s: selecting RANDR events\n", blurb()); + for (i = 0; i < nscreens; i++) +# ifdef RRScreenChangeNotifyMask /* randr.h 1.5, 2002/09/29 */ + XRRSelectInput (si->dpy, RootWindow (si->dpy, i), + RRScreenChangeNotifyMask); +# else /* !RRScreenChangeNotifyMask */ /* Xrandr.h 1.4, 2001/06/07 */ + XRRScreenChangeSelectInput (si->dpy, RootWindow (si->dpy, i), True); +# endif /* !RRScreenChangeNotifyMask */ + } +# endif /* HAVE_RANDR */ if (!system_has_proc_interrupts_p) { @@ -1959,91 +2021,111 @@ analyze_display (saver_info *si) { int i, j; static struct { - const char *name; const char *desc; Bool useful_p; + const char *name; const char *desc; + Bool useful_p; + Status (*version_fn) (Display *, int *majP, int *minP); } exts[] = { { "SCREEN_SAVER", /* underscore */ "SGI Screen-Saver", # ifdef HAVE_SGI_SAVER_EXTENSION - True + True, 0 # else - False + False, 0 # endif }, { "SCREEN-SAVER", /* dash */ "SGI Screen-Saver", # ifdef HAVE_SGI_SAVER_EXTENSION - True + True, 0 # else - False + False, 0 # endif }, { "MIT-SCREEN-SAVER", "MIT Screen-Saver", # ifdef HAVE_MIT_SAVER_EXTENSION - True + True, XScreenSaverQueryVersion # else - False + False, 0 # endif }, { "XIDLE", "XIdle", # ifdef HAVE_XIDLE_EXTENSION - True + True, 0 # else - False + False, 0 # endif }, { "SGI-VIDEO-CONTROL", "SGI Video-Control", # ifdef HAVE_SGI_VC_EXTENSION - True + True, XSGIvcQueryVersion # else - False + False, 0 # endif }, { "READDISPLAY", "SGI Read-Display", # ifdef HAVE_READ_DISPLAY_EXTENSION - True + True, XReadDisplayQueryVersion # else - False + False, 0 # endif }, { "MIT-SHM", "Shared Memory", # ifdef HAVE_XSHM_EXTENSION - True + True, (Status (*) (Display*,int*,int*)) XShmQueryVersion /* 4 args */ # else - False + False, 0 # endif }, { "DOUBLE-BUFFER", "Double-Buffering", # ifdef HAVE_DOUBLE_BUFFER_EXTENSION - True + True, XdbeQueryExtension # else - False + False, 0 # endif }, { "DPMS", "Power Management", # ifdef HAVE_DPMS_EXTENSION - True + True, DPMSGetVersion # else - False + False, 0 # endif }, { "GLX", "GLX", # ifdef HAVE_GL - True + True, 0 # else - False + False, 0 # endif }, { "XFree86-VidModeExtension", "XF86 Video-Mode", # ifdef HAVE_XF86VMODE - True + True, XF86VidModeQueryVersion +# else + False, 0 +# endif + }, { "XC-VidModeExtension", "XC Video-Mode", +# ifdef HAVE_XF86VMODE + True, XF86VidModeQueryVersion +# else + False, 0 +# endif + }, { "XFree86-MISC", "XF86 Misc", +# ifdef HAVE_XF86MISCSETGRABKEYSSTATE + True, XF86MiscQueryVersion # else - False + False, 0 +# endif + }, { "XC-MISC", "XC Misc", +# ifdef HAVE_XF86MISCSETGRABKEYSSTATE + True, XF86MiscQueryVersion +# else + False, 0 # endif }, { "XINERAMA", "Xinerama", # ifdef HAVE_XINERAMA - True + True, XineramaQueryVersion # else - False + False, 0 # endif }, { "RANDR", "Resize-and-Rotate", # ifdef HAVE_RANDR - True + True, XRRQueryVersion # else - False + False, 0 # endif }, { "DRI", "DRI", - True + True, 0 }, { "Apple-DRI", "Apple-DRI (XDarwin)", - True + True, 0 }, }; @@ -2057,12 +2139,31 @@ analyze_display (saver_info *si) { int op = 0, event = 0, error = 0; char buf [255]; + int maj = 0, min = 0; + int dummy1, dummy2, dummy3; int j; + + /* Most of the extension version functions take 3 args, + writing results into args 2 and 3, but some take more. + We only ever care about the first two results, but we + pass in three extra pointers just in case. + */ + Status (*version_fn_2) (Display*,int*,int*,int*,int*,int*) = + (Status (*) (Display*,int*,int*,int*,int*,int*)) exts[i].version_fn; + if (!XQueryExtension (si->dpy, exts[i].name, &op, &event, &error)) continue; sprintf (buf, "%s: ", blurb()); j = strlen (buf); strcat (buf, exts[i].desc); + + if (!version_fn_2) + ; + else if (version_fn_2 (si->dpy, &maj, &min, &dummy1, &dummy2, &dummy3)) + sprintf (buf+strlen(buf), " (%d.%d)", maj, min); + else + strcat (buf, " (unavailable)"); + if (!exts[i].useful_p) strcat (buf, " (disabled at compile time)"); fprintf (stderr, "%s\n", buf); diff --git a/driver/xscreensaver.h b/driver/xscreensaver.h index 6c7e3174..09f5ea94 100644 --- a/driver/xscreensaver.h +++ b/driver/xscreensaver.h @@ -42,18 +42,6 @@ extern Bool restore_real_vroot (saver_info *si); extern void disable_builtin_screensaver (saver_info *, Bool unblank_screen_p); extern Bool ensure_no_screensaver_running (Display *, Screen *); -#ifdef HAVE_MIT_SAVER_EXTENSION -extern Bool query_mit_saver_extension (saver_info *); -#endif -#ifdef HAVE_SGI_SAVER_EXTENSION -extern Bool query_sgi_saver_extension (saver_info *); -#endif -#ifdef HAVE_XIDLE_EXTENSION -extern Bool query_xidle_extension (saver_info *); -#endif -#ifdef HAVE_RANDR -extern Bool query_randr_extension (saver_info *); -#endif #ifdef HAVE_PROC_INTERRUPTS extern Bool query_proc_interrupts_available (saver_info *, const char **why); #endif diff --git a/driver/xset.c b/driver/xset.c index 99d11c2f..8378e1cf 100644 --- a/driver/xset.c +++ b/driver/xset.c @@ -1,5 +1,5 @@ /* xset.c --- interacting with server extensions and the builtin screensaver. - * xscreensaver, Copyright (c) 1991-2005 Jamie Zawinski + * xscreensaver, Copyright (c) 1991-2008 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 @@ -42,14 +42,6 @@ ERROR! You must not include vroot.h in this file. # include -Bool -query_mit_saver_extension (saver_info *si) -{ - return XScreenSaverQueryExtension (si->dpy, - &si->mit_saver_ext_event_number, - &si->mit_saver_ext_error_number); -} - static int ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error) { @@ -101,14 +93,6 @@ init_mit_saver_extension (saver_info *si) # include -Bool -query_sgi_saver_extension (saver_info *si) -{ - return XScreenSaverQueryExtension (si->dpy, - &si->sgi_saver_ext_event_number, - &si->sgi_saver_ext_error_number); -} - static void init_sgi_saver_extension (saver_info *si) { @@ -137,62 +121,6 @@ init_sgi_saver_extension (saver_info *si) #endif /* HAVE_SGI_SAVER_EXTENSION */ - -/* XIDLE server extension hackery. - */ - -#ifdef HAVE_XIDLE_EXTENSION - -# include - -Bool -query_xidle_extension (saver_info *si) -{ - int event_number; - int error_number; - return XidleQueryExtension (si->dpy, &event_number, &error_number); -} - -#endif /* HAVE_XIDLE_EXTENSION */ - - - -/* Resize and Rotate server extension hackery. - */ - -#ifdef HAVE_RANDR - -# include - -Bool -query_randr_extension (saver_info *si) -{ - saver_preferences *p = &si->prefs; - Bool ok = XRRQueryExtension (si->dpy, - &si->randr_event_number, - &si->randr_error_number); - - if (ok) - { - int nscreens = ScreenCount (si->dpy); /* number of *real* screens */ - int i; - - if (p->verbose_p) - fprintf (stderr, "%s: selecting RANDR events\n", blurb()); - for (i = 0; i < nscreens; i++) -# ifdef RRScreenChangeNotifyMask /* randr.h 1.5, 2002/09/29 */ - XRRSelectInput (si->dpy, RootWindow (si->dpy, i), - RRScreenChangeNotifyMask); -# else /* !RRScreenChangeNotifyMask */ /* Xrandr.h 1.4, 2001/06/07 */ - XRRScreenChangeSelectInput (si->dpy, RootWindow (si->dpy, i), True); -# endif /* !RRScreenChangeNotifyMask */ - } - - return ok; -} - -#endif /* HAVE_RANDR */ - /* Figuring out what the appropriate XSetScreenSaver() parameters are diff --git a/hacks/Makefile.in b/hacks/Makefile.in index 898853ca..6c3954a1 100644 --- a/hacks/Makefile.in +++ b/hacks/Makefile.in @@ -92,7 +92,7 @@ SRCS = attraction.c blitspin.c bouboule.c braid.c bubbles.c \ maze.c moire.c noseguy.c pedal.c penrose.c pyro.c qix.c \ rocks.c rorschach.c screenhack.c sierpinski.c slidescreen.c \ slip.c sphere.c spiral.c strange.c swirl.c xlockmore.c \ - goop.c starfish.c munch.c fadeplot.c \ + fps.c goop.c starfish.c munch.c fadeplot.c \ rd-bomb.c coral.c mountain.c triangle.c lissie.c worm.c \ rotor.c ant.c xjack.c xlyap.c jigsaw.c xscreensaver-sgigl.c \ cynosure.c moire2.c flow.c epicycle.c interference.c \ @@ -131,7 +131,7 @@ OBJS = attraction.o blitspin.o bouboule.o braid.o bubbles.o \ maze.o moire.o noseguy.o pedal.o penrose.o pyro.o qix.o \ rocks.o rorschach.o screenhack.o sierpinski.o slidescreen.o \ slip.o sphere.o spiral.o strange.o swirl.o xlockmore.o \ - goop.o starfish.o munch.o fadeplot.o \ + fps.o goop.o starfish.o munch.o fadeplot.o \ rd-bomb.o coral.o mountain.o triangle.o lissie.o worm.o \ rotor.o ant.o xjack.o xlyap.o jigsaw.o xscreensaver-sgigl.o \ cynosure.o moire2.o flow.o epicycle.o interference.o \ @@ -165,7 +165,7 @@ NEXES = attraction blitspin bouboule braid bubbles decayscreen deco \ interference truchet bsod crystal discrete distort kumppa \ demon loop t3d penetrate deluxe compass squiral xflame \ wander spotlight critical phosphor xmatrix petri shadebobs \ - xsublim ccurve blaster bumps ripples xspirograph \ + ccurve blaster bumps ripples xspirograph \ nerverot xrayswarm hyperball zoom whirlwindwarp rotzoomer \ whirlygig speedmine vermiculate twang apollonian euler2d \ juggle polyominoes thornbird fluidballs anemone halftone \ @@ -179,7 +179,7 @@ SEXES = sonar JPEG_EXES = webcollage-helper EXES = $(NEXES) $(SEXES) -HACK_OBJS_1 = $(UTILS_BIN)/resources.o $(UTILS_BIN)/visual.o \ +HACK_OBJS_1 = fps.o $(UTILS_BIN)/resources.o $(UTILS_BIN)/visual.o \ $(UTILS_BIN)/usleep.o $(UTILS_BIN)/yarandom.o @XMU_OBJS@ HACK_OBJS = screenhack.o $(HACK_OBJS_1) XLOCK_OBJS = screenhack.o xlockmore.o $(COLOR_OBJS) $(HACK_OBJS_1) @@ -188,9 +188,10 @@ GRAB_OBJS = $(UTILS_BIN)/grabclient.o XSHM_OBJS = $(UTILS_BIN)/xshm.o XDBE_OBJS = $(UTILS_BIN)/xdbe.o -HDRS = screenhack.h screenhackI.h xlockmore.h xlockmoreI.h \ - automata.h bubbles.h bumps.h xpm-pixmap.h apple2.h \ - analogtv.h pacman.h pacman_ai.h pacman_level.h asm6502.h +HDRS = screenhack.h screenhackI.h fps.h fpsI.h xlockmore.h \ + xlockmoreI.h automata.h bubbles.h xpm-pixmap.h \ + apple2.h analogtv.h pacman.h pacman_ai.h pacman_level.h \ + asm6502.h MEN = anemone.man apollonian.man attraction.man \ blaster.man blitspin.man bouboule.man braid.man bsod.man \ bubbles.man bumps.man ccurve.man compass.man coral.man \ @@ -225,7 +226,7 @@ MEN = anemone.man apollonian.man attraction.man \ lcdscrub.man STAR = * EXTRAS = README Makefile.in xml2man.pl m6502.sh .gdbinit \ - euler2d.tex \ + euler2d.tex check-configs.pl munge-ad.pl \ config/README \ config/$(STAR).xml \ config/$(STAR).dtd \ @@ -447,27 +448,13 @@ check_men: done ; \ fi -check_xml: - @badxml="" ; \ - for exe in $(EXES) $(SCRIPTS); do \ - if ! [ -f $(srcdir)/config/$$exe.xml \ - -o "$$exe" = webcollage-helper \ - -o "$$exe" = xsublim \ - -o "$$exe" = ljlatest ]; then \ - badxml="$$badxml $$exe" ; \ - fi ; \ - done ; \ - if [ -n "$$badxml" ]; then \ - echo "" ; \ - echo "Warning: The following programs have no configurators:" ; \ - echo "" ; \ - for m in $$badxml ; do \ - echo " $$m" ; \ - done ; \ - echo "" ; \ - fi - +validate_xml: + @echo "Validating XML..." ; \ + cd $(srcdir) ; ./check-configs.pl $(EXES) +munge_ad_file: + @echo "Updating hack list in XScreenSaver.ad.in..." ; \ + cd $(srcdir) ; ./munge-ad.pl ../driver/XScreenSaver.ad.in # Rules for generating the VMS makefiles on Unix, so that it doesn't have to @@ -518,7 +505,7 @@ $(srcdir)/../setup.com: Makefile.in distdepend:: compile_axp.com compile_decc.com distdepend:: link_axp.com link_decc.com distdepend:: $(srcdir)/../setup.com -distdepend:: check_men check_xml +distdepend:: check_men validate_xml munge_ad_file # Rules for noticing when the objects from the utils directory are out of @@ -1009,6 +996,7 @@ webcollage-helper: webcollage-helper.o # DO NOT DELETE: updated by make distdepend abstractile.o: ../config.h +abstractile.o: $(srcdir)/fps.h abstractile.o: $(srcdir)/screenhackI.h abstractile.o: $(srcdir)/screenhack.h abstractile.o: $(UTILS_SRC)/colors.h @@ -1027,6 +1015,7 @@ analogtv.o: $(UTILS_SRC)/utils.h analogtv.o: $(UTILS_SRC)/xshm.h analogtv.o: $(UTILS_SRC)/yarandom.h anemone.o: ../config.h +anemone.o: $(srcdir)/fps.h anemone.o: $(srcdir)/screenhackI.h anemone.o: $(srcdir)/screenhack.h anemone.o: $(UTILS_SRC)/colors.h @@ -1038,6 +1027,7 @@ anemone.o: $(UTILS_SRC)/visual.h anemone.o: $(UTILS_SRC)/xdbe.h anemone.o: $(UTILS_SRC)/yarandom.h anemotaxis.o: ../config.h +anemotaxis.o: $(srcdir)/fps.h anemotaxis.o: $(srcdir)/screenhackI.h anemotaxis.o: $(srcdir)/screenhack.h anemotaxis.o: $(UTILS_SRC)/colors.h @@ -1050,6 +1040,7 @@ anemotaxis.o: $(UTILS_SRC)/xdbe.h anemotaxis.o: $(UTILS_SRC)/yarandom.h ant.o: $(srcdir)/automata.h ant.o: ../config.h +ant.o: $(srcdir)/fps.h ant.o: $(srcdir)/screenhackI.h ant.o: $(UTILS_SRC)/colors.h ant.o: $(UTILS_SRC)/erase.h @@ -1063,6 +1054,7 @@ ant.o: $(UTILS_SRC)/yarandom.h ant.o: $(srcdir)/xlockmoreI.h ant.o: $(srcdir)/xlockmore.h apollonian.o: ../config.h +apollonian.o: $(srcdir)/fps.h apollonian.o: $(srcdir)/screenhackI.h apollonian.o: $(UTILS_SRC)/colors.h apollonian.o: $(UTILS_SRC)/erase.h @@ -1078,6 +1070,7 @@ apollonian.o: $(srcdir)/xlockmore.h apple2-main.o: $(srcdir)/analogtv.h apple2-main.o: $(srcdir)/apple2.h apple2-main.o: ../config.h +apple2-main.o: $(srcdir)/fps.h apple2-main.o: $(srcdir)/screenhackI.h apple2-main.o: $(srcdir)/screenhack.h apple2-main.o: $(UTILS_SRC)/colors.h @@ -1091,6 +1084,7 @@ apple2-main.o: $(UTILS_SRC)/yarandom.h apple2.o: $(srcdir)/analogtv.h apple2.o: $(srcdir)/apple2.h apple2.o: ../config.h +apple2.o: $(srcdir)/fps.h apple2.o: $(srcdir)/images/apple2font.xbm apple2.o: $(srcdir)/screenhackI.h apple2.o: $(UTILS_SRC)/colors.h @@ -1103,6 +1097,7 @@ apple2.o: $(UTILS_SRC)/xshm.h apple2.o: $(UTILS_SRC)/yarandom.h asm6502.o: $(srcdir)/asm6502.h attraction.o: ../config.h +attraction.o: $(srcdir)/fps.h attraction.o: $(srcdir)/screenhackI.h attraction.o: $(srcdir)/screenhack.h attraction.o: $(UTILS_SRC)/colors.h @@ -1114,6 +1109,7 @@ attraction.o: $(UTILS_SRC)/usleep.h attraction.o: $(UTILS_SRC)/visual.h attraction.o: $(UTILS_SRC)/yarandom.h barcode.o: ../config.h +barcode.o: $(srcdir)/fps.h barcode.o: $(srcdir)/screenhackI.h barcode.o: $(srcdir)/screenhack.h barcode.o: $(UTILS_SRC)/colors.h @@ -1124,6 +1120,7 @@ barcode.o: $(UTILS_SRC)/usleep.h barcode.o: $(UTILS_SRC)/visual.h barcode.o: $(UTILS_SRC)/yarandom.h blaster.o: ../config.h +blaster.o: $(srcdir)/fps.h blaster.o: $(srcdir)/screenhackI.h blaster.o: $(srcdir)/screenhack.h blaster.o: $(UTILS_SRC)/colors.h @@ -1134,6 +1131,7 @@ blaster.o: $(UTILS_SRC)/usleep.h blaster.o: $(UTILS_SRC)/visual.h blaster.o: $(UTILS_SRC)/yarandom.h blitspin.o: ../config.h +blitspin.o: $(srcdir)/fps.h blitspin.o: $(srcdir)/images/som.xbm blitspin.o: $(srcdir)/screenhackI.h blitspin.o: $(srcdir)/screenhack.h @@ -1146,6 +1144,7 @@ blitspin.o: $(UTILS_SRC)/visual.h blitspin.o: $(UTILS_SRC)/yarandom.h blitspin.o: $(srcdir)/xpm-pixmap.h bouboule.o: ../config.h +bouboule.o: $(srcdir)/fps.h bouboule.o: $(srcdir)/screenhackI.h bouboule.o: $(UTILS_SRC)/colors.h bouboule.o: $(UTILS_SRC)/grabscreen.h @@ -1158,6 +1157,7 @@ bouboule.o: $(UTILS_SRC)/yarandom.h bouboule.o: $(srcdir)/xlockmoreI.h bouboule.o: $(srcdir)/xlockmore.h boxfit.o: ../config.h +boxfit.o: $(srcdir)/fps.h boxfit.o: $(srcdir)/screenhackI.h boxfit.o: $(srcdir)/screenhack.h boxfit.o: $(UTILS_SRC)/colors.h @@ -1169,6 +1169,7 @@ boxfit.o: $(UTILS_SRC)/visual.h boxfit.o: $(UTILS_SRC)/yarandom.h boxfit.o: $(srcdir)/xpm-pixmap.h braid.o: ../config.h +braid.o: $(srcdir)/fps.h braid.o: $(srcdir)/screenhackI.h braid.o: $(UTILS_SRC)/colors.h braid.o: $(UTILS_SRC)/erase.h @@ -1184,6 +1185,7 @@ braid.o: $(srcdir)/xlockmore.h bsod.o: $(srcdir)/analogtv.h bsod.o: $(srcdir)/apple2.h bsod.o: ../config.h +bsod.o: $(srcdir)/fps.h bsod.o: $(srcdir)/images/amiga.xpm bsod.o: $(srcdir)/images/atari.xbm bsod.o: $(srcdir)/images/atm.xbm @@ -1252,6 +1254,7 @@ bubbles-default.o: $(srcdir)/images/bubbles/jade9.xpm bubbles-default.o: $(UTILS_SRC)/yarandom.h bubbles.o: $(srcdir)/bubbles.h bubbles.o: ../config.h +bubbles.o: $(srcdir)/fps.h bubbles.o: $(srcdir)/screenhackI.h bubbles.o: $(srcdir)/screenhack.h bubbles.o: $(UTILS_SRC)/colors.h @@ -1262,8 +1265,8 @@ bubbles.o: $(UTILS_SRC)/usleep.h bubbles.o: $(UTILS_SRC)/visual.h bubbles.o: $(UTILS_SRC)/yarandom.h bubbles.o: $(srcdir)/xpm-pixmap.h -bumps.o: $(srcdir)/bumps.h bumps.o: ../config.h +bumps.o: $(srcdir)/fps.h bumps.o: $(srcdir)/screenhackI.h bumps.o: $(srcdir)/screenhack.h bumps.o: $(UTILS_SRC)/colors.h @@ -1274,6 +1277,7 @@ bumps.o: $(UTILS_SRC)/usleep.h bumps.o: $(UTILS_SRC)/visual.h bumps.o: $(UTILS_SRC)/yarandom.h ccurve.o: ../config.h +ccurve.o: $(srcdir)/fps.h ccurve.o: $(srcdir)/screenhackI.h ccurve.o: $(srcdir)/screenhack.h ccurve.o: $(UTILS_SRC)/colors.h @@ -1285,6 +1289,7 @@ ccurve.o: $(UTILS_SRC)/usleep.h ccurve.o: $(UTILS_SRC)/visual.h ccurve.o: $(UTILS_SRC)/yarandom.h celtic.o: ../config.h +celtic.o: $(srcdir)/fps.h celtic.o: $(srcdir)/screenhackI.h celtic.o: $(srcdir)/screenhack.h celtic.o: $(UTILS_SRC)/colors.h @@ -1296,6 +1301,7 @@ celtic.o: $(UTILS_SRC)/usleep.h celtic.o: $(UTILS_SRC)/visual.h celtic.o: $(UTILS_SRC)/yarandom.h cloudlife.o: ../config.h +cloudlife.o: $(srcdir)/fps.h cloudlife.o: $(srcdir)/screenhackI.h cloudlife.o: $(srcdir)/screenhack.h cloudlife.o: $(UTILS_SRC)/colors.h @@ -1306,6 +1312,7 @@ cloudlife.o: $(UTILS_SRC)/usleep.h cloudlife.o: $(UTILS_SRC)/visual.h cloudlife.o: $(UTILS_SRC)/yarandom.h compass.o: ../config.h +compass.o: $(srcdir)/fps.h compass.o: $(srcdir)/screenhackI.h compass.o: $(srcdir)/screenhack.h compass.o: $(UTILS_SRC)/colors.h @@ -1317,6 +1324,7 @@ compass.o: $(UTILS_SRC)/visual.h compass.o: $(UTILS_SRC)/xdbe.h compass.o: $(UTILS_SRC)/yarandom.h coral.o: ../config.h +coral.o: $(srcdir)/fps.h coral.o: $(srcdir)/screenhackI.h coral.o: $(srcdir)/screenhack.h coral.o: $(UTILS_SRC)/colors.h @@ -1328,6 +1336,7 @@ coral.o: $(UTILS_SRC)/usleep.h coral.o: $(UTILS_SRC)/visual.h coral.o: $(UTILS_SRC)/yarandom.h critical.o: ../config.h +critical.o: $(srcdir)/fps.h critical.o: $(srcdir)/screenhackI.h critical.o: $(srcdir)/screenhack.h critical.o: $(UTILS_SRC)/colors.h @@ -1339,6 +1348,7 @@ critical.o: $(UTILS_SRC)/usleep.h critical.o: $(UTILS_SRC)/visual.h critical.o: $(UTILS_SRC)/yarandom.h crystal.o: ../config.h +crystal.o: $(srcdir)/fps.h crystal.o: $(srcdir)/screenhackI.h crystal.o: $(UTILS_SRC)/colors.h crystal.o: $(UTILS_SRC)/grabscreen.h @@ -1351,6 +1361,7 @@ crystal.o: $(UTILS_SRC)/yarandom.h crystal.o: $(srcdir)/xlockmoreI.h crystal.o: $(srcdir)/xlockmore.h cwaves.o: ../config.h +cwaves.o: $(srcdir)/fps.h cwaves.o: $(srcdir)/screenhackI.h cwaves.o: $(srcdir)/screenhack.h cwaves.o: $(UTILS_SRC)/colors.h @@ -1362,6 +1373,7 @@ cwaves.o: $(UTILS_SRC)/visual.h cwaves.o: $(UTILS_SRC)/yarandom.h cwaves.o: $(srcdir)/xpm-pixmap.h cynosure.o: ../config.h +cynosure.o: $(srcdir)/fps.h cynosure.o: $(srcdir)/screenhackI.h cynosure.o: $(srcdir)/screenhack.h cynosure.o: $(UTILS_SRC)/colors.h @@ -1372,6 +1384,7 @@ cynosure.o: $(UTILS_SRC)/usleep.h cynosure.o: $(UTILS_SRC)/visual.h cynosure.o: $(UTILS_SRC)/yarandom.h decayscreen.o: ../config.h +decayscreen.o: $(srcdir)/fps.h decayscreen.o: $(srcdir)/screenhackI.h decayscreen.o: $(srcdir)/screenhack.h decayscreen.o: $(UTILS_SRC)/colors.h @@ -1382,6 +1395,7 @@ decayscreen.o: $(UTILS_SRC)/usleep.h decayscreen.o: $(UTILS_SRC)/visual.h decayscreen.o: $(UTILS_SRC)/yarandom.h deco.o: ../config.h +deco.o: $(srcdir)/fps.h deco.o: $(srcdir)/screenhackI.h deco.o: $(srcdir)/screenhack.h deco.o: $(UTILS_SRC)/colors.h @@ -1392,6 +1406,7 @@ deco.o: $(UTILS_SRC)/usleep.h deco.o: $(UTILS_SRC)/visual.h deco.o: $(UTILS_SRC)/yarandom.h deluxe.o: ../config.h +deluxe.o: $(srcdir)/fps.h deluxe.o: $(srcdir)/screenhackI.h deluxe.o: $(srcdir)/screenhack.h deluxe.o: $(UTILS_SRC)/alpha.h @@ -1405,6 +1420,7 @@ deluxe.o: $(UTILS_SRC)/xdbe.h deluxe.o: $(UTILS_SRC)/yarandom.h demon.o: $(srcdir)/automata.h demon.o: ../config.h +demon.o: $(srcdir)/fps.h demon.o: $(srcdir)/screenhackI.h demon.o: $(UTILS_SRC)/colors.h demon.o: $(UTILS_SRC)/grabscreen.h @@ -1417,6 +1433,7 @@ demon.o: $(UTILS_SRC)/yarandom.h demon.o: $(srcdir)/xlockmoreI.h demon.o: $(srcdir)/xlockmore.h discrete.o: ../config.h +discrete.o: $(srcdir)/fps.h discrete.o: $(srcdir)/screenhackI.h discrete.o: $(UTILS_SRC)/colors.h discrete.o: $(UTILS_SRC)/erase.h @@ -1430,6 +1447,7 @@ discrete.o: $(UTILS_SRC)/yarandom.h discrete.o: $(srcdir)/xlockmoreI.h discrete.o: $(srcdir)/xlockmore.h distort.o: ../config.h +distort.o: $(srcdir)/fps.h distort.o: $(srcdir)/screenhackI.h distort.o: $(srcdir)/screenhack.h distort.o: $(UTILS_SRC)/colors.h @@ -1440,6 +1458,7 @@ distort.o: $(UTILS_SRC)/usleep.h distort.o: $(UTILS_SRC)/visual.h distort.o: $(UTILS_SRC)/yarandom.h drift.o: ../config.h +drift.o: $(srcdir)/fps.h drift.o: $(srcdir)/screenhackI.h drift.o: $(UTILS_SRC)/colors.h drift.o: $(UTILS_SRC)/erase.h @@ -1453,6 +1472,7 @@ drift.o: $(UTILS_SRC)/yarandom.h drift.o: $(srcdir)/xlockmoreI.h drift.o: $(srcdir)/xlockmore.h epicycle.o: ../config.h +epicycle.o: $(srcdir)/fps.h epicycle.o: $(srcdir)/screenhackI.h epicycle.o: $(srcdir)/screenhack.h epicycle.o: $(UTILS_SRC)/colors.h @@ -1464,6 +1484,7 @@ epicycle.o: $(UTILS_SRC)/usleep.h epicycle.o: $(UTILS_SRC)/visual.h epicycle.o: $(UTILS_SRC)/yarandom.h eruption.o: ../config.h +eruption.o: $(srcdir)/fps.h eruption.o: $(srcdir)/screenhackI.h eruption.o: $(srcdir)/screenhack.h eruption.o: $(UTILS_SRC)/colors.h @@ -1474,6 +1495,7 @@ eruption.o: $(UTILS_SRC)/usleep.h eruption.o: $(UTILS_SRC)/visual.h eruption.o: $(UTILS_SRC)/yarandom.h euler2d.o: ../config.h +euler2d.o: $(srcdir)/fps.h euler2d.o: $(srcdir)/screenhackI.h euler2d.o: $(UTILS_SRC)/colors.h euler2d.o: $(UTILS_SRC)/grabscreen.h @@ -1486,6 +1508,7 @@ euler2d.o: $(UTILS_SRC)/yarandom.h euler2d.o: $(srcdir)/xlockmoreI.h euler2d.o: $(srcdir)/xlockmore.h fadeplot.o: ../config.h +fadeplot.o: $(srcdir)/fps.h fadeplot.o: $(srcdir)/screenhackI.h fadeplot.o: $(UTILS_SRC)/colors.h fadeplot.o: $(UTILS_SRC)/grabscreen.h @@ -1498,6 +1521,7 @@ fadeplot.o: $(UTILS_SRC)/yarandom.h fadeplot.o: $(srcdir)/xlockmoreI.h fadeplot.o: $(srcdir)/xlockmore.h fiberlamp.o: ../config.h +fiberlamp.o: $(srcdir)/fps.h fiberlamp.o: $(srcdir)/screenhackI.h fiberlamp.o: $(UTILS_SRC)/colors.h fiberlamp.o: $(UTILS_SRC)/grabscreen.h @@ -1510,6 +1534,7 @@ fiberlamp.o: $(UTILS_SRC)/yarandom.h fiberlamp.o: $(srcdir)/xlockmoreI.h fiberlamp.o: $(srcdir)/xlockmore.h fireworkx.o: ../config.h +fireworkx.o: $(srcdir)/fps.h fireworkx.o: $(srcdir)/screenhackI.h fireworkx.o: $(srcdir)/screenhack.h fireworkx.o: $(UTILS_SRC)/colors.h @@ -1520,6 +1545,7 @@ fireworkx.o: $(UTILS_SRC)/usleep.h fireworkx.o: $(UTILS_SRC)/visual.h fireworkx.o: $(UTILS_SRC)/yarandom.h flag.o: ../config.h +flag.o: $(srcdir)/fps.h flag.o: $(srcdir)/images/bob.xbm flag.o: $(srcdir)/screenhackI.h flag.o: $(UTILS_SRC)/colors.h @@ -1534,6 +1560,7 @@ flag.o: $(srcdir)/xlockmoreI.h flag.o: $(srcdir)/xlockmore.h flag.o: $(srcdir)/xpm-pixmap.h flame.o: ../config.h +flame.o: $(srcdir)/fps.h flame.o: $(srcdir)/screenhackI.h flame.o: $(srcdir)/screenhack.h flame.o: $(UTILS_SRC)/colors.h @@ -1544,6 +1571,7 @@ flame.o: $(UTILS_SRC)/usleep.h flame.o: $(UTILS_SRC)/visual.h flame.o: $(UTILS_SRC)/yarandom.h flow.o: ../config.h +flow.o: $(srcdir)/fps.h flow.o: $(srcdir)/screenhackI.h flow.o: $(UTILS_SRC)/colors.h flow.o: $(UTILS_SRC)/grabscreen.h @@ -1556,6 +1584,7 @@ flow.o: $(UTILS_SRC)/yarandom.h flow.o: $(srcdir)/xlockmoreI.h flow.o: $(srcdir)/xlockmore.h fluidballs.o: ../config.h +fluidballs.o: $(srcdir)/fps.h fluidballs.o: $(srcdir)/screenhackI.h fluidballs.o: $(srcdir)/screenhack.h fluidballs.o: $(UTILS_SRC)/colors.h @@ -1567,6 +1596,7 @@ fluidballs.o: $(UTILS_SRC)/visual.h fluidballs.o: $(UTILS_SRC)/xdbe.h fluidballs.o: $(UTILS_SRC)/yarandom.h fontglide.o: ../config.h +fontglide.o: $(srcdir)/fps.h fontglide.o: $(srcdir)/screenhackI.h fontglide.o: $(srcdir)/screenhack.h fontglide.o: $(UTILS_SRC)/colors.h @@ -1578,6 +1608,7 @@ fontglide.o: $(UTILS_SRC)/visual.h fontglide.o: $(UTILS_SRC)/xdbe.h fontglide.o: $(UTILS_SRC)/yarandom.h forest.o: ../config.h +forest.o: $(srcdir)/fps.h forest.o: $(srcdir)/screenhackI.h forest.o: $(UTILS_SRC)/colors.h forest.o: $(UTILS_SRC)/grabscreen.h @@ -1589,7 +1620,19 @@ forest.o: $(UTILS_SRC)/xshm.h forest.o: $(UTILS_SRC)/yarandom.h forest.o: $(srcdir)/xlockmoreI.h forest.o: $(srcdir)/xlockmore.h +fps.o: ../config.h +fps.o: $(srcdir)/fpsI.h +fps.o: $(srcdir)/fps.h +fps.o: $(srcdir)/screenhackI.h +fps.o: $(UTILS_SRC)/colors.h +fps.o: $(UTILS_SRC)/grabscreen.h +fps.o: $(UTILS_SRC)/hsv.h +fps.o: $(UTILS_SRC)/resources.h +fps.o: $(UTILS_SRC)/usleep.h +fps.o: $(UTILS_SRC)/visual.h +fps.o: $(UTILS_SRC)/yarandom.h fuzzyflakes.o: ../config.h +fuzzyflakes.o: $(srcdir)/fps.h fuzzyflakes.o: $(srcdir)/screenhackI.h fuzzyflakes.o: $(srcdir)/screenhack.h fuzzyflakes.o: $(UTILS_SRC)/colors.h @@ -1600,6 +1643,7 @@ fuzzyflakes.o: $(UTILS_SRC)/usleep.h fuzzyflakes.o: $(UTILS_SRC)/visual.h fuzzyflakes.o: $(UTILS_SRC)/yarandom.h galaxy.o: ../config.h +galaxy.o: $(srcdir)/fps.h galaxy.o: $(srcdir)/screenhackI.h galaxy.o: $(UTILS_SRC)/colors.h galaxy.o: $(UTILS_SRC)/grabscreen.h @@ -1612,6 +1656,7 @@ galaxy.o: $(UTILS_SRC)/yarandom.h galaxy.o: $(srcdir)/xlockmoreI.h galaxy.o: $(srcdir)/xlockmore.h goop.o: ../config.h +goop.o: $(srcdir)/fps.h goop.o: $(srcdir)/screenhackI.h goop.o: $(srcdir)/screenhack.h goop.o: $(UTILS_SRC)/alpha.h @@ -1624,6 +1669,7 @@ goop.o: $(UTILS_SRC)/usleep.h goop.o: $(UTILS_SRC)/visual.h goop.o: $(UTILS_SRC)/yarandom.h grav.o: ../config.h +grav.o: $(srcdir)/fps.h grav.o: $(srcdir)/screenhackI.h grav.o: $(UTILS_SRC)/colors.h grav.o: $(UTILS_SRC)/grabscreen.h @@ -1636,6 +1682,7 @@ grav.o: $(UTILS_SRC)/yarandom.h grav.o: $(srcdir)/xlockmoreI.h grav.o: $(srcdir)/xlockmore.h greynetic.o: ../config.h +greynetic.o: $(srcdir)/fps.h greynetic.o: $(srcdir)/screenhackI.h greynetic.o: $(srcdir)/screenhack.h greynetic.o: $(UTILS_SRC)/colors.h @@ -1646,6 +1693,7 @@ greynetic.o: $(UTILS_SRC)/usleep.h greynetic.o: $(UTILS_SRC)/visual.h greynetic.o: $(UTILS_SRC)/yarandom.h halftone.o: ../config.h +halftone.o: $(srcdir)/fps.h halftone.o: $(srcdir)/screenhackI.h halftone.o: $(srcdir)/screenhack.h halftone.o: $(UTILS_SRC)/colors.h @@ -1656,6 +1704,7 @@ halftone.o: $(UTILS_SRC)/usleep.h halftone.o: $(UTILS_SRC)/visual.h halftone.o: $(UTILS_SRC)/yarandom.h halo.o: ../config.h +halo.o: $(srcdir)/fps.h halo.o: $(srcdir)/screenhackI.h halo.o: $(srcdir)/screenhack.h halo.o: $(UTILS_SRC)/colors.h @@ -1666,6 +1715,7 @@ halo.o: $(UTILS_SRC)/usleep.h halo.o: $(UTILS_SRC)/visual.h halo.o: $(UTILS_SRC)/yarandom.h helix.o: ../config.h +helix.o: $(srcdir)/fps.h helix.o: $(srcdir)/screenhackI.h helix.o: $(srcdir)/screenhack.h helix.o: $(UTILS_SRC)/colors.h @@ -1677,6 +1727,7 @@ helix.o: $(UTILS_SRC)/usleep.h helix.o: $(UTILS_SRC)/visual.h helix.o: $(UTILS_SRC)/yarandom.h hopalong.o: ../config.h +hopalong.o: $(srcdir)/fps.h hopalong.o: $(srcdir)/screenhackI.h hopalong.o: $(UTILS_SRC)/colors.h hopalong.o: $(UTILS_SRC)/erase.h @@ -1690,6 +1741,7 @@ hopalong.o: $(UTILS_SRC)/yarandom.h hopalong.o: $(srcdir)/xlockmoreI.h hopalong.o: $(srcdir)/xlockmore.h hyperball.o: ../config.h +hyperball.o: $(srcdir)/fps.h hyperball.o: $(srcdir)/screenhackI.h hyperball.o: $(srcdir)/screenhack.h hyperball.o: $(UTILS_SRC)/colors.h @@ -1700,6 +1752,7 @@ hyperball.o: $(UTILS_SRC)/usleep.h hyperball.o: $(UTILS_SRC)/visual.h hyperball.o: $(UTILS_SRC)/yarandom.h hypercube.o: ../config.h +hypercube.o: $(srcdir)/fps.h hypercube.o: $(srcdir)/screenhackI.h hypercube.o: $(srcdir)/screenhack.h hypercube.o: $(UTILS_SRC)/colors.h @@ -1710,6 +1763,7 @@ hypercube.o: $(UTILS_SRC)/usleep.h hypercube.o: $(UTILS_SRC)/visual.h hypercube.o: $(UTILS_SRC)/yarandom.h ifs.o: ../config.h +ifs.o: $(srcdir)/fps.h ifs.o: $(srcdir)/screenhackI.h ifs.o: $(srcdir)/screenhack.h ifs.o: $(UTILS_SRC)/colors.h @@ -1720,6 +1774,7 @@ ifs.o: $(UTILS_SRC)/usleep.h ifs.o: $(UTILS_SRC)/visual.h ifs.o: $(UTILS_SRC)/yarandom.h imsmap.o: ../config.h +imsmap.o: $(srcdir)/fps.h imsmap.o: $(srcdir)/screenhackI.h imsmap.o: $(srcdir)/screenhack.h imsmap.o: $(UTILS_SRC)/colors.h @@ -1730,6 +1785,7 @@ imsmap.o: $(UTILS_SRC)/usleep.h imsmap.o: $(UTILS_SRC)/visual.h imsmap.o: $(UTILS_SRC)/yarandom.h interaggregate.o: ../config.h +interaggregate.o: $(srcdir)/fps.h interaggregate.o: $(srcdir)/screenhackI.h interaggregate.o: $(srcdir)/screenhack.h interaggregate.o: $(UTILS_SRC)/colors.h @@ -1740,6 +1796,7 @@ interaggregate.o: $(UTILS_SRC)/usleep.h interaggregate.o: $(UTILS_SRC)/visual.h interaggregate.o: $(UTILS_SRC)/yarandom.h interference.o: ../config.h +interference.o: $(srcdir)/fps.h interference.o: $(srcdir)/screenhackI.h interference.o: $(srcdir)/screenhack.h interference.o: $(UTILS_SRC)/colors.h @@ -1751,6 +1808,7 @@ interference.o: $(UTILS_SRC)/visual.h interference.o: $(UTILS_SRC)/xdbe.h interference.o: $(UTILS_SRC)/yarandom.h intermomentary.o: ../config.h +intermomentary.o: $(srcdir)/fps.h intermomentary.o: $(srcdir)/screenhackI.h intermomentary.o: $(srcdir)/screenhack.h intermomentary.o: $(UTILS_SRC)/colors.h @@ -1761,6 +1819,7 @@ intermomentary.o: $(UTILS_SRC)/usleep.h intermomentary.o: $(UTILS_SRC)/visual.h intermomentary.o: $(UTILS_SRC)/yarandom.h jigsaw.o: ../config.h +jigsaw.o: $(srcdir)/fps.h jigsaw.o: $(srcdir)/screenhackI.h jigsaw.o: $(srcdir)/screenhack.h jigsaw.o: $(UTILS_SRC)/colors.h @@ -1772,6 +1831,7 @@ jigsaw.o: $(UTILS_SRC)/usleep.h jigsaw.o: $(UTILS_SRC)/visual.h jigsaw.o: $(UTILS_SRC)/yarandom.h juggle.o: ../config.h +juggle.o: $(srcdir)/fps.h juggle.o: $(srcdir)/screenhackI.h juggle.o: $(UTILS_SRC)/colors.h juggle.o: $(UTILS_SRC)/grabscreen.h @@ -1784,6 +1844,7 @@ juggle.o: $(UTILS_SRC)/yarandom.h juggle.o: $(srcdir)/xlockmoreI.h juggle.o: $(srcdir)/xlockmore.h julia.o: ../config.h +julia.o: $(srcdir)/fps.h julia.o: $(srcdir)/screenhackI.h julia.o: $(UTILS_SRC)/colors.h julia.o: $(UTILS_SRC)/grabscreen.h @@ -1796,6 +1857,7 @@ julia.o: $(UTILS_SRC)/yarandom.h julia.o: $(srcdir)/xlockmoreI.h julia.o: $(srcdir)/xlockmore.h kaleidescope.o: ../config.h +kaleidescope.o: $(srcdir)/fps.h kaleidescope.o: $(srcdir)/screenhackI.h kaleidescope.o: $(srcdir)/screenhack.h kaleidescope.o: $(UTILS_SRC)/colors.h @@ -1807,6 +1869,7 @@ kaleidescope.o: $(UTILS_SRC)/usleep.h kaleidescope.o: $(UTILS_SRC)/visual.h kaleidescope.o: $(UTILS_SRC)/yarandom.h kumppa.o: ../config.h +kumppa.o: $(srcdir)/fps.h kumppa.o: $(srcdir)/screenhackI.h kumppa.o: $(srcdir)/screenhack.h kumppa.o: $(UTILS_SRC)/colors.h @@ -1818,6 +1881,7 @@ kumppa.o: $(UTILS_SRC)/visual.h kumppa.o: $(UTILS_SRC)/xdbe.h kumppa.o: $(UTILS_SRC)/yarandom.h laser.o: ../config.h +laser.o: $(srcdir)/fps.h laser.o: $(srcdir)/screenhackI.h laser.o: $(UTILS_SRC)/colors.h laser.o: $(UTILS_SRC)/grabscreen.h @@ -1830,6 +1894,7 @@ laser.o: $(UTILS_SRC)/yarandom.h laser.o: $(srcdir)/xlockmoreI.h laser.o: $(srcdir)/xlockmore.h lcdscrub.o: ../config.h +lcdscrub.o: $(srcdir)/fps.h lcdscrub.o: $(srcdir)/screenhackI.h lcdscrub.o: $(srcdir)/screenhack.h lcdscrub.o: $(UTILS_SRC)/colors.h @@ -1840,6 +1905,7 @@ lcdscrub.o: $(UTILS_SRC)/usleep.h lcdscrub.o: $(UTILS_SRC)/visual.h lcdscrub.o: $(UTILS_SRC)/yarandom.h lightning.o: ../config.h +lightning.o: $(srcdir)/fps.h lightning.o: $(srcdir)/screenhackI.h lightning.o: $(UTILS_SRC)/colors.h lightning.o: $(UTILS_SRC)/grabscreen.h @@ -1852,6 +1918,7 @@ lightning.o: $(UTILS_SRC)/yarandom.h lightning.o: $(srcdir)/xlockmoreI.h lightning.o: $(srcdir)/xlockmore.h lisa.o: ../config.h +lisa.o: $(srcdir)/fps.h lisa.o: $(srcdir)/screenhackI.h lisa.o: $(UTILS_SRC)/colors.h lisa.o: $(UTILS_SRC)/grabscreen.h @@ -1864,6 +1931,7 @@ lisa.o: $(UTILS_SRC)/yarandom.h lisa.o: $(srcdir)/xlockmoreI.h lisa.o: $(srcdir)/xlockmore.h lissie.o: ../config.h +lissie.o: $(srcdir)/fps.h lissie.o: $(srcdir)/screenhackI.h lissie.o: $(UTILS_SRC)/colors.h lissie.o: $(UTILS_SRC)/grabscreen.h @@ -1876,6 +1944,7 @@ lissie.o: $(UTILS_SRC)/yarandom.h lissie.o: $(srcdir)/xlockmoreI.h lissie.o: $(srcdir)/xlockmore.h lmorph.o: ../config.h +lmorph.o: $(srcdir)/fps.h lmorph.o: $(srcdir)/screenhackI.h lmorph.o: $(srcdir)/screenhack.h lmorph.o: $(UTILS_SRC)/colors.h @@ -1887,6 +1956,7 @@ lmorph.o: $(UTILS_SRC)/visual.h lmorph.o: $(UTILS_SRC)/yarandom.h loop.o: $(srcdir)/automata.h loop.o: ../config.h +loop.o: $(srcdir)/fps.h loop.o: $(srcdir)/screenhackI.h loop.o: $(UTILS_SRC)/colors.h loop.o: $(UTILS_SRC)/grabscreen.h @@ -1901,6 +1971,7 @@ loop.o: $(srcdir)/xlockmore.h m6502.o: $(srcdir)/analogtv.h m6502.o: $(srcdir)/asm6502.h m6502.o: ../config.h +m6502.o: $(srcdir)/fps.h m6502.o: m6502.h m6502.o: $(srcdir)/screenhackI.h m6502.o: $(srcdir)/screenhack.h @@ -1913,6 +1984,7 @@ m6502.o: $(UTILS_SRC)/visual.h m6502.o: $(UTILS_SRC)/xshm.h m6502.o: $(UTILS_SRC)/yarandom.h maze.o: ../config.h +maze.o: $(srcdir)/fps.h maze.o: $(srcdir)/screenhackI.h maze.o: $(srcdir)/screenhack.h maze.o: $(UTILS_SRC)/colors.h @@ -1924,6 +1996,7 @@ maze.o: $(UTILS_SRC)/usleep.h maze.o: $(UTILS_SRC)/visual.h maze.o: $(UTILS_SRC)/yarandom.h memscroller.o: ../config.h +memscroller.o: $(srcdir)/fps.h memscroller.o: $(srcdir)/screenhackI.h memscroller.o: $(srcdir)/screenhack.h memscroller.o: $(UTILS_SRC)/colors.h @@ -1934,6 +2007,7 @@ memscroller.o: $(UTILS_SRC)/usleep.h memscroller.o: $(UTILS_SRC)/visual.h memscroller.o: $(UTILS_SRC)/yarandom.h metaballs.o: ../config.h +metaballs.o: $(srcdir)/fps.h metaballs.o: $(srcdir)/screenhackI.h metaballs.o: $(srcdir)/screenhack.h metaballs.o: $(UTILS_SRC)/colors.h @@ -1944,6 +2018,7 @@ metaballs.o: $(UTILS_SRC)/usleep.h metaballs.o: $(UTILS_SRC)/visual.h metaballs.o: $(UTILS_SRC)/yarandom.h mismunch.o: ../config.h +mismunch.o: $(srcdir)/fps.h mismunch.o: $(srcdir)/screenhackI.h mismunch.o: $(srcdir)/screenhack.h mismunch.o: $(UTILS_SRC)/colors.h @@ -1954,6 +2029,7 @@ mismunch.o: $(UTILS_SRC)/usleep.h mismunch.o: $(UTILS_SRC)/visual.h mismunch.o: $(UTILS_SRC)/yarandom.h moire2.o: ../config.h +moire2.o: $(srcdir)/fps.h moire2.o: $(srcdir)/screenhackI.h moire2.o: $(srcdir)/screenhack.h moire2.o: $(UTILS_SRC)/colors.h @@ -1965,6 +2041,7 @@ moire2.o: $(UTILS_SRC)/visual.h moire2.o: $(UTILS_SRC)/xdbe.h moire2.o: $(UTILS_SRC)/yarandom.h moire.o: ../config.h +moire.o: $(srcdir)/fps.h moire.o: $(srcdir)/screenhackI.h moire.o: $(srcdir)/screenhack.h moire.o: $(UTILS_SRC)/colors.h @@ -1975,6 +2052,7 @@ moire.o: $(UTILS_SRC)/usleep.h moire.o: $(UTILS_SRC)/visual.h moire.o: $(UTILS_SRC)/yarandom.h mountain.o: ../config.h +mountain.o: $(srcdir)/fps.h mountain.o: $(srcdir)/screenhackI.h mountain.o: $(UTILS_SRC)/colors.h mountain.o: $(UTILS_SRC)/grabscreen.h @@ -1987,6 +2065,7 @@ mountain.o: $(UTILS_SRC)/yarandom.h mountain.o: $(srcdir)/xlockmoreI.h mountain.o: $(srcdir)/xlockmore.h munch.o: ../config.h +munch.o: $(srcdir)/fps.h munch.o: $(srcdir)/screenhackI.h munch.o: $(srcdir)/screenhack.h munch.o: $(UTILS_SRC)/colors.h @@ -1997,6 +2076,7 @@ munch.o: $(UTILS_SRC)/usleep.h munch.o: $(UTILS_SRC)/visual.h munch.o: $(UTILS_SRC)/yarandom.h nerverot.o: ../config.h +nerverot.o: $(srcdir)/fps.h nerverot.o: $(srcdir)/screenhackI.h nerverot.o: $(srcdir)/screenhack.h nerverot.o: $(UTILS_SRC)/colors.h @@ -2007,6 +2087,7 @@ nerverot.o: $(UTILS_SRC)/usleep.h nerverot.o: $(UTILS_SRC)/visual.h nerverot.o: $(UTILS_SRC)/yarandom.h noseguy.o: ../config.h +noseguy.o: $(srcdir)/fps.h noseguy.o: $(srcdir)/images/noseguy/nose-f1.xpm noseguy.o: $(srcdir)/images/noseguy/nose-f2.xpm noseguy.o: $(srcdir)/images/noseguy/nose-f3.xpm @@ -2026,6 +2107,7 @@ noseguy.o: $(UTILS_SRC)/visual.h noseguy.o: $(UTILS_SRC)/yarandom.h noseguy.o: $(srcdir)/xpm-pixmap.h pacman_ai.o: ../config.h +pacman_ai.o: $(srcdir)/fps.h pacman_ai.o: $(srcdir)/pacman_ai.h pacman_ai.o: $(srcdir)/pacman.h pacman_ai.o: $(srcdir)/pacman_level.h @@ -2041,6 +2123,7 @@ pacman_ai.o: $(UTILS_SRC)/yarandom.h pacman_ai.o: $(srcdir)/xlockmoreI.h pacman_ai.o: $(srcdir)/xpm-pixmap.h pacman_level.o: ../config.h +pacman_level.o: $(srcdir)/fps.h pacman_level.o: $(srcdir)/pacman.h pacman_level.o: $(srcdir)/pacman_level.h pacman_level.o: $(srcdir)/screenhackI.h @@ -2055,6 +2138,7 @@ pacman_level.o: $(UTILS_SRC)/yarandom.h pacman_level.o: $(srcdir)/xlockmoreI.h pacman_level.o: $(srcdir)/xpm-pixmap.h pacman.o: ../config.h +pacman.o: $(srcdir)/fps.h pacman.o: $(srcdir)/images/pacman/eyes-d.xpm pacman.o: $(srcdir)/images/pacman/eyes-l.xpm pacman.o: $(srcdir)/images/pacman/eyes-r.xpm @@ -2105,6 +2189,7 @@ pacman.o: $(srcdir)/xlockmoreI.h pacman.o: $(srcdir)/xlockmore.h pacman.o: $(srcdir)/xpm-pixmap.h pedal.o: ../config.h +pedal.o: $(srcdir)/fps.h pedal.o: $(srcdir)/screenhackI.h pedal.o: $(srcdir)/screenhack.h pedal.o: $(UTILS_SRC)/colors.h @@ -2116,6 +2201,7 @@ pedal.o: $(UTILS_SRC)/usleep.h pedal.o: $(UTILS_SRC)/visual.h pedal.o: $(UTILS_SRC)/yarandom.h penetrate.o: ../config.h +penetrate.o: $(srcdir)/fps.h penetrate.o: $(srcdir)/screenhackI.h penetrate.o: $(srcdir)/screenhack.h penetrate.o: $(UTILS_SRC)/colors.h @@ -2126,6 +2212,7 @@ penetrate.o: $(UTILS_SRC)/usleep.h penetrate.o: $(UTILS_SRC)/visual.h penetrate.o: $(UTILS_SRC)/yarandom.h penrose.o: ../config.h +penrose.o: $(srcdir)/fps.h penrose.o: $(srcdir)/screenhackI.h penrose.o: $(UTILS_SRC)/colors.h penrose.o: $(UTILS_SRC)/grabscreen.h @@ -2138,6 +2225,7 @@ penrose.o: $(UTILS_SRC)/yarandom.h penrose.o: $(srcdir)/xlockmoreI.h penrose.o: $(srcdir)/xlockmore.h petri.o: ../config.h +petri.o: $(srcdir)/fps.h petri.o: $(srcdir)/screenhackI.h petri.o: $(srcdir)/screenhack.h petri.o: $(UTILS_SRC)/colors.h @@ -2149,6 +2237,7 @@ petri.o: $(UTILS_SRC)/usleep.h petri.o: $(UTILS_SRC)/visual.h petri.o: $(UTILS_SRC)/yarandom.h phosphor.o: ../config.h +phosphor.o: $(srcdir)/fps.h phosphor.o: $(srcdir)/images/6x10font.xbm phosphor.o: $(srcdir)/screenhackI.h phosphor.o: $(srcdir)/screenhack.h @@ -2160,6 +2249,7 @@ phosphor.o: $(UTILS_SRC)/usleep.h phosphor.o: $(UTILS_SRC)/visual.h phosphor.o: $(UTILS_SRC)/yarandom.h piecewise.o: ../config.h +piecewise.o: $(srcdir)/fps.h piecewise.o: $(srcdir)/screenhackI.h piecewise.o: $(srcdir)/screenhack.h piecewise.o: $(UTILS_SRC)/colors.h @@ -2171,6 +2261,7 @@ piecewise.o: $(UTILS_SRC)/visual.h piecewise.o: $(UTILS_SRC)/xdbe.h piecewise.o: $(UTILS_SRC)/yarandom.h polyominoes.o: ../config.h +polyominoes.o: $(srcdir)/fps.h polyominoes.o: $(srcdir)/screenhackI.h polyominoes.o: $(UTILS_SRC)/colors.h polyominoes.o: $(UTILS_SRC)/erase.h @@ -2185,6 +2276,7 @@ polyominoes.o: $(srcdir)/xlockmoreI.h polyominoes.o: $(srcdir)/xlockmore.h pong.o: $(srcdir)/analogtv.h pong.o: ../config.h +pong.o: $(srcdir)/fps.h pong.o: $(srcdir)/screenhackI.h pong.o: $(srcdir)/screenhack.h pong.o: $(UTILS_SRC)/colors.h @@ -2196,6 +2288,7 @@ pong.o: $(UTILS_SRC)/visual.h pong.o: $(UTILS_SRC)/xshm.h pong.o: $(UTILS_SRC)/yarandom.h popsquares.o: ../config.h +popsquares.o: $(srcdir)/fps.h popsquares.o: $(srcdir)/screenhackI.h popsquares.o: $(srcdir)/screenhack.h popsquares.o: $(UTILS_SRC)/colors.h @@ -2207,6 +2300,7 @@ popsquares.o: $(UTILS_SRC)/visual.h popsquares.o: $(UTILS_SRC)/xdbe.h popsquares.o: $(UTILS_SRC)/yarandom.h pyro.o: ../config.h +pyro.o: $(srcdir)/fps.h pyro.o: $(srcdir)/screenhackI.h pyro.o: $(srcdir)/screenhack.h pyro.o: $(UTILS_SRC)/colors.h @@ -2217,6 +2311,7 @@ pyro.o: $(UTILS_SRC)/usleep.h pyro.o: $(UTILS_SRC)/visual.h pyro.o: $(UTILS_SRC)/yarandom.h qix.o: ../config.h +qix.o: $(srcdir)/fps.h qix.o: $(srcdir)/screenhackI.h qix.o: $(srcdir)/screenhack.h qix.o: $(UTILS_SRC)/alpha.h @@ -2228,6 +2323,7 @@ qix.o: $(UTILS_SRC)/usleep.h qix.o: $(UTILS_SRC)/visual.h qix.o: $(UTILS_SRC)/yarandom.h rd-bomb.o: ../config.h +rd-bomb.o: $(srcdir)/fps.h rd-bomb.o: $(srcdir)/screenhackI.h rd-bomb.o: $(srcdir)/screenhack.h rd-bomb.o: $(UTILS_SRC)/colors.h @@ -2238,6 +2334,7 @@ rd-bomb.o: $(UTILS_SRC)/usleep.h rd-bomb.o: $(UTILS_SRC)/visual.h rd-bomb.o: $(UTILS_SRC)/yarandom.h ripples.o: ../config.h +ripples.o: $(srcdir)/fps.h ripples.o: $(srcdir)/screenhackI.h ripples.o: $(srcdir)/screenhack.h ripples.o: $(UTILS_SRC)/colors.h @@ -2248,6 +2345,7 @@ ripples.o: $(UTILS_SRC)/usleep.h ripples.o: $(UTILS_SRC)/visual.h ripples.o: $(UTILS_SRC)/yarandom.h rocks.o: ../config.h +rocks.o: $(srcdir)/fps.h rocks.o: $(srcdir)/screenhackI.h rocks.o: $(srcdir)/screenhack.h rocks.o: $(UTILS_SRC)/colors.h @@ -2258,6 +2356,7 @@ rocks.o: $(UTILS_SRC)/usleep.h rocks.o: $(UTILS_SRC)/visual.h rocks.o: $(UTILS_SRC)/yarandom.h rorschach.o: ../config.h +rorschach.o: $(srcdir)/fps.h rorschach.o: $(srcdir)/screenhackI.h rorschach.o: $(srcdir)/screenhack.h rorschach.o: $(UTILS_SRC)/colors.h @@ -2269,6 +2368,7 @@ rorschach.o: $(UTILS_SRC)/usleep.h rorschach.o: $(UTILS_SRC)/visual.h rorschach.o: $(UTILS_SRC)/yarandom.h rotor.o: ../config.h +rotor.o: $(srcdir)/fps.h rotor.o: $(srcdir)/screenhackI.h rotor.o: $(UTILS_SRC)/colors.h rotor.o: $(UTILS_SRC)/grabscreen.h @@ -2281,6 +2381,7 @@ rotor.o: $(UTILS_SRC)/yarandom.h rotor.o: $(srcdir)/xlockmoreI.h rotor.o: $(srcdir)/xlockmore.h rotzoomer.o: ../config.h +rotzoomer.o: $(srcdir)/fps.h rotzoomer.o: $(srcdir)/screenhackI.h rotzoomer.o: $(srcdir)/screenhack.h rotzoomer.o: $(UTILS_SRC)/colors.h @@ -2291,6 +2392,7 @@ rotzoomer.o: $(UTILS_SRC)/usleep.h rotzoomer.o: $(UTILS_SRC)/visual.h rotzoomer.o: $(UTILS_SRC)/yarandom.h screenhack.o: ../config.h +screenhack.o: $(srcdir)/fps.h screenhack.o: $(srcdir)/screenhackI.h screenhack.o: $(UTILS_SRC)/colors.h screenhack.o: $(UTILS_SRC)/grabscreen.h @@ -2303,6 +2405,7 @@ screenhack.o: $(UTILS_SRC)/vroot.h screenhack.o: $(UTILS_SRC)/xmu.h screenhack.o: $(UTILS_SRC)/yarandom.h shadebobs.o: ../config.h +shadebobs.o: $(srcdir)/fps.h shadebobs.o: $(srcdir)/screenhackI.h shadebobs.o: $(srcdir)/screenhack.h shadebobs.o: $(UTILS_SRC)/colors.h @@ -2313,6 +2416,7 @@ shadebobs.o: $(UTILS_SRC)/usleep.h shadebobs.o: $(UTILS_SRC)/visual.h shadebobs.o: $(UTILS_SRC)/yarandom.h sierpinski.o: ../config.h +sierpinski.o: $(srcdir)/fps.h sierpinski.o: $(srcdir)/screenhackI.h sierpinski.o: $(UTILS_SRC)/colors.h sierpinski.o: $(UTILS_SRC)/grabscreen.h @@ -2325,6 +2429,7 @@ sierpinski.o: $(UTILS_SRC)/yarandom.h sierpinski.o: $(srcdir)/xlockmoreI.h sierpinski.o: $(srcdir)/xlockmore.h slidescreen.o: ../config.h +slidescreen.o: $(srcdir)/fps.h slidescreen.o: $(srcdir)/screenhackI.h slidescreen.o: $(srcdir)/screenhack.h slidescreen.o: $(UTILS_SRC)/colors.h @@ -2335,6 +2440,7 @@ slidescreen.o: $(UTILS_SRC)/usleep.h slidescreen.o: $(UTILS_SRC)/visual.h slidescreen.o: $(UTILS_SRC)/yarandom.h slip.o: ../config.h +slip.o: $(srcdir)/fps.h slip.o: $(srcdir)/screenhackI.h slip.o: $(UTILS_SRC)/colors.h slip.o: $(UTILS_SRC)/grabscreen.h @@ -2347,6 +2453,7 @@ slip.o: $(UTILS_SRC)/yarandom.h slip.o: $(srcdir)/xlockmoreI.h slip.o: $(srcdir)/xlockmore.h sonar.o: ../config.h +sonar.o: $(srcdir)/fps.h sonar.o: $(srcdir)/screenhackI.h sonar.o: $(srcdir)/screenhack.h sonar.o: $(UTILS_SRC)/colors.h @@ -2357,6 +2464,7 @@ sonar.o: $(UTILS_SRC)/usleep.h sonar.o: $(UTILS_SRC)/visual.h sonar.o: $(UTILS_SRC)/yarandom.h speedmine.o: ../config.h +speedmine.o: $(srcdir)/fps.h speedmine.o: $(srcdir)/screenhackI.h speedmine.o: $(srcdir)/screenhack.h speedmine.o: $(UTILS_SRC)/colors.h @@ -2368,6 +2476,7 @@ speedmine.o: $(UTILS_SRC)/usleep.h speedmine.o: $(UTILS_SRC)/visual.h speedmine.o: $(UTILS_SRC)/yarandom.h sphere.o: ../config.h +sphere.o: $(srcdir)/fps.h sphere.o: $(srcdir)/screenhackI.h sphere.o: $(UTILS_SRC)/colors.h sphere.o: $(UTILS_SRC)/grabscreen.h @@ -2380,6 +2489,7 @@ sphere.o: $(UTILS_SRC)/yarandom.h sphere.o: $(srcdir)/xlockmoreI.h sphere.o: $(srcdir)/xlockmore.h spiral.o: ../config.h +spiral.o: $(srcdir)/fps.h spiral.o: $(srcdir)/screenhackI.h spiral.o: $(UTILS_SRC)/colors.h spiral.o: $(UTILS_SRC)/grabscreen.h @@ -2392,6 +2502,7 @@ spiral.o: $(UTILS_SRC)/yarandom.h spiral.o: $(srcdir)/xlockmoreI.h spiral.o: $(srcdir)/xlockmore.h spotlight.o: ../config.h +spotlight.o: $(srcdir)/fps.h spotlight.o: $(srcdir)/screenhackI.h spotlight.o: $(srcdir)/screenhack.h spotlight.o: $(UTILS_SRC)/colors.h @@ -2402,6 +2513,7 @@ spotlight.o: $(UTILS_SRC)/usleep.h spotlight.o: $(UTILS_SRC)/visual.h spotlight.o: $(UTILS_SRC)/yarandom.h squiral.o: ../config.h +squiral.o: $(srcdir)/fps.h squiral.o: $(srcdir)/screenhackI.h squiral.o: $(srcdir)/screenhack.h squiral.o: $(UTILS_SRC)/colors.h @@ -2413,6 +2525,7 @@ squiral.o: $(UTILS_SRC)/usleep.h squiral.o: $(UTILS_SRC)/visual.h squiral.o: $(UTILS_SRC)/yarandom.h starfish.o: ../config.h +starfish.o: $(srcdir)/fps.h starfish.o: $(srcdir)/screenhackI.h starfish.o: $(srcdir)/screenhack.h starfish.o: $(UTILS_SRC)/colors.h @@ -2424,6 +2537,7 @@ starfish.o: $(UTILS_SRC)/usleep.h starfish.o: $(UTILS_SRC)/visual.h starfish.o: $(UTILS_SRC)/yarandom.h strange.o: ../config.h +strange.o: $(srcdir)/fps.h strange.o: $(srcdir)/screenhackI.h strange.o: $(UTILS_SRC)/colors.h strange.o: $(UTILS_SRC)/grabscreen.h @@ -2436,6 +2550,7 @@ strange.o: $(UTILS_SRC)/yarandom.h strange.o: $(srcdir)/xlockmoreI.h strange.o: $(srcdir)/xlockmore.h substrate.o: ../config.h +substrate.o: $(srcdir)/fps.h substrate.o: $(srcdir)/screenhackI.h substrate.o: $(srcdir)/screenhack.h substrate.o: $(UTILS_SRC)/colors.h @@ -2446,6 +2561,7 @@ substrate.o: $(UTILS_SRC)/usleep.h substrate.o: $(UTILS_SRC)/visual.h substrate.o: $(UTILS_SRC)/yarandom.h swirl.o: ../config.h +swirl.o: $(srcdir)/fps.h swirl.o: $(srcdir)/screenhackI.h swirl.o: $(UTILS_SRC)/colors.h swirl.o: $(UTILS_SRC)/grabscreen.h @@ -2458,6 +2574,7 @@ swirl.o: $(UTILS_SRC)/yarandom.h swirl.o: $(srcdir)/xlockmoreI.h swirl.o: $(srcdir)/xlockmore.h t3d.o: ../config.h +t3d.o: $(srcdir)/fps.h t3d.o: $(srcdir)/screenhackI.h t3d.o: $(srcdir)/screenhack.h t3d.o: $(UTILS_SRC)/colors.h @@ -2468,6 +2585,7 @@ t3d.o: $(UTILS_SRC)/usleep.h t3d.o: $(UTILS_SRC)/visual.h t3d.o: $(UTILS_SRC)/yarandom.h thornbird.o: ../config.h +thornbird.o: $(srcdir)/fps.h thornbird.o: $(srcdir)/screenhackI.h thornbird.o: $(UTILS_SRC)/colors.h thornbird.o: $(UTILS_SRC)/grabscreen.h @@ -2480,6 +2598,7 @@ thornbird.o: $(UTILS_SRC)/yarandom.h thornbird.o: $(srcdir)/xlockmoreI.h thornbird.o: $(srcdir)/xlockmore.h triangle.o: ../config.h +triangle.o: $(srcdir)/fps.h triangle.o: $(srcdir)/screenhackI.h triangle.o: $(UTILS_SRC)/colors.h triangle.o: $(UTILS_SRC)/grabscreen.h @@ -2492,6 +2611,7 @@ triangle.o: $(UTILS_SRC)/yarandom.h triangle.o: $(srcdir)/xlockmoreI.h triangle.o: $(srcdir)/xlockmore.h truchet.o: ../config.h +truchet.o: $(srcdir)/fps.h truchet.o: $(srcdir)/screenhackI.h truchet.o: $(srcdir)/screenhack.h truchet.o: $(UTILS_SRC)/colors.h @@ -2502,6 +2622,7 @@ truchet.o: $(UTILS_SRC)/usleep.h truchet.o: $(UTILS_SRC)/visual.h truchet.o: $(UTILS_SRC)/yarandom.h twang.o: ../config.h +twang.o: $(srcdir)/fps.h twang.o: $(srcdir)/screenhackI.h twang.o: $(srcdir)/screenhack.h twang.o: $(UTILS_SRC)/colors.h @@ -2512,6 +2633,7 @@ twang.o: $(UTILS_SRC)/usleep.h twang.o: $(UTILS_SRC)/visual.h twang.o: $(UTILS_SRC)/yarandom.h vermiculate.o: ../config.h +vermiculate.o: $(srcdir)/fps.h vermiculate.o: $(srcdir)/screenhackI.h vermiculate.o: $(srcdir)/screenhack.h vermiculate.o: $(UTILS_SRC)/colors.h @@ -2522,6 +2644,7 @@ vermiculate.o: $(UTILS_SRC)/usleep.h vermiculate.o: $(UTILS_SRC)/visual.h vermiculate.o: $(UTILS_SRC)/yarandom.h vines.o: ../config.h +vines.o: $(srcdir)/fps.h vines.o: $(srcdir)/screenhackI.h vines.o: $(UTILS_SRC)/colors.h vines.o: $(UTILS_SRC)/erase.h @@ -2535,6 +2658,7 @@ vines.o: $(UTILS_SRC)/yarandom.h vines.o: $(srcdir)/xlockmoreI.h vines.o: $(srcdir)/xlockmore.h wander.o: ../config.h +wander.o: $(srcdir)/fps.h wander.o: $(srcdir)/screenhackI.h wander.o: $(srcdir)/screenhack.h wander.o: $(UTILS_SRC)/colors.h @@ -2546,6 +2670,7 @@ wander.o: $(UTILS_SRC)/usleep.h wander.o: $(UTILS_SRC)/visual.h wander.o: $(UTILS_SRC)/yarandom.h webcollage-cocoa.o: ../config.h +webcollage-cocoa.o: $(srcdir)/fps.h webcollage-cocoa.o: $(srcdir)/screenhackI.h webcollage-cocoa.o: $(srcdir)/screenhack.h webcollage-cocoa.o: $(UTILS_SRC)/colors.h @@ -2557,6 +2682,7 @@ webcollage-cocoa.o: $(UTILS_SRC)/visual.h webcollage-cocoa.o: $(UTILS_SRC)/yarandom.h webcollage-helper.o: ../config.h whirlwindwarp.o: ../config.h +whirlwindwarp.o: $(srcdir)/fps.h whirlwindwarp.o: $(srcdir)/screenhackI.h whirlwindwarp.o: $(srcdir)/screenhack.h whirlwindwarp.o: $(UTILS_SRC)/colors.h @@ -2568,6 +2694,7 @@ whirlwindwarp.o: $(UTILS_SRC)/usleep.h whirlwindwarp.o: $(UTILS_SRC)/visual.h whirlwindwarp.o: $(UTILS_SRC)/yarandom.h whirlygig.o: ../config.h +whirlygig.o: $(srcdir)/fps.h whirlygig.o: $(srcdir)/screenhackI.h whirlygig.o: $(srcdir)/screenhack.h whirlygig.o: $(UTILS_SRC)/colors.h @@ -2579,6 +2706,7 @@ whirlygig.o: $(UTILS_SRC)/visual.h whirlygig.o: $(UTILS_SRC)/xdbe.h whirlygig.o: $(UTILS_SRC)/yarandom.h wormhole.o: ../config.h +wormhole.o: $(srcdir)/fps.h wormhole.o: $(srcdir)/screenhackI.h wormhole.o: $(srcdir)/screenhack.h wormhole.o: $(UTILS_SRC)/colors.h @@ -2589,6 +2717,7 @@ wormhole.o: $(UTILS_SRC)/usleep.h wormhole.o: $(UTILS_SRC)/visual.h wormhole.o: $(UTILS_SRC)/yarandom.h worm.o: ../config.h +worm.o: $(srcdir)/fps.h worm.o: $(srcdir)/screenhackI.h worm.o: $(UTILS_SRC)/colors.h worm.o: $(UTILS_SRC)/grabscreen.h @@ -2602,6 +2731,7 @@ worm.o: $(srcdir)/xlockmoreI.h worm.o: $(srcdir)/xlockmore.h xanalogtv.o: $(srcdir)/analogtv.h xanalogtv.o: ../config.h +xanalogtv.o: $(srcdir)/fps.h xanalogtv.o: $(srcdir)/screenhackI.h xanalogtv.o: $(srcdir)/screenhack.h xanalogtv.o: $(UTILS_SRC)/colors.h @@ -2615,6 +2745,7 @@ xanalogtv.o: $(UTILS_SRC)/xshm.h xanalogtv.o: $(UTILS_SRC)/yarandom.h xanalogtv.o: $(srcdir)/xpm-pixmap.h xflame.o: ../config.h +xflame.o: $(srcdir)/fps.h xflame.o: $(srcdir)/images/bob.xbm xflame.o: $(srcdir)/screenhackI.h xflame.o: $(srcdir)/screenhack.h @@ -2627,6 +2758,7 @@ xflame.o: $(UTILS_SRC)/visual.h xflame.o: $(UTILS_SRC)/yarandom.h xflame.o: $(srcdir)/xpm-pixmap.h xjack.o: ../config.h +xjack.o: $(srcdir)/fps.h xjack.o: $(srcdir)/screenhackI.h xjack.o: $(srcdir)/screenhack.h xjack.o: $(UTILS_SRC)/colors.h @@ -2637,6 +2769,7 @@ xjack.o: $(UTILS_SRC)/usleep.h xjack.o: $(UTILS_SRC)/visual.h xjack.o: $(UTILS_SRC)/yarandom.h xlockmore.o: ../config.h +xlockmore.o: $(srcdir)/fps.h xlockmore.o: $(srcdir)/screenhackI.h xlockmore.o: $(srcdir)/screenhack.h xlockmore.o: $(UTILS_SRC)/colors.h @@ -2649,6 +2782,7 @@ xlockmore.o: $(UTILS_SRC)/xshm.h xlockmore.o: $(UTILS_SRC)/yarandom.h xlockmore.o: $(srcdir)/xlockmoreI.h xlyap.o: ../config.h +xlyap.o: $(srcdir)/fps.h xlyap.o: $(srcdir)/screenhackI.h xlyap.o: $(srcdir)/screenhack.h xlyap.o: $(UTILS_SRC)/colors.h @@ -2659,6 +2793,7 @@ xlyap.o: $(UTILS_SRC)/usleep.h xlyap.o: $(UTILS_SRC)/visual.h xlyap.o: $(UTILS_SRC)/yarandom.h xmatrix.o: ../config.h +xmatrix.o: $(srcdir)/fps.h xmatrix.o: $(srcdir)/images/matrix1b.xbm xmatrix.o: $(srcdir)/images/matrix1b.xpm xmatrix.o: $(srcdir)/images/matrix1.xbm @@ -2681,6 +2816,7 @@ xpm-pixmap.o: ../config.h xpm-pixmap.o: $(UTILS_SRC)/visual.h xpm-pixmap.o: $(srcdir)/xpm-pixmap.h xrayswarm.o: ../config.h +xrayswarm.o: $(srcdir)/fps.h xrayswarm.o: $(srcdir)/screenhackI.h xrayswarm.o: $(srcdir)/screenhack.h xrayswarm.o: $(UTILS_SRC)/colors.h @@ -2692,6 +2828,7 @@ xrayswarm.o: $(UTILS_SRC)/visual.h xrayswarm.o: $(UTILS_SRC)/yarandom.h xscreensaver-sgigl.o: $(UTILS_SRC)/vroot.h xspirograph.o: ../config.h +xspirograph.o: $(srcdir)/fps.h xspirograph.o: $(srcdir)/screenhackI.h xspirograph.o: $(srcdir)/screenhack.h xspirograph.o: $(UTILS_SRC)/colors.h @@ -2707,6 +2844,7 @@ xsublim.o: $(UTILS_SRC)/usleep.h xsublim.o: $(UTILS_SRC)/vroot.h xsublim.o: $(UTILS_SRC)/yarandom.h zoom.o: ../config.h +zoom.o: $(srcdir)/fps.h zoom.o: $(srcdir)/screenhackI.h zoom.o: $(srcdir)/screenhack.h zoom.o: $(UTILS_SRC)/colors.h diff --git a/hacks/abstractile.c b/hacks/abstractile.c index 6053b7a9..56d42dfe 100644 --- a/hacks/abstractile.c +++ b/hacks/abstractile.c @@ -1570,6 +1570,7 @@ abstractile_free (Display *dpy, Window window, void *closure) static const char *abstractile_defaults [] = { ".background: black", ".foreground: white", + "*fpsSolid: true", "*sleep: 3", "*speed: 3", "*tile: random", diff --git a/hacks/abstractile.man b/hacks/abstractile.man index 889845b5..d043ce7a 100644 --- a/hacks/abstractile.man +++ b/hacks/abstractile.man @@ -4,6 +4,7 @@ abstractile - draw abstract mosaic patterns of interlocking tiles .SH SYNOPSIS .B abstractile [\-sleep \fIseconds\fP] [\-speed \fIint\fP] [\-tile \fItile_mode\fP] +[\-fps] .SH DESCRIPTION The \fIabstractile\fP program draws chaotic grids of randomly colored and shaped interlocking tiles. @@ -21,6 +22,9 @@ A value between 0 and 5 used to specify the speed at which each screen is drawn. The type of tile that is drawn on each screen. Legal values are \fIrandom\fP, \fIflat\fP, \fIthin\fP, \fIoutline\fP, \fIblock\fP, \fIneon\fP, and \fItiled\fP +.TP 8 +.B \-fps +Display the current frame rate and CPU load. .SH ENVIRONMENT .PP .TP 8 diff --git a/hacks/analogtv.c b/hacks/analogtv.c index c7fb266d..f271d26b 100644 --- a/hacks/analogtv.c +++ b/hacks/analogtv.c @@ -388,6 +388,7 @@ analogtv_allocate(Display *dpy, Window window) analogtv_init(); it=(analogtv *)calloc(1,sizeof(analogtv)); + if (!it) return 0; it->dpy=dpy; it->window=window; @@ -1189,6 +1190,7 @@ analogtv_draw(analogtv *it) float *raw_rgb_end=raw_rgb_start+3*it->subwidth; float *rrp; + if (! raw_rgb_start) return; analogtv_setup_frame(it); analogtv_set_demod(it); diff --git a/hacks/analogtv.h b/hacks/analogtv.h index ad61b3d3..9c03559c 100644 --- a/hacks/analogtv.h +++ b/hacks/analogtv.h @@ -290,6 +290,7 @@ int analogtv_handle_events (analogtv *it); "*Background: Black", \ "*use_cmap: 0", \ "*geometry: 800x600", \ + "*fpsSolid: True", \ ANALOGTV_DEFAULTS_SHM #define ANALOGTV_OPTIONS \ diff --git a/hacks/anemone.man b/hacks/anemone.man index d26389eb..463a9990 100644 --- a/hacks/anemone.man +++ b/hacks/anemone.man @@ -11,6 +11,7 @@ anemone - wiggling tentacles. [\-arms \fInumber\fP] [\-finpoints \fInumber\fP] [\-width \fInumber\fP] +[\-fps] .SH DESCRIPTION Wiggling tentacles. .SH OPTIONS @@ -46,7 +47,9 @@ which are very fast indeed. Default: 50. .TP 8 .B \-width \fInumber\fP Thickness. 1 - 10. Default: 2. - +.TP 8 +.B \-fps +Display the current frame rate and CPU load. .SH ENVIRONMENT .PP .TP 8 diff --git a/hacks/anemotaxis.man b/hacks/anemotaxis.man index 38826082..cf5c1eab 100644 --- a/hacks/anemotaxis.man +++ b/hacks/anemotaxis.man @@ -11,6 +11,7 @@ anemotaxis - directional search on a plane. [\-distance \fInumber\fP] [\-sources \fInumber\fP] [\-searchers \fInumber\fP] +[\-fps] .SH DESCRIPTION The program demonstrates a search algorithm designed for locating a source of odor in turbulent atmosphere. The odor is convected by wind @@ -50,7 +51,9 @@ Max number of sources. Default: 25. .TP 8 .B \-searchers \fInumber\fP Max number of searchers. Default: 25. - +.TP 8 +.B \-fps +Display the current frame rate and CPU load. .SH ENVIRONMENT .PP .TP 8 diff --git a/hacks/ant.c b/hacks/ant.c index bc18bb29..f9abb270 100644 --- a/hacks/ant.c +++ b/hacks/ant.c @@ -53,16 +53,18 @@ static const char sccsid[] = "@(#)ant.c 5.00 2000/11/01 xlockmore"; */ #ifndef HAVE_COCOA -# define DO_STIPPLE +/*# define DO_STIPPLE*/ #endif #ifdef STANDALONE # define MODE_ant -# define DEFAULTS "*delay: 1000 \n" \ +# define DEFAULTS "*delay: 20000 \n" \ "*count: -3 \n" \ "*cycles: 40000 \n" \ "*size: -12 \n" \ - "*ncolors: 64 \n" + "*ncolors: 64 \n" \ + "*fpsSolid: true \n" \ + # define reshape_ant 0 # define ant_handle_event 0 # include "xlockmore.h" /* in xscreensaver distribution */ @@ -173,7 +175,9 @@ typedef struct { antstruct *ants; int init_bits; unsigned char colors[NUMSTIPPLES - 1]; +# ifdef DO_STIPPLE GC stippledGC; +# endif /* DO_STIPPLE */ Pixmap pixmaps[NUMSTIPPLES - 1]; union { XPoint hexagon[7]; /* Need more than 6 for truchet */ @@ -641,24 +645,20 @@ drawcell(ModeInfo * mi, int col, int row, unsigned char color) if (!color) { XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi)); gc = MI_GC(mi); - } else if (MI_NPIXELS(mi) > 2) { - XSetForeground(MI_DISPLAY(mi), MI_GC(mi), - MI_PIXEL(mi, ap->colors[color - 1])); - gc = MI_GC(mi); - } else { +# ifdef DO_STIPPLE + } else if (MI_NPIXELS(mi) <= 2) { XGCValues gcv; - -#ifdef DO_STIPPLE - gcv.stipple = ap->pixmaps[color - 1]; -#endif /* DO_STIPPLE */ gcv.foreground = MI_WHITE_PIXEL(mi); gcv.background = MI_BLACK_PIXEL(mi); + gcv.stipple = ap->pixmaps[color - 1]; XChangeGC(MI_DISPLAY(mi), ap->stippledGC, -#ifdef DO_STIPPLE - GCStipple | -#endif /* DO_STIPPLE */ - GCForeground | GCBackground, &gcv); + GCStipple | GCForeground | GCBackground, &gcv); gc = ap->stippledGC; +# endif /* !DO_STIPPLE */ + } else { + XSetForeground(MI_DISPLAY(mi), MI_GC(mi), + MI_PIXEL(mi, ap->colors[color - 1])); + gc = MI_GC(mi); } fillcell(mi, gc, col, row); } @@ -980,10 +980,12 @@ free_ant(Display *display, antfarmstruct *ap) { int shade; +#ifdef DO_STIPPLE if (ap->stippledGC != None) { XFreeGC(display, ap->stippledGC); ap->stippledGC = None; } +#endif /* DO_STIPPLE */ for (shade = 0; shade < ap->init_bits; shade++) { XFreePixmap(display, ap->pixmaps[shade]); } diff --git a/hacks/apollonian.c b/hacks/apollonian.c index bc3fcc4e..39a905af 100644 --- a/hacks/apollonian.c +++ b/hacks/apollonian.c @@ -69,7 +69,10 @@ static const char sccsid[] = "@(#)apollonian.c 5.02 2001/07/01 xlockmore"; # define DEFAULTS "*delay: 1000000 \n" \ "*count: 64 \n" \ "*cycles: 20 \n" \ - "*ncolors: 64 \n" + "*ncolors: 64 \n" \ + "*fpsTop: true \n" \ + "*fpsSolid: true \n" \ + # define refresh_apollonian 0 # define reshape_apollonian 0 # define apollonian_handle_event 0 @@ -621,7 +624,8 @@ f(ModeInfo *mi, circle c1, circle c2, circle c3, circle c4) c.h = 2*(c1.h+c2.h+c3.h) - c4.h; c.x = 2*(c1.x+c2.x+c3.x) - c4.x; c.y = 2*(c1.y+c2.y+c3.y) - c4.y; - if (c.e > cp->size * e || c.x / c.e > BIG || c.y / c.e > BIG || + if (c.e == 0 || + c.e > cp->size * e || c.x / c.e > BIG || c.y / c.e > BIG || c.x / c.e < -BIG || c.y / c.e < -BIG) return; p(mi, c); diff --git a/hacks/apollonian.man b/hacks/apollonian.man index ae4e3560..157d109c 100644 --- a/hacks/apollonian.man +++ b/hacks/apollonian.man @@ -12,6 +12,7 @@ apollonian - Descartes Circle Theorem. [\-cycles \fInumber\fP] [\-ncolors \fInumber\fP] [\-delay \fInumber\fP] +[\-fps] .SH DESCRIPTION Packs a large circle with smaller circles, demonstrating the Descartes Circle Theorem. @@ -41,6 +42,9 @@ Number of Colors. Default: 64. .TP 8 .B \-delay \fInumber\fP Per-frame delay, in microseconds. Default: 1000000 (1.00 seconds.). +.TP 8 +.B \-fps +Display the current frame rate and CPU load. .SH ENVIRONMENT .PP .TP 8 diff --git a/hacks/apple2.man b/hacks/apple2.man index 932c2b4c..b0d6d5cb 100644 --- a/hacks/apple2.man +++ b/hacks/apple2.man @@ -22,6 +22,7 @@ apple2 - Apple ][ display emulator [\-program \fIcommand to run\fP] [\-basic] [\-slideshow] [\-text] [\-meta] [\-esc] [\-bs] [\-del] [\-fast] +[\-fps] .SH DESCRIPTION The .I apple2 @@ -134,6 +135,9 @@ Normally, characters are printed at the speed of an original Apple][ computer; however, when using this program as a terminal emulator, the novelty of those 300 baud characters might wear off. You can use the \fI\-fast\fP option to speed things up a bit. +.TP 8 +.B \-fps +Display the current frame rate and CPU load. .SH TERMINAL EMULATION By default, \fIapple2\fP allocates a pseudo-tty for the \fI\-text\fP-mode sub-process to run under. This has the desirable side effect that the diff --git a/hacks/attraction.c b/hacks/attraction.c index 8e25d244..ea85f9ad 100644 --- a/hacks/attraction.c +++ b/hacks/attraction.c @@ -1,5 +1,4 @@ -/* xscreensaver, Copyright (c) 1992, 1995, 1996, 1997, 1998, 2001, 2006 - * Jamie Zawinski +/* xscreensaver, Copyright (c) 1992-2008 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 @@ -991,6 +990,7 @@ attraction_free (Display *dpy, Window window, void *closure) static const char *attraction_defaults [] = { ".background: black", ".foreground: white", + "*fpsSolid: true", "*mode: balls", "*graphmode: none", "*points: 0", @@ -1004,7 +1004,7 @@ static const char *attraction_defaults [] = { "*maxspeed: true", "*cbounce: true", "*mouse: false", - "*viscosity: 1", + "*viscosity: 1.0", "*orbit: false", "*colorShift: 3", "*segments: 500", diff --git a/hacks/attraction.man b/hacks/attraction.man index 0099a627..a0a9779a 100644 --- a/hacks/attraction.man +++ b/hacks/attraction.man @@ -26,6 +26,7 @@ attraction - interactions of opposing forces [\-orbit] [\-viscosity \fIfloat\fP] [\-mouse] [\-no-mouse] [\-mouse-size] [\-walls] [\-nowalls] [\-maxspeed] [\-nomaxspeed] [\-correct-bounce] [\-fast-bounce] +[\-fps] .SH DESCRIPTION The \fIattraction\fP program has several visually different modes of operation, all of which are based on the interactions of a set of control @@ -196,6 +197,9 @@ For "x", "y", and "both", displays the given velocities of each ball as a bar graph in the same window as the balls. For "speed", displays the total speed of each ball. Default is "none". .BR +.TP 8 +.B \-fps +Display the current frame rate and CPU load. .SH ENVIRONMENT .B DISPLAY to get the default host and display number. diff --git a/hacks/barcode.c b/hacks/barcode.c index cde87e40..61b0c237 100644 --- a/hacks/barcode.c +++ b/hacks/barcode.c @@ -1911,6 +1911,7 @@ barcode_free (Display *dpy, Window window, void *closure) static const char *barcode_defaults [] = { ".background: black", ".foreground: green", + "*fpsSolid: true", "*delay: 10000", "*mode: scroll", 0 diff --git a/hacks/barcode.man b/hacks/barcode.man index 4c3c4762..9074e162 100644 --- a/hacks/barcode.man +++ b/hacks/barcode.man @@ -10,6 +10,7 @@ barcode - draws a random sequence of barcodes for the products you enjoy [\-delay \fInumber\fP] [\-clock] [\-clock24] +[\-fps] .SH DESCRIPTION This draws a random sequence of colorful barcodes scrolling across your screen. @@ -33,6 +34,9 @@ Instead of drawing a stream of barcodes, draw a barcode-based digital clock. .TP 8 .B \-clock24 Same as \fI\-clock\fP, but display 24-hour time instead of 12-hour time. +.TP 8 +.B \-fps +Display the current frame rate and CPU load. .SH ENVIRONMENT .PP .TP 8 diff --git a/hacks/blaster.c b/hacks/blaster.c index f2bc6f59..1449e115 100644 --- a/hacks/blaster.c +++ b/hacks/blaster.c @@ -1098,6 +1098,7 @@ blaster_free (Display *dpy, Window window, void *closure) static const char *blaster_defaults [] = { ".background: black", ".foreground: white", + "*fpsSolid: true", "*r_color0: #FF00FF", "*r_color1: #FFA500", "*r_color2: #FFFF00", diff --git a/hacks/blaster.man b/hacks/blaster.man index 088f04a7..6ac369f8 100644 --- a/hacks/blaster.man +++ b/hacks/blaster.man @@ -11,6 +11,7 @@ blaster - simulation of space combat [\-num_lasers \fInumber\fP] [\-num_stars \fInumber\fP] [\-delay \fInumber\fP] +[\-fps] .SH DESCRIPTION Draws a simulation of flying space-combat robots (cleverly disguised as colored circles) doing battle in front of a moving star field. @@ -37,6 +38,9 @@ Stars. 5 - 200. Default: 50. .TP 8 .B \-delay \fInumber\fP Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.). +.TP 8 +.B \-fps +Display the current frame rate and CPU load. .SH ENVIRONMENT .PP .TP 8 diff --git a/hacks/blitspin.c b/hacks/blitspin.c index 0be3c96d..1c18881c 100644 --- a/hacks/blitspin.c +++ b/hacks/blitspin.c @@ -30,6 +30,20 @@ #include "images/som.xbm" +/* Implementing this using XCopyArea doesn't work with color images on OSX. + This means that the Cocoa implementation of XCopyArea in jwxyz.m is + broken with the GXor, GXand, and/or the GXxor GC operations. This + probably means that (e.g.) "kCGBlendModeDarken" is not close enough + to being "GXand" to use for that. (It works with monochrome images, + just not color ones). + + So, on OSX, we implement the blitter by hand. It is correct, but + orders of magnitude slower. + */ +#ifndef HAVE_COCOA +# define USE_XCOPYAREA +#endif + struct state { Display *dpy; Window window; @@ -37,7 +51,9 @@ struct state { int width, height, size; Bool scale_up; Pixmap self, temp, mask; - GC SET, CLR, CPY, IOR, AND, XOR; +# ifdef USE_XCOPYAREA + GC gc_set, gc_clear, gc_copy, gc_and, gc_or, gc_xor; +# endif GC gc; int delay, delay2; int duration; @@ -50,25 +66,85 @@ struct state { time_t start_time; Bool loaded_p; + Bool load_ext_p; async_load_state *img_loader; }; static void display (struct state *, Pixmap); static void blitspin_init_2 (struct state *); -#define copy_all_to(from, xoff, yoff, to, gc) \ - XCopyArea (st->dpy, (from), (to), (gc), 0, 0, \ - st->size-(xoff), st->size-(yoff), (xoff), (yoff)) +#define copy_to(from, xoff, yoff, to, op) \ + bitblt (st, st->from, st->to, op, 0, 0, \ + st->size-(xoff), st->size-(yoff), (xoff), (yoff)) + +#define copy_from(to, xoff, yoff, from, op) \ + bitblt (st, st->from, st->to, op, (xoff), (yoff), \ + st->size-(xoff), st->size-(yoff), 0, 0) + + +#ifdef USE_XCOPYAREA +# define bitblt(st, from, to, op, src_x, src_y, w, h, dst_x, dst_y) \ + XCopyArea((st)->dpy, (from), (to), (st)->gc_##op, \ + (src_x), (src_y), (w), (h), (dst_x), (dst_y)) +#else /* !USE_XCOPYAREA */ + +# define bitblt(st, from, to, op, src_x, src_y, w, h, dst_x, dst_y) \ + do_bitblt((st)->dpy, (from), (to), st->gc, GX##op, \ + (src_x), (src_y), (w), (h), (dst_x), (dst_y)) + +static void +do_bitblt (Display *dpy, Drawable src, Drawable dst, GC gc, int op, + int src_x, int src_y, + unsigned int width, unsigned int height, + int dst_x, int dst_y) +{ + if (op == GXclear) + { + XSetForeground (dpy, gc, 0xFF000000); /* ARGB black for Cocoa */ + XFillRectangle (dpy, dst, gc, dst_x, dst_y, width, height); + } + else if (op == GXset) + { + XSetForeground (dpy, gc, ~0L); + XFillRectangle (dpy, dst, gc, dst_x, dst_y, width, height); + } + else if (op == GXcopy) + { + XCopyArea (dpy, src, dst, gc, src_x, src_y, width, height, dst_x, dst_y); + } + else + { + XImage *srci = XGetImage (dpy, src, src_x, src_y, width, height, + ~0L, ZPixmap); + XImage *dsti = XGetImage (dpy, dst, dst_x, dst_y, width, height, + ~0L, ZPixmap); + unsigned long *out = (unsigned long *) dsti->data; + unsigned long *in = (unsigned long *) srci->data; + unsigned long *end = (in + (height * srci->bytes_per_line + / sizeof(unsigned long))); + switch (op) + { + case GXor: while (in < end) { *out++ |= *in++; } break; + case GXand: while (in < end) { *out++ &= *in++; } break; + case GXxor: while (in < end) { *out++ ^= *in++; } break; + default: abort(); + } + XPutImage (dpy, dst, gc, dsti, 0, 0, dst_x, dst_y, width, height); + XDestroyImage (srci); + XDestroyImage (dsti); + } +} + +#endif /* !USE_XCOPYAREA */ + -#define copy_all_from(to, xoff, yoff, from, gc) \ - XCopyArea (st->dpy, (from), (to), (gc), (xoff), (yoff), \ - st->size-(xoff), st->size-(yoff), 0, 0) static unsigned long blitspin_draw (Display *dpy, Window window, void *closure) { struct state *st = (struct state *) closure; int this_delay = st->delay; + int qwad; if (st->img_loader) /* still loading */ { @@ -76,30 +152,30 @@ blitspin_draw (Display *dpy, Window window, void *closure) if (!st->img_loader) { /* just finished */ st->first_time = 0; - st->loaded_p = False; + st->loaded_p = True; st->qwad = -1; st->start_time = time ((time_t) 0); + blitspin_init_2 (st); } - return this_delay; + /* Rotate nothing if the very first image is not yet loaded */ + if (! st->loaded_p) + return this_delay; } if (!st->img_loader && + st->load_ext_p && st->start_time + st->duration < time ((time_t) 0)) { - /* Start it loading, but keep rotating the old image until it arrives. */ + /* Start a new image loading, but keep rotating the old image + until the new one arrives. */ st->img_loader = load_image_async_simple (0, st->xgwa.screen, st->window, st->bitmap, 0, 0); } - if (! st->loaded_p) { - blitspin_init_2 (st); - st->loaded_p = True; - } - if (st->qwad == -1) { - XFillRectangle (st->dpy, st->mask, st->CLR, 0, 0, st->size, st->size); - XFillRectangle (st->dpy, st->mask, st->SET, 0, 0, st->size>>1, st->size>>1); + bitblt(st, st->mask, st->mask, clear,0,0, st->size, st->size, 0,0); + bitblt(st, st->mask, st->mask, set, 0,0, st->size>>1, st->size>>1, 0,0); st->qwad = st->size>>1; } @@ -112,22 +188,24 @@ blitspin_draw (Display *dpy, Window window, void *closure) /* for (st->qwad = st->size>>1; st->qwad > 0; st->qwad>>=1) */ - copy_all_to (st->mask, 0, 0, st->temp, st->CPY); /* 1 */ - copy_all_to (st->mask, 0, st->qwad, st->temp, st->IOR); /* 2 */ - copy_all_to (st->self, 0, 0, st->temp, st->AND); /* 3 */ - copy_all_to (st->temp, 0, 0, st->self, st->XOR); /* 4 */ - copy_all_from(st->temp, st->qwad, 0, st->self, st->XOR); /* 5 */ - copy_all_from(st->self, st->qwad, 0, st->self, st->IOR); /* 6 */ - copy_all_to (st->temp, st->qwad, 0, st->self, st->XOR); /* 7 */ - copy_all_to (st->self, 0, 0, st->temp, st->CPY); /* 8 */ - copy_all_from(st->temp, st->qwad, st->qwad, st->self,st->XOR);/*9*/ - copy_all_to (st->mask, 0, 0, st->temp, st->AND); /* A */ - copy_all_to (st->temp, 0, 0, st->self, st->XOR); /* B */ - copy_all_to (st->temp, st->qwad, st->qwad, st->self, st->XOR); /* C */ - copy_all_from(st->mask, st->qwad>>1,st->qwad>>1,st->mask,st->AND); /* D */ - copy_all_to (st->mask, st->qwad, 0, st->mask, st->IOR); /* E */ - copy_all_to (st->mask, 0, st->qwad, st->mask, st->IOR); /* F */ - display (st, st->self); + qwad = st->qwad; + + copy_to (mask, 0, 0, temp, copy); /* 1 */ + copy_to (mask, 0, qwad, temp, or); /* 2 */ + copy_to (self, 0, 0, temp, and); /* 3 */ + copy_to (temp, 0, 0, self, xor); /* 4 */ + copy_from (temp, qwad, 0, self, xor); /* 5 */ + copy_from (self, qwad, 0, self, or); /* 6 */ + copy_to (temp, qwad, 0, self, xor); /* 7 */ + copy_to (self, 0, 0, temp, copy); /* 8 */ + copy_from (temp, qwad, qwad, self, xor); /* 9 */ + copy_to (mask, 0, 0, temp, and); /* A */ + copy_to (temp, 0, 0, self, xor); /* B */ + copy_to (temp, qwad, qwad, self, xor); /* C */ + copy_from (mask, qwad>>1, qwad>>1, mask, and); /* D */ + copy_to (mask, qwad, 0, mask, or); /* E */ + copy_to (mask, 0, qwad, mask, or); /* F */ + display (st, st->self); st->qwad >>= 1; if (st->qwad == 0) /* done with this round */ @@ -143,7 +221,6 @@ blitspin_draw (Display *dpy, Window window, void *closure) static int to_pow2(struct state *st, int n, Bool up) { - /* sizeof(Dimension) == 2. */ int powers_of_2[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536 }; int i = 0; @@ -185,14 +262,7 @@ blitspin_init (Display *d_arg, Window w_arg) if (!strcasecmp (bitmap_name, "(default)") || !strcasecmp (bitmap_name, "default")) -# ifdef HAVE_COCOA - /* I don't understand why it doesn't work with color images on OSX. - I guess "kCGBlendModeDarken" is not close enough to being "GXand". - */ - bitmap_name = "(builtin)"; -# else bitmap_name = "(screen)"; -# endif if (!strcasecmp (bitmap_name, "(builtin)") || !strcasecmp (bitmap_name, "builtin")) @@ -205,6 +275,8 @@ blitspin_init (Display *d_arg, Window w_arg) st->fg, st->bg, st->xgwa.depth); st->scale_up = True; /* definitely. */ + st->loaded_p = True; + blitspin_init_2 (st); } else if (!strcasecmp (bitmap_name, "(screen)") || !strcasecmp (bitmap_name, "screen")) @@ -215,6 +287,7 @@ blitspin_init (Display *d_arg, Window w_arg) st->width = st->xgwa.width; st->height = st->xgwa.height; st->scale_up = True; /* maybe? */ + st->load_ext_p = True; st->img_loader = load_image_async_simple (0, st->xgwa.screen, st->window, st->bitmap, 0, 0); } @@ -245,40 +318,42 @@ blitspin_init_2 (struct state *st) if (st->size > h) st->size = h; } - st->self = XCreatePixmap (st->dpy, st->window, st->size, st->size, st->xgwa.depth); - st->temp = XCreatePixmap (st->dpy, st->window, st->size, st->size, st->xgwa.depth); - st->mask = XCreatePixmap (st->dpy, st->window, st->size, st->size, st->xgwa.depth); + if (st->self) XFreePixmap (st->dpy, st->self); + if (st->temp) XFreePixmap (st->dpy, st->temp); + if (st->mask) XFreePixmap (st->dpy, st->mask); + + st->self = XCreatePixmap (st->dpy, st->window, st->size, st->size, + st->xgwa.depth); + st->temp = XCreatePixmap (st->dpy, st->window, st->size, st->size, + st->xgwa.depth); + st->mask = XCreatePixmap (st->dpy, st->window, st->size, st->size, + st->xgwa.depth); gcv.foreground = (st->xgwa.depth == 1 ? 1 : (~0)); - gcv.function=GXset; st->SET = XCreateGC(st->dpy,st->self,GCFunction|GCForeground,&gcv); - gcv.function=GXclear;st->CLR = XCreateGC(st->dpy,st->self,GCFunction|GCForeground,&gcv); - gcv.function=GXcopy; st->CPY = XCreateGC(st->dpy,st->self,GCFunction|GCForeground,&gcv); - gcv.function=GXor; st->IOR = XCreateGC(st->dpy,st->self,GCFunction|GCForeground,&gcv); - gcv.function=GXand; st->AND = XCreateGC(st->dpy,st->self,GCFunction|GCForeground,&gcv); - gcv.function=GXxor; st->XOR = XCreateGC(st->dpy,st->self,GCFunction|GCForeground,&gcv); + +# ifdef USE_XCOPYAREA +# define make_gc(op) \ + gcv.function=GX##op; \ + if (st->gc_##op) XFreeGC (st->dpy, st->gc_##op); \ + st->gc_##op = XCreateGC (st->dpy, st->self, GCFunction|GCForeground, &gcv) + make_gc(set); + make_gc(clear); + make_gc(copy); + make_gc(and); + make_gc(or); + make_gc(xor); +# endif /* USE_XCOPYAREA */ gcv.foreground = gcv.background = st->bg; + if (st->gc) XFreeGC (st->dpy, st->gc); st->gc = XCreateGC (st->dpy, st->window, GCForeground|GCBackground, &gcv); - /* Clear st->self to the background color (not to 0, which st->CLR does.) */ + /* Clear st->self to the background color (not to 0, which 'clear' does.) */ XFillRectangle (st->dpy, st->self, st->gc, 0, 0, st->size, st->size); XSetForeground (st->dpy, st->gc, st->fg); -#if 0 -#ifdef HAVE_COCOA - jwxyz_XSetAntiAliasing (st->dpy, st->gc, False); - jwxyz_XSetAntiAliasing (st->dpy, st->SET, False); - jwxyz_XSetAntiAliasing (st->dpy, st->CLR, False); - jwxyz_XSetAntiAliasing (st->dpy, st->CPY, False); - jwxyz_XSetAntiAliasing (st->dpy, st->IOR, False); - jwxyz_XSetAntiAliasing (st->dpy, st->AND, False); - jwxyz_XSetAntiAliasing (st->dpy, st->XOR, False); -#endif /* HAVE_COCOA */ -#endif - - XCopyArea (st->dpy, st->bitmap, st->self, st->CPY, 0, 0, + XCopyArea (st->dpy, st->bitmap, st->self, st->gc, 0, 0, st->width, st->height, (st->size - st->width) >> 1, (st->size - st->height) >> 1); -/* XFreePixmap(st->dpy, st->bitmap);*/ st->qwad = -1; st->first_time = 1; @@ -334,6 +409,7 @@ blitspin_free (Display *dpy, Window window, void *closure) static const char *blitspin_defaults [] = { ".background: black", ".foreground: white", + ".fpsSolid: true", "*delay: 500000", "*delay2: 500000", "*duration: 120", diff --git a/hacks/blitspin.man b/hacks/blitspin.man index 17d28a6f..4a221dac 100644 --- a/hacks/blitspin.man +++ b/hacks/blitspin.man @@ -69,6 +69,9 @@ How long to delay between each 90-degree rotation, in microseconds. Default is 500000, one-half second. .B DISPLAY to get the default host and display number. +.TP 8 +.B \-fps +Display the current frame rate and CPU load. .SH ENVIRONMENT .B XENVIRONMENT to get the name of a resource file that overrides the global resources diff --git a/hacks/bouboule.c b/hacks/bouboule.c index 143354b3..15bf2278 100644 --- a/hacks/bouboule.c +++ b/hacks/bouboule.c @@ -83,7 +83,8 @@ static const char sccsid[] = "@(#)bouboule.c 4.00 97/01/01 xlockmore"; "*right3d: red \n" \ "*left3d: blue \n" \ "*both3d: magenta \n" \ - "*none3d: black \n" + "*none3d: black \n" \ + "*fpsSolid: true \n" # define SMOOTH_COLORS # define reshape_bouboule 0 diff --git a/hacks/bouboule.man b/hacks/bouboule.man index b2a8df24..259490f5 100644 --- a/hacks/bouboule.man +++ b/hacks/bouboule.man @@ -5,6 +5,7 @@ bouboule - draws spinning 3D blobs .B bouboule [\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-3d] +[\-fps] .SH DESCRIPTION The \fIbouboule\fP program draws spinning 3D blobs. .SH OPTIONS @@ -41,6 +42,9 @@ the color wheel. .B \-3d Do red/blue 3d separations (for 3d glasses.) +.TP 8 +.B \-fps +Display the current frame rate and CPU load. .SH ENVIRONMENT .PP .TP 8 diff --git a/hacks/boxfit.c b/hacks/boxfit.c index ce1a4ad5..1fa42ca0 100644 --- a/hacks/boxfit.c +++ b/hacks/boxfit.c @@ -520,6 +520,7 @@ boxfit_free (Display *dpy, Window window, void *closure) static const char *boxfit_defaults [] = { ".background: black", ".foreground: #444444", + "*fpsSolid: true", "*delay: 20000", "*mode: random", "*colors: 64", @@ -553,4 +554,4 @@ static XrmOptionDescRec boxfit_options [] = { }; -XSCREENSAVER_MODULE ("Boxfit", boxfit) +XSCREENSAVER_MODULE ("BoxFit", boxfit) diff --git a/hacks/boxfit.man b/hacks/boxfit.man index ffd74419..ec157e30 100644 --- a/hacks/boxfit.man +++ b/hacks/boxfit.man @@ -15,6 +15,7 @@ boxfit - fills space with a gradient of growing boxes or circles. [\-circles | \-squares | \-random] [\-grab] [\-peek] +[\-fps] .SH DESCRIPTION Packs the screen with growing boxes or circles, colored according to a horizontal or vertical gradient. The objects grow until they touch, @@ -72,6 +73,9 @@ for more details. This option says to briefly show you the underlying image before beginning. The default is not to show the unadulterated image at all. (This only has an effect when \fI\-grab\fP is used.) +.TP 8 +.B \-fps +Display the current frame rate and CPU load. .SH ENVIRONMENT .PP .TP 8 diff --git a/hacks/braid.c b/hacks/braid.c index 1a802ff7..20eeed8a 100644 --- a/hacks/braid.c +++ b/hacks/braid.c @@ -36,7 +36,9 @@ static const char sccsid[] = "@(#)braid.c 5.00 2000/11/01 xlockmore"; "*count: 15 \n" \ "*cycles: 100 \n" \ "*size: -7 \n" \ - "*ncolors: 64 \n" + "*ncolors: 64 \n" \ + "*fpsSolid: true \n" \ + # define UNIFORM_COLORS # define reshape_braid 0 # define braid_handle_event 0 @@ -49,8 +51,7 @@ static const char sccsid[] = "@(#)braid.c 5.00 2000/11/01 xlockmore"; #ifdef MODE_braid -ENTRYPOINT ModeSpecOpt braid_opts = -{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL}; +ENTRYPOINT ModeSpecOpt braid_opts = {0, NULL, 0, NULL, NULL}; #ifdef USE_MODULES ModStruct braid_description = diff --git a/hacks/braid.man b/hacks/braid.man index 65637afe..28f0c4d4 100644 --- a/hacks/braid.man +++ b/hacks/braid.man @@ -5,6 +5,7 @@ braid - draws random color-cycling braids around a circle .B braid [\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] +[\-fps] .SH DESCRIPTION The \fIbraid\fP program draws random color-cycling braids around a circle. .SH OPTIONS @@ -37,6 +38,9 @@ the color wheel. .TP 8 .B \-count \fIinteger\fP +.TP 8 +.B \-fps +Display the current frame rate and CPU load. .SH ENVIRONMENT .PP .TP 8 diff --git a/hacks/bsod.man b/hacks/bsod.man index 7800861b..0ad23e61 100644 --- a/hacks/bsod.man +++ b/hacks/bsod.man @@ -19,6 +19,7 @@ bsod - Blue Screen of Death emulator [\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIseconds\fP] +[\-fps] .SH DESCRIPTION The .I bsod @@ -57,6 +58,9 @@ The delay between displaying one crash and another. .TP 8 .B \-only \fIwhich\fP Tell it to run only one mode, e.g., \fI\-only HPUX\fP. +.TP 8 +.B \-fps +Display the current frame rate and CPU load. .SH ENVIRONMENT .PP .TP 8 diff --git a/hacks/bubbles.c b/hacks/bubbles.c index 50b54dac..54a04574 100644 --- a/hacks/bubbles.c +++ b/hacks/bubbles.c @@ -1,6 +1,6 @@ /* bubbles.c - frying pan / soft drink in a glass simulation */ -/*$Id: bubbles.c,v 1.28 2006/03/13 11:41:31 jwz Exp $*/ +/*$Id: bubbles.c,v 1.30 2008/07/31 19:27:48 jwz Exp $*/ /* * Copyright (C) 1995-1996 James Macnicol @@ -74,11 +74,11 @@ static const char *bubbles_defaults [] = { ".background: black", ".foreground: white", + "*fpsSolid: true", "*simple: false", "*broken: false", - "*delay: 800", + "*delay: 10000", "*quiet: false", - "*nodelay: false", "*mode: float", "*trails: false", "*3D: false", @@ -91,7 +91,6 @@ static XrmOptionDescRec bubbles_options [] = { { "-broken", ".broken", XrmoptionNoArg, "true" }, #endif { "-quiet", ".quiet", XrmoptionNoArg, "true" }, - { "-nodelay", ".nodelay", XrmoptionNoArg, "true" }, { "-3D", ".3D", XrmoptionNoArg, "true" }, { "-delay", ".delay", XrmoptionSepArg, 0 }, { "-mode", ".mode", XrmoptionSepArg, 0 }, @@ -1245,7 +1244,7 @@ static void get_resources(struct state *st) /* Get the appropriate X resources and warn about any inconsistencies. */ { - Bool nodelay, rise; + Bool rise; XWindowAttributes xgwa; Colormap cmap; char *s; @@ -1263,11 +1262,6 @@ get_resources(struct state *st) st->simple = True; } st->delay = get_integer_resource(st->dpy, "delay", "Integer"); - nodelay = get_boolean_resource(st->dpy, "nodelay", "Boolean"); - if (nodelay) - st->delay = 0; - if (st->delay < 0) - st->delay = 0; s = get_string_resource (st->dpy, "mode", "Mode"); rise = False; @@ -1406,11 +1400,13 @@ static unsigned long bubbles_draw (Display *dpy, Window window, void *closure) { struct state *st = (struct state *) closure; - Bubble *tmp; - - tmp = new_bubble(st); - add_to_mesh(st, tmp); - insert_new_bubble(st, tmp); + int i; + for (i = 0; i < 5; i++) + { + Bubble *tmp = new_bubble(st); + add_to_mesh(st, tmp); + insert_new_bubble(st, tmp); + } return st->delay; } diff --git a/hacks/bubbles.man b/hacks/bubbles.man index 268929de..f9b892e6 100644 --- a/hacks/bubbles.man +++ b/hacks/bubbles.man @@ -17,6 +17,7 @@ bubbles - frying pan / soft drink simulation .SH SYNOPSIS .B bubbles [\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-simple] [\-broken] [\-3D] [\-rise|\-drop] [-trails] +[\-fps] .SH DESCRIPTION \fIBubbles\fP sprays lots of little random bubbles all over the window which then grow until they reach their maximum size and go pop. The inspiration @@ -85,6 +86,9 @@ were ignored. This is disabled by default. .B \-rise | \-drop .TP 8 .B \-trails +.TP 8 +.B \-fps +Display the current frame rate and CPU load. .SH NOTES If you find the pace of things too slow, remember that there is a delay even though you specify no \fI\-delay\fP option. Try using \fI\-nodelay\fP diff --git a/hacks/bumps.c b/hacks/bumps.c index 094d3130..c65d46f0 100644 --- a/hacks/bumps.c +++ b/hacks/bumps.c @@ -28,7 +28,110 @@ * for code optimization. */ -#include "bumps.h" + +#include +#include "screenhack.h" + +#ifdef HAVE_XSHM_EXTENSION +#include "xshm.h" +#endif /* HAVE_XSHM_EXTENSION */ + + +/* Defines: */ +/* #define VERBOSE */ +#define RANDOM() ((int) (random() & 0X7FFFFFFFL)) + +typedef signed char int8_; +typedef unsigned char uint8_; +typedef short int16_; +typedef unsigned short uint16_; +typedef long int32_; +typedef unsigned long uint32_; +typedef unsigned char BOOL; + + +/* Globals: */ + +static const char *bumps_defaults [] = { + ".background: black", + ".foreground: white", + "*fpsSolid: true", + "*color: random", + "*colorcount: 64", + "*delay: 30000", + "*duration: 120", + "*soften: 1", + "*invert: FALSE", +#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */ + "*visualID: Best", +#endif +#ifdef HAVE_XSHM_EXTENSION + "*useSHM: True", +#endif /* HAVE_XSHM_EXTENSION */ + 0 +}; + +static XrmOptionDescRec bumps_options [] = { + { "-color", ".color", XrmoptionSepArg, 0 }, + { "-colorcount", ".colorcount", XrmoptionSepArg, 0 }, + { "-duration", ".duration", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-soften", ".soften", XrmoptionSepArg, 0 }, + { "-invert", ".invert", XrmoptionNoArg, "TRUE" }, +#ifdef HAVE_XSHM_EXTENSION + { "-shm", ".useSHM", XrmoptionNoArg, "True" }, + { "-no-shm", ".useSHM", XrmoptionNoArg, "False" }, +#endif /* HAVE_XSHM_EXTENSION */ + + { 0, 0, 0, 0 } +}; + + +/* This structure handles everything to do with the spotlight, and is designed to be + * a member of TBumps. */ +typedef struct +{ + uint8_ *aLightMap; + uint16_ nFalloffDiameter, nFalloffRadius; + uint16_ nLightDiameter, nLightRadius; + float nAccelX, nAccelY; + float nAccelMax; + float nVelocityX, nVelocityY; + float nVelocityMax; + float nXPos, nYPos; +} SSpotLight; + + +/* The entire program's operation is contained within this structure. */ +typedef struct +{ + /* XWindows specific variables. */ + Display *dpy; + Window Win; + Screen *screen; + Pixmap source; + GC GraphicsContext; + XColor *xColors; + uint32_ *aColors; + XImage *pXImage; +#ifdef HAVE_XSHM_EXTENSION + XShmSegmentInfo XShmInfo; + Bool bUseShm; +#endif /* HAVE_XSHM_EXTENSION */ + + uint8_ nColorCount; /* Number of colors used. */ + uint8_ bytesPerPixel; + uint16_ iWinWidth, iWinHeight; + uint16_ *aBumpMap; /* The actual bump map. */ + SSpotLight SpotLight; + + int delay; + int duration; + time_t start_time; + + async_load_state *img_loader; +} SBumps; + static void SetPalette(Display *, SBumps *, XWindowAttributes * ); static void InitBumpMap(Display *, SBumps *, XWindowAttributes * ); diff --git a/hacks/bumps.h b/hacks/bumps.h deleted file mode 100644 index afac1b1c..00000000 --- a/hacks/bumps.h +++ /dev/null @@ -1,140 +0,0 @@ -/* Bumps, Copyright (c) 2001 Shane Smit - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation. No representations are made about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - * Module: "Bumps.h" - * Tab Size: 4 - * - * Description: - * Header file for module "Bumps.c" - * - * Modification History: - * [10/01/99] - Shane Smit: Creation - * [10/08/99] - Shane Smit: Port to C. (Ick) - * [03/08/02] - Shane Smit: New movement code. - * [09/12/02] - Shane Smit: MIT-SHM XImages. - * Thanks to Kennett Galbraith - * for code optimization. - */ - - -#ifndef _BUMPS_H -#define _BUMPS_H - - -#include -#include "screenhack.h" - -#ifdef HAVE_XSHM_EXTENSION -#include "xshm.h" -#endif /* HAVE_XSHM_EXTENSION */ - - -/* Defines: */ -/* #define VERBOSE */ -#define RANDOM() ((int) (random() & 0X7FFFFFFFL)) - -typedef signed char int8_; -typedef unsigned char uint8_; -typedef short int16_; -typedef unsigned short uint16_; -typedef long int32_; -typedef unsigned long uint32_; -typedef unsigned char BOOL; - - -/* Globals: */ - -static const char *bumps_defaults [] = { - ".background: black", - ".foreground: white", - "*color: random", - "*colorcount: 64", - "*delay: 30000", - "*duration: 120", - "*soften: 1", - "*invert: FALSE", -#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */ - "*visualID: Best", -#endif -#ifdef HAVE_XSHM_EXTENSION - "*useSHM: True", -#endif /* HAVE_XSHM_EXTENSION */ - 0 -}; - -static XrmOptionDescRec bumps_options [] = { - { "-color", ".color", XrmoptionSepArg, 0 }, - { "-colorcount", ".colorcount", XrmoptionSepArg, 0 }, - { "-duration", ".duration", XrmoptionSepArg, 0 }, - { "-delay", ".delay", XrmoptionSepArg, 0 }, - { "-soften", ".soften", XrmoptionSepArg, 0 }, - { "-invert", ".invert", XrmoptionNoArg, "TRUE" }, -#ifdef HAVE_XSHM_EXTENSION - { "-shm", ".useSHM", XrmoptionNoArg, "True" }, - { "-no-shm", ".useSHM", XrmoptionNoArg, "False" }, -#endif /* HAVE_XSHM_EXTENSION */ - - { 0, 0, 0, 0 } -}; - - -/* This structure handles everything to do with the spotlight, and is designed to be - * a member of TBumps. */ -typedef struct -{ - uint8_ *aLightMap; - uint16_ nFalloffDiameter, nFalloffRadius; - uint16_ nLightDiameter, nLightRadius; - float nAccelX, nAccelY; - float nAccelMax; - float nVelocityX, nVelocityY; - float nVelocityMax; - float nXPos, nYPos; -} SSpotLight; - -void CreateTables( SSpotLight * ); - - -/* The entire program's operation is contained within this structure. */ -typedef struct -{ - /* XWindows specific variables. */ - Display *dpy; - Window Win; - Screen *screen; - Pixmap source; - GC GraphicsContext; - XColor *xColors; - uint32_ *aColors; - XImage *pXImage; -#ifdef HAVE_XSHM_EXTENSION - XShmSegmentInfo XShmInfo; - Bool bUseShm; -#endif /* HAVE_XSHM_EXTENSION */ - - uint8_ nColorCount; /* Number of colors used. */ - uint8_ bytesPerPixel; - uint16_ iWinWidth, iWinHeight; - uint16_ *aBumpMap; /* The actual bump map. */ - SSpotLight SpotLight; - - int delay; - int duration; - time_t start_time; - - async_load_state *img_loader; -} SBumps; - - -#endif /* _BUMPS_H */ - - -/* vim: ts=4 - */ diff --git a/hacks/bumps.man b/hacks/bumps.man index d6f80145..8e471840 100644 --- a/hacks/bumps.man +++ b/hacks/bumps.man @@ -13,6 +13,7 @@ bumps - move distorting spotlight around desktop [\-visual \fIvisual\fP] [\-delay \fIusecs\fP] [\-duration \fIsecs\fP] +[\-fps] .SH DESCRIPTION The \fIbumps\fP program takes an image and exposes small, distorted sections of it as if through an odd wandering spotlight beam. @@ -50,6 +51,9 @@ Slow it down. .TP 8 .B \-duration \fIseconds\fP How long to run before loading a new image. Default 120 seconds. +.TP 8 +.B \-fps +Display the current frame rate and CPU load. .SH ENVIRONMENT .PP .TP 8 diff --git a/hacks/ccurve.c b/hacks/ccurve.c index 02cb0ba3..27645d7f 100644 --- a/hacks/ccurve.c +++ b/hacks/ccurve.c @@ -178,7 +178,7 @@ realign (double x1, } } -static void +static Bool self_similar_normalized (struct state *st, int iterations, double x1, @@ -228,24 +228,36 @@ self_similar_normalized (struct state *st, assert (fabs ((replacement [segment_count - 1].x) - 1.0) < EPSILON); assert (fabs (replacement [segment_count - 1].y) < EPSILON); realign (x1, y1, x2, y2, segment_count, replacement); - assert (fabs (x2 - (replacement [segment_count - 1].x)) < EPSILON); - assert (fabs (y2 - (replacement [segment_count - 1].y)) < EPSILON); + /* jwz: I don't understand what these assertions are supposed to + be detecting, but let's just bail on the fractal instead of + crashing. */ +/* assert (fabs (x2 - (replacement [segment_count - 1].x)) < EPSILON); + assert (fabs (y2 - (replacement [segment_count - 1].y)) < EPSILON);*/ + if (fabs (x2 - (replacement [segment_count - 1].x)) >= EPSILON || + fabs (y2 - (replacement [segment_count - 1].y)) >= EPSILON) { + free (replacement); + return False; + } x = x1; y = y1; for (index = 0; index < segment_count; ++index) { next_x = replacement [index].x; next_y = replacement [index].y; - self_similar_normalized (st, + if (!self_similar_normalized (st, iterations - 1, x, y, next_x, next_y, maximum_x, maximum_y, minimum_x, minimum_y, - segment_count, points); + segment_count, points)) { + free(replacement); + return False; + } x = next_x; y = next_y; } - free((void*)replacement); + free(replacement); } + return True; } static void diff --git a/hacks/ccurve.man b/hacks/ccurve.man index c06dafe8..93b81fc1 100644 --- a/hacks/ccurve.man +++ b/hacks/ccurve.man @@ -10,6 +10,7 @@ ccurve - self-similar linear fractals. [\-delay \fInumber\fP] [\-pause \fInumber\fP] [\-limit \fInumber\fP] +[\-fps] .SH DESCRIPTION Generates self-similar linear fractals, including the classic ``C Curve.'' .SH OPTIONS @@ -32,6 +33,9 @@ Duration. 1 - 60. Default: 3. .TP 8 .B \-limit \fInumber\fP Density. 3 - 300000. Default: 200000. +.TP 8 +.B \-fps +Display the current frame rate and CPU load. .SH ENVIRONMENT .PP .TP 8 diff --git a/hacks/celtic.c b/hacks/celtic.c index 92cba9c8..a6094a42 100644 --- a/hacks/celtic.c +++ b/hacks/celtic.c @@ -835,6 +835,7 @@ static void pattern_animate(struct state *st) static const char *celtic_defaults[] = { ".background: black", ".foreground: #333333", + "*fpsSolid: true", "*ncolors: 20", "*delay: 10000", "*delay2: 5", diff --git a/hacks/celtic.man b/hacks/celtic.man index 7f564fa9..9747cd5e 100644 --- a/hacks/celtic.man +++ b/hacks/celtic.man @@ -11,6 +11,7 @@ celtic - draws celtic cross-stich patterns [\-delay2 \fInumber\fP] [\-ncolors \fInumber\fP] [\-graph \fImode\fP] +[\-fps] .SH DESCRIPTION The \fIceltic\fP program repeatedly draws random cross-stitch patterns. .SH OPTIONS @@ -36,6 +37,9 @@ Number of colours to use. Default: 20. .TP 8 .B \-graph Whether to render the underlying graph. Default: no. +.TP 8 +.B \-fps +Display the current frame rate and CPU load. .SH ENVIRONMENT .PP .TP 8 diff --git a/hacks/check-configs.pl b/hacks/check-configs.pl new file mode 100755 index 00000000..28beb6f2 --- /dev/null +++ b/hacks/check-configs.pl @@ -0,0 +1,340 @@ +#!/usr/bin/perl -w +# Copyright © 2008 Jamie Zawinski +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation. No representations are made about the suitability of this +# software for any purpose. It is provided "as is" without express or +# implied warranty. +# +# This parses the .c and .xml files and makes sure they are in sync: that +# options are spelled the same, and that all the numbers are in sync. +# +# Created: 1-Aug-2008. + +require 5; +use diagnostics; +use strict; + +my $progname = $0; $progname =~ s@.*/@@g; +my $version = q{ $Revision: 1.2 $ }; $version =~ s/^[^\d]+([\d.]+).*/$1/; + +my $verbose = 0; + + +my $xlockmore_default_opts = ''; +foreach (qw(count cycles delay ncolors size font)) { + $xlockmore_default_opts .= "{\"-$_\", \".$_\", XrmoptionSepArg, 0},\n"; +} +$xlockmore_default_opts .= + "{\"-wireframe\", \".wireframe\", XrmoptionNoArg, \"true\"},\n" . + "{\"-3d\", \".use3d\", XrmoptionNoArg, \"true\"},\n"; + + +# Returns two tables: +# - A table of the default resource values. +# - A table of "-switch" => "resource: value", or "-switch" => "resource: %" +# +sub parse_src($) { + my ($saver) = @_; + my $file = lc($saver) . ".c"; + + # kludge... + $file = 'apple2-main.c' if ($file eq 'apple2.c'); + $file = 'sproingiewrap.c' if ($file eq 'sproingies.c'); + $file = 'b_lockglue.c' if ($file eq 'bubble3d.c'); + $file = 'polyhedra-gl.c' if ($file eq 'polyhedra.c'); + + $file = "glx/$file" unless (-f $file); + my $body = ''; + local *IN; + open (IN, "<$file") || error ("$file: $!"); + while () { $body .= $_; } + close IN; + $file =~ s@^.*/@@; + + $body =~ s@/\*.*?\*/@@gs; + $body =~ s@^#\s*(if|ifdef|ifndef|elif|else|endif).*$@@gm; + $body =~ s/ANALOGTV_(DEFAULTS|OPTIONS)//gs; + + my $xlockmore_p = 0; + + print STDERR "$progname: $file: defaults:\n" if ($verbose > 2); + my %res_to_val; + if ($body =~ m/_defaults\s*\[\]\s*=\s*{(.*?)}\s*;/s) { + foreach (split (/,\s*\n/, $1)) { + s/^\s*//s; + s/\s*$//s; + next if m/^0?$/s; + my ($key, $val) = m@^\"([^:\s]+)\s*:\s*(.*?)\s*\"$@; + print STDERR "$progname: $file: unparsable: $_\n" unless $key; + $key =~ s/^[.*]//s; + $res_to_val{$key} = $val; + print STDERR "$progname: $file: $key = $val\n" if ($verbose > 2); + } + } elsif ($body =~ m/\#\s*define\s*DEFAULTS\s*\\?\s*(.*?)\n[\n#]/s) { + $xlockmore_p = 1; + my $str = $1; + $str =~ s/\"\s*\\\n\s*\"//gs; + $str =~ m/^\s*\"(.*?)\"\s*\\?\s*$/ || + error ("$file: unparsable defaults: $str"); + $str = $1; + $str =~ s/\s*\\n\s*/\n/gs; + foreach (split (/\n/, $str)) { + my ($key, $val) = m@^([^:\s]+)\s*:\s*(.*?)\s*$@; + print STDERR "$progname: $file: unparsable: $_\n" unless $key; + $key =~ s/^[.*]//s; + $res_to_val{$key} = $val; + print STDERR "$progname: $file: $key = $val\n" if ($verbose > 2); + } + + while ($body =~ s/^#\s*define\s+(DEF_([A-Z\d_]+))\s+\"([^\"]+)\"//m) { + my ($key1, $key2, $val) = ($1, lc($2), $3); + $key2 =~ s/_(.)/\U$1/gs; # "foo_bar" -> "fooBar" + $key2 =~ s/Rpm/RPM/; # kludge + $res_to_val{$key2} = $val; + print STDERR "$progname: $file: $key1 ($key2) = $val\n" + if ($verbose > 2); + } + + } else { + error ("$file: no defaults"); + } + + $body =~ m/XSCREENSAVER_MODULE(_2)?\s*\(\s*\"([^\"]+)\"/ || + error ("$file: no module name"); + $res_to_val{progclass} = $2; + $res_to_val{doFPS} = 'false'; + print STDERR "$progname: $file: progclass = $2\n" if ($verbose > 2); + + print STDERR "$progname: $file: switches to resources:\n" + if ($verbose > 2); + my %switch_to_res; + $switch_to_res{-fps} = 'doFPS: true'; + + my ($ign, $opts) = ($body =~ m/(_options|\bopts)\s*\[\]\s*=\s*{(.*?)}\s*;/s); + if ($xlockmore_p || $opts) { + $opts = '' unless $opts; + $opts .= ",\n$xlockmore_default_opts" if ($xlockmore_p); + foreach (split (/,\s*\n/, $opts)) { + s/^\s*//s; + s/\s*$//s; + next if m/^$/s; + next if m/^{\s*0\s*,/s; + my ($switch, $res, $type, $v0, $v1, $v2) = + m@^ \s* { \s * \"([^\"]+)\" \s* , + \s * \"([^\"]+)\" \s* , + \s * ([^\s]+) \s* , + \s * (\"([^\"]*)\"|([a-zA-Z\d_]+)) \s* }@xi; + print STDERR "$progname: $file: unparsable: $_\n" unless $switch; + my $val = defined($v1) ? $v1 : $v2; + $val = '%' if ($type eq 'XrmoptionSepArg'); + $res =~ s/^[.*]//s; + $res =~ s/^[a-z\d]+\.//si; + $switch =~ s/^\+/-no-/s; + + $val = "$res: $val"; + if (defined ($switch_to_res{$switch})) { + print STDERR "$progname: $file: DUP! $switch = \"$val\"\n" + if ($verbose > 2); + } else { + $switch_to_res{$switch} = $val; + print STDERR "$progname: $file: $switch = \"$val\"\n" + if ($verbose > 2); + } + } + } else { + error ("$file: no options"); + } + + return (\%res_to_val, \%switch_to_res); +} + +# Returns a list of: +# "resource = default value" +# or "resource != non-default value" +# +sub parse_xml($$) { + my ($saver, $switch_to_res) = @_; + my $file = "config/" . lc($saver) . ".xml"; + my $body = ''; + local *IN; + open (IN, "<$file") || error ("$file: $!"); + while () { $body .= $_; } + close IN; + $file =~ s@^.*/@@; + + my @result = (); + + $body =~ s// /gsi; + + $body =~ s/\s+/ /gs; + $body =~ s/ 2); + foreach (split (m/\001/, $body)) { + next if (m/^\s*$/s); + my ($type, $args) = m@^<([?/]?[-_a-z]+)\b\s*(.*)$@si; + error ("$progname: $file: unparsable: $_") unless $type; + next if ($type =~ m@^/@); + + if ($type =~ m/^([hv]group|\?xml|command|string|file|_description|xscreensaver-(image|text))/s) { + + } elsif ($type eq 'screensaver') { + my ($name) = ($args =~ m/\b_label\s*=\s*\"([^\"]+)\"/); + my $val = "progclass = $name"; + push @result, $val; + print STDERR "$progname: $file: name: $name\n" if ($verbose > 2); + + } elsif ($type eq 'number') { + my ($arg) = ($args =~ m/\barg\s*=\s*\"([^\"]+)\"/); + my ($val) = ($args =~ m/\bdefault\s*=\s*\"([^\"]+)\"/); + $val = '' unless defined($val); + + my $switch = $arg; + $switch =~ s/\s+.*$//; + my ($res) = $switch_to_res->{$switch}; + error ("$file: no resource for $type switch \"$arg\"") unless $res; + $res =~ s/: \%$//; + error ("$file: unparsable value: $res") if ($res =~ m/:/); + $val = "$res = $val"; + push @result, $val; + print STDERR "$progname: $file: number: $val\n" if ($verbose > 2); + + } elsif ($type eq 'boolean') { + my ($set) = ($args =~ m/\barg-set\s*=\s*\"([^\"]+)\"/); + my ($unset) = ($args =~ m/\barg-unset\s*=\s*\"([^\"]+)\"/); + my ($arg) = $set || $unset || error ("$file: unparsable: $args"); + my ($res) = $switch_to_res->{$arg}; + error ("$file: no resource for boolean switch \"$arg\"") unless $res; + my ($res2, $val) = ($res =~ m/^(.*?): (.*)$/s); + error ("$file: unparsable boolean resource: $res") unless $res2; + $res = $res2; +# $val = ($set ? "$res != $val" : "$res = $val"); + $val = "$res != $val"; + push @result, $val; + print STDERR "$progname: $file: boolean: $val\n" if ($verbose > 2); + + } elsif ($type eq 'select') { + $args =~ s/{$set}; + error ("$file: no resource for select switch \"$set\"") unless $res; + + my ($res2, $val2) = ($res =~ m/^(.*?): (.*)$/s); + error ("$file: unparsable select resource: $res") unless $res2; + $res = $res2; + $val = $val2 unless ($val2 eq '%'); + + error ("$file: mismatched resources: $res vs $this_res") + if (defined($this_res) && $this_res ne $res); + $this_res = $res; + + $val = "$res != $val"; + push @result, $val; + print STDERR "$progname: $file: select: $val\n" if ($verbose > 2); + + } else { + error ("$file: multiple default options: $set") if ($unset_p); + $unset_p++; + } + } + + } else { + error ("$file: unknown type \"$type\" for no arg"); + } + } + + return @result; +} + + +sub check_config($) { + my ($saver) = @_; + + # kludge + return 0 if ($saver =~ m/(-helper|hypertorus|polytopes)$/); + + my ($src_opts, $switchmap) = parse_src ($saver); + my (@xml_opts) = parse_xml ($saver, $switchmap); + + my $failures = 0; + foreach my $claim (@xml_opts) { + my ($res, $compare, $xval) = ($claim =~ m/^(.*) (=|!=) (.*)$/s); + error ("$saver: unparsable xml claim: $_") unless $compare; + + my $sval = $src_opts->{$res}; + if (!defined($sval)) { + print STDERR "$progname: $saver: $res: not in source\n"; + } elsif ($compare eq '!=' + ? $sval eq $xval + : $sval ne $xval) { + print STDERR "$progname: $saver: " . + "src has \"$res = $sval\", xml has \"$claim\"\n"; + $failures++; + } elsif ($verbose > 1) { + print STDERR "$progname: $saver: OK: \"$res = $sval\" vs \"$claim\"\n"; + } + } + + # Now make sure the progclass in the source and XML also matches + # the XCode target name. + # + my $obd = "../OSX/build/Debug"; + if (-d $obd) { + my $progclass = $src_opts->{progclass}; + my $f = (glob("$obd/$progclass.saver*"))[0]; + if (!$f && $progclass ne 'Flurry') { + print STDERR "$progname: $progclass.saver does not exist\n"; + $failures++; + } + } + + print STDERR "$progname: $saver: OK\n" + if ($verbose == 1 && $failures == 0); + + return $failures; +} + + +sub error($) { + my ($err) = @_; + print STDERR "$progname: $err\n"; + exit 1; +} + +sub usage() { + print STDERR "usage: $progname [--verbose] files ...\n"; + exit 1; +} + +sub main() { + my @files = (); + while ($#ARGV >= 0) { + $_ = shift @ARGV; + if (m/^--?verbose$/) { $verbose++; } + elsif (m/^-v+$/) { $verbose += length($_)-1; } + elsif (m/^-./) { usage; } + else { push @files, $_; } +# else { usage; } + } + + usage unless ($#files >= 0); + my $failures = 0; + foreach (@files) { $failures += check_config($_); } + exit ($failures); +} + +main(); diff --git a/hacks/cloudlife.c b/hacks/cloudlife.c index 8d898d8f..911b99be 100644 --- a/hacks/cloudlife.c +++ b/hacks/cloudlife.c @@ -390,6 +390,7 @@ cloudlife_free (Display *dpy, Window window, void *closure) static const char *cloudlife_defaults[] = { ".background: black", ".foreground: blue", + "*fpsSolid: true", "*cycleDelay: 25000", "*cycleColors: 2", "*ncolors: 64", @@ -412,4 +413,4 @@ static XrmOptionDescRec cloudlife_options[] = { }; -XSCREENSAVER_MODULE ("Cloudlife", cloudlife) +XSCREENSAVER_MODULE ("CloudLife", cloudlife) diff --git a/hacks/cloudlife.man b/hacks/cloudlife.man index 00cbfec2..35eae126 100644 --- a/hacks/cloudlife.man +++ b/hacks/cloudlife.man @@ -5,6 +5,7 @@ cloudlife - a cellular automaton based on Conway's Life .B cloudlife [\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-cycle-delay \fImicroseconds\fP] [\-cycle-colors \fIinteger\fP][\-cell-size \fIinteger\fP] [\-initial-density \fIinteger\fP] [\-max-age \fIinteger\fP] +[\-fps] .SH DESCRIPTION The \fIcloudlife\fP program draws a cellular automaton based on Conway's Life, except that @@ -50,8 +51,9 @@ field is repopulated. Default 30. .TP 8 .B \-max-age \fIinteger\fP Maximum age for a cell. Default 64. - - +.TP 8 +.B \-fps +Display the current frame rate and CPU load. .SH ENVIRONMENT .PP .TP 8 diff --git a/hacks/compass.man b/hacks/compass.man index 86ea0443..8d7cc7e1 100644 --- a/hacks/compass.man +++ b/hacks/compass.man @@ -9,6 +9,7 @@ compass - draws a spinning compass. [\-root] [\-delay \fInumber\fP] [\-no-db] +[\-fps] .SH DESCRIPTION This draws a compass, with all elements spinning about randomly, for that ``lost and nauseous'' feeling. @@ -29,6 +30,9 @@ Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.). .TP 8 .B \-db | \-no-db Double Buffer. Boolean. +.TP 8 +.B \-fps +Display the current frame rate and CPU load. .SH ENVIRONMENT .PP .TP 8 diff --git a/hacks/compile_axp.com b/hacks/compile_axp.com index 2a59158c..96d04d69 100644 --- a/hacks/compile_axp.com +++ b/hacks/compile_axp.com @@ -47,6 +47,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLUIDBALLS.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FONTGLIDE.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FOREST.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FPS.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FUZZYFLAKES.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GALAXY.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GOOP.C diff --git a/hacks/compile_decc.com b/hacks/compile_decc.com index 2a59158c..96d04d69 100644 --- a/hacks/compile_decc.com +++ b/hacks/compile_decc.com @@ -47,6 +47,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLUIDBALLS.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FONTGLIDE.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FOREST.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FPS.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FUZZYFLAKES.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GALAXY.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GOOP.C diff --git a/hacks/config/README b/hacks/config/README index df490d30..ec3cb5f8 100644 --- a/hacks/config/README +++ b/hacks/config/README @@ -4,8 +4,8 @@ a screen saver and locker for the X window system by Jamie Zawinski - version 5.06 - 16-Jul-2008 + version 5.07 + 10-Aug-2008 http://www.jwz.org/xscreensaver/ diff --git a/hacks/config/abstractile.xml b/hacks/config/abstractile.xml index 6e409e55..879da91c 100644 --- a/hacks/config/abstractile.xml +++ b/hacks/config/abstractile.xml @@ -4,23 +4,26 @@ - - + + + + <_description> Generates mosaic patterns of interlocking tiles. diff --git a/hacks/config/anemone.xml b/hacks/config/anemone.xml index d872b8b0..d951149e 100644 --- a/hacks/config/anemone.xml +++ b/hacks/config/anemone.xml @@ -36,10 +36,12 @@ + + <_description> Wiggling tentacles. diff --git a/hacks/config/anemotaxis.xml b/hacks/config/anemotaxis.xml index 7f49e8d3..2f5da19c 100644 --- a/hacks/config/anemotaxis.xml +++ b/hacks/config/anemotaxis.xml @@ -5,8 +5,8 @@ + + <_description> Anemotaxis demonstrates a search algorithm designed for locating a source of odor in turbulent atmosphere. The searcher is able to sense the odor and determine local instantaneous wind direction. The goal is to find the source in the shortest mean time. +http://en.wikipedia.org/wiki/Anemotaxis + Written by Eugene Balkovsky; 2004. diff --git a/hacks/config/ant.xml b/hacks/config/ant.xml index 4e300e7b..b2a59928 100644 --- a/hacks/config/ant.xml +++ b/hacks/config/ant.xml @@ -4,44 +4,47 @@ - - - - - - - +
+ + + +
- +
+ + +
+ _label="Number of colors" _low-label="Three" _high-label="Many" + low="3" high="255" default="64"/> + + <_description> A cellular automaton that is really a two-dimensional Turing machine: @@ -49,6 +52,9 @@ as the heads ("ants") walk along the screen, they change pixel values in their path. Then, as they pass over changed pixels, their behavior is influenced. +http://en.wikipedia.org/wiki/Langton%27s_ant +http://en.wikipedia.org/wiki/Turing_machine + Written by David Bagley; 1997.
diff --git a/hacks/config/antinspect.xml b/hacks/config/antinspect.xml index 7b9bbf8e..0583a8ce 100644 --- a/hacks/config/antinspect.xml +++ b/hacks/config/antinspect.xml @@ -5,13 +5,13 @@ - + - + <_description> Draws a trio of ants moving their spheres around a circle. diff --git a/hacks/config/antmaze.xml b/hacks/config/antmaze.xml index 0fe1eb81..d1a79a07 100644 --- a/hacks/config/antmaze.xml +++ b/hacks/config/antmaze.xml @@ -5,11 +5,11 @@ - + <_description> Draws a few views of a few ants walking around in a simple maze. diff --git a/hacks/config/antspotlight.xml b/hacks/config/antspotlight.xml index 706cf441..f142b7b7 100644 --- a/hacks/config/antspotlight.xml +++ b/hacks/config/antspotlight.xml @@ -5,13 +5,13 @@ - + <_description> Draws an ant (with a headlight) who walks on top of an diff --git a/hacks/config/apollonian.xml b/hacks/config/apollonian.xml index e89ea98c..a563fcd5 100644 --- a/hacks/config/apollonian.xml +++ b/hacks/config/apollonian.xml @@ -4,9 +4,9 @@ - + - @@ -16,7 +16,7 @@ low="1" high="20" default="20"/> + + <_description> -Packs a large circle with smaller circles, demonstrating the -Descartes Circle Theorem. +Draws an Apollonian gasket: a fractal packing of circles with +smaller circles, demonstrating Descartes's theorem. + +http://en.wikipedia.org/wiki/Apollonian_gasket +http://en.wikipedia.org/wiki/Descartes%27_theorem Written by Allan R. Wilks and David Bagley; 2002. diff --git a/hacks/config/apple2.xml b/hacks/config/apple2.xml index 31938c9e..36b1c1af 100644 --- a/hacks/config/apple2.xml +++ b/hacks/config/apple2.xml @@ -1,6 +1,6 @@ - + @@ -8,16 +8,20 @@ diff --git a/hacks/config/atlantis.xml b/hacks/config/atlantis.xml index 135f71eb..c31ba6da 100644 --- a/hacks/config/atlantis.xml +++ b/hacks/config/atlantis.xml @@ -4,34 +4,39 @@ - - + + - - - - - - - - + + +
+ + + +
+ +
+ + +
<_description> A 3D animation of a number of sharks, dolphins, and whales. diff --git a/hacks/config/attraction.xml b/hacks/config/attraction.xml index 868f87aa..c4f241be 100644 --- a/hacks/config/attraction.xml +++ b/hacks/config/attraction.xml @@ -6,67 +6,60 @@
+ + _label="Ball count" low="0" high="200" default="0"/> + + + + + + + +
- - - - - - - - - - - -
- + + low="-5.0" high="5.0" default="0.9"/>
@@ -76,6 +69,8 @@ + + <_description> Uses a simple simple motion model to generate many different display diff --git a/hacks/config/atunnel.xml b/hacks/config/atunnel.xml index dbd0ccc0..28cb1dd2 100644 --- a/hacks/config/atunnel.xml +++ b/hacks/config/atunnel.xml @@ -5,14 +5,14 @@ - + <_description> Draws an animation of a textured tunnel in GL. diff --git a/hacks/config/barcode.xml b/hacks/config/barcode.xml index 6973946d..13564ce6 100644 --- a/hacks/config/barcode.xml +++ b/hacks/config/barcode.xml @@ -4,21 +4,28 @@ + + - + <_description> Draws a random sequence of colorful barcodes scrolling across your -screen. CONSUME! +screen. CONSUME! + +The barcodes follow the UPC-A, UPC-E, EAN-8 or EAN-13 standards. + +http://en.wikipedia.org/wiki/Universal_Product_Code +http://en.wikipedia.org/wiki/European_Article_Number Written by Dan Bornstein; 2003. diff --git a/hacks/config/blaster.xml b/hacks/config/blaster.xml index 44d0d268..c03c135c 100644 --- a/hacks/config/blaster.xml +++ b/hacks/config/blaster.xml @@ -4,6 +4,11 @@ + + @@ -14,11 +19,6 @@ _label="Stars" _low-label="Few" _high-label="Many" low="5" high="200" default="50"/> - - @@ -48,6 +48,8 @@ + + <_description> Draws a simulation of flying space-combat robots (cleverly disguised as colored circles) doing battle in front of a moving star field. diff --git a/hacks/config/blinkbox.xml b/hacks/config/blinkbox.xml index 270768e5..b8652334 100644 --- a/hacks/config/blinkbox.xml +++ b/hacks/config/blinkbox.xml @@ -5,24 +5,26 @@ + _label="Frame rate" _low-label="Low" _high-label="High" + low="0" high="100000" default="30000" + convert="invert"/> - +
- -
-
+
+ + <_description> Shows a ball contained inside of a bounding box. -Colored blocks blink in when the ball hits the edges. +Colored blocks blink in when the ball hits the sides. Written by Jeremy English; 2003. diff --git a/hacks/config/blitspin.xml b/hacks/config/blitspin.xml index 0d838864..00cfaccc 100644 --- a/hacks/config/blitspin.xml +++ b/hacks/config/blitspin.xml @@ -5,12 +5,12 @@ @@ -22,6 +22,8 @@ + + <_description> Repeatedly rotates a bitmap by 90 degrees by using logical operations: diff --git a/hacks/config/blocktube.xml b/hacks/config/blocktube.xml index 33bdd054..89f617b5 100644 --- a/hacks/config/blocktube.xml +++ b/hacks/config/blocktube.xml @@ -5,21 +5,21 @@ - + <_description> Draws a swirling, falling tunnel of reflective slabs. They fade from diff --git a/hacks/config/boing.xml b/hacks/config/boing.xml index 98e8d1d9..64bcce29 100644 --- a/hacks/config/boing.xml +++ b/hacks/config/boing.xml @@ -26,7 +26,7 @@
- +
@@ -37,7 +37,10 @@ This bouncing ball is a clone of the first graphics demo for the Amiga the 1984 Consumer Electronics Show (or so the legend goes.) This looks like the original Amiga demo if you turn off "smoothing" -and "lighting" and turn on "scanlines". +and "lighting" and turn on "scanlines", and is somewhat more modern +otherwise. + +http://en.wikipedia.org/wiki/Amiga#Boing_Ball Written by Jamie Zawinski; 2005. diff --git a/hacks/config/bouboule.xml b/hacks/config/bouboule.xml index 8a1ded1f..237646a3 100644 --- a/hacks/config/bouboule.xml +++ b/hacks/config/bouboule.xml @@ -5,20 +5,22 @@ + + <_description> This draws what looks like a spinning, deforming balloon with varying-sized spots painted on its invisible surface. diff --git a/hacks/config/bouncingcow.xml b/hacks/config/bouncingcow.xml index b25c7c79..c5ce4c55 100644 --- a/hacks/config/bouncingcow.xml +++ b/hacks/config/bouncingcow.xml @@ -4,21 +4,21 @@ - - + + - + <_description> A Cow. A Trampoline. Together, they fight crime. diff --git a/hacks/config/boxed.xml b/hacks/config/boxed.xml index c93bd2e9..cec13297 100644 --- a/hacks/config/boxed.xml +++ b/hacks/config/boxed.xml @@ -4,40 +4,48 @@ - +
+ - + + - + - + - + - + - + -
- + + + + + + +
+ <_description> Draws a box full of 3D bouncing balls that explode. diff --git a/hacks/config/boxfit.xml b/hacks/config/boxfit.xml index 52560a21..19a1340a 100644 --- a/hacks/config/boxfit.xml +++ b/hacks/config/boxfit.xml @@ -5,8 +5,8 @@
@@ -14,7 +14,7 @@ _label="Boxes" low="1" high="1000" default="50"/> + _label="Grow by" low="1" high="10" default="1"/>
@@ -25,21 +25,25 @@ _label="Border" low="1" high="10" default="1"/>
- - - +
+ + + +
+ + <_description> Packs the screen with growing squares or circles, colored according to a horizontal or vertical gradient, or according to the colors of the diff --git a/hacks/config/braid.xml b/hacks/config/braid.xml index d3470509..f9cfa54d 100644 --- a/hacks/config/braid.xml +++ b/hacks/config/braid.xml @@ -4,25 +4,29 @@ - - - + - - +
+ + + +
+ + + <_description> Draws random color-cycling inter-braided concentric circles. diff --git a/hacks/config/bsod.xml b/hacks/config/bsod.xml index 24d23173..7a604a76 100644 --- a/hacks/config/bsod.xml +++ b/hacks/config/bsod.xml @@ -4,9 +4,12 @@ - +
+ + +
@@ -16,23 +19,25 @@ - - - + + + - + + + + - @@ -47,7 +52,7 @@ <_description> BSOD stands for "Blue Screen of Death". The finest in personal -computer emulation, this program simulates popular screen savers from a +computer emulation, BSOD simulates popular screen savers from a number of less robust operating systems. Written by Jamie Zawinski; 1998. diff --git a/hacks/config/bubble3d.xml b/hacks/config/bubble3d.xml index 68dab226..81511320 100644 --- a/hacks/config/bubble3d.xml +++ b/hacks/config/bubble3d.xml @@ -5,13 +5,13 @@ - - - + + + <_description> Draws a stream of rising, undulating 3D bubbles, rising toward the top of the screen, with transparency and specular reflections. diff --git a/hacks/config/bubbles.xml b/hacks/config/bubbles.xml index 61d87cf5..d11935d6 100644 --- a/hacks/config/bubbles.xml +++ b/hacks/config/bubbles.xml @@ -5,8 +5,8 @@ - + - + <_description> This simulates the kind of bubble formation that happens when water diff --git a/hacks/config/bumps.xml b/hacks/config/bumps.xml index 67713de2..dc0c0f62 100644 --- a/hacks/config/bumps.xml +++ b/hacks/config/bumps.xml @@ -9,7 +9,7 @@ @@ -22,6 +22,8 @@ + + <_description> A spotlight roams across an embossed version of your desktop or other picture. diff --git a/hacks/config/cage.xml b/hacks/config/cage.xml index 500de98b..b60d15fb 100644 --- a/hacks/config/cage.xml +++ b/hacks/config/cage.xml @@ -5,17 +5,19 @@ - + <_description> This draws Escher's "Impossible Cage", a 3d analog of a moebius strip, and rotates it in three dimensions. +http://en.wikipedia.org/wiki/Maurits_Cornelis_Escher + Written by Marcelo Vianna; 1998. diff --git a/hacks/config/carousel.xml b/hacks/config/carousel.xml index 113d4846..96c7a65f 100644 --- a/hacks/config/carousel.xml +++ b/hacks/config/carousel.xml @@ -5,37 +5,44 @@
+ + + + + + + + + + + + _label="Number of images" low="1" high="20" default="7"/> + -
- - - + + + - +
+
- - - - - <_description> Loads several random images, and displays them flying in a circular formation. The formation changes speed and direction randomly, and diff --git a/hacks/config/ccurve.xml b/hacks/config/ccurve.xml index 63507d74..203e6746 100644 --- a/hacks/config/ccurve.xml +++ b/hacks/config/ccurve.xml @@ -1,24 +1,28 @@ - + + _label="Change image every" _low-label="0 seconds" _high-label="30 seconds" + low="0" high="30" default="3"/> + + <_description> Generates self-similar linear fractals, including the classic "C Curve". +http://en.wikipedia.org/wiki/Levy_C_curve + Written by Rick Campbell; 1999. diff --git a/hacks/config/celtic.xml b/hacks/config/celtic.xml index 3b4a6b84..1f14c93c 100644 --- a/hacks/config/celtic.xml +++ b/hacks/config/celtic.xml @@ -5,19 +5,23 @@ - + + + <_description> Repeatedly draws random Celtic cross-stitch patterns. +http://en.wikipedia.org/wiki/Celtic_knot + Written by Max Froumentin; 2005. diff --git a/hacks/config/circuit.xml b/hacks/config/circuit.xml index 8e347b37..26130d36 100644 --- a/hacks/config/circuit.xml +++ b/hacks/config/circuit.xml @@ -5,27 +5,25 @@ - - - - - + + - + <_description> Animates a number of 3D electronic components. diff --git a/hacks/config/cloudlife.xml b/hacks/config/cloudlife.xml index 26588cd1..859d15f3 100644 --- a/hacks/config/cloudlife.xml +++ b/hacks/config/cloudlife.xml @@ -5,22 +5,24 @@ + + <_description> Generates cloud-like formations based on a variant of Conway's Life. The @@ -28,6 +30,8 @@ difference is that cells have a maximum age, after which they count as 3 for populating the next generation. This makes long-lived formations explode instead of just sitting there. +http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life + Written by Don Marti; 2003. diff --git a/hacks/config/compass.xml b/hacks/config/compass.xml index 5966dd8a..4e903f0a 100644 --- a/hacks/config/compass.xml +++ b/hacks/config/compass.xml @@ -5,11 +5,11 @@ - + <_description> This draws a compass, with all elements spinning about randomly, for diff --git a/hacks/config/coral.xml b/hacks/config/coral.xml index b332bdaf..e9182702 100644 --- a/hacks/config/coral.xml +++ b/hacks/config/coral.xml @@ -5,12 +5,12 @@ + + <_description> Simulates coral growth, albeit somewhat slowly. diff --git a/hacks/config/cosmos.xml b/hacks/config/cosmos.xml deleted file mode 100644 index f8ad4739..00000000 --- a/hacks/config/cosmos.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - <_description> -Draws fireworks and zooming, fading flares. -You can find it at <http://www.cosmosx.org/> - -Written by Tom Campbell. - - \ No newline at end of file diff --git a/hacks/config/crackberg.xml b/hacks/config/crackberg.xml index 73596bc3..04ffb10b 100644 --- a/hacks/config/crackberg.xml +++ b/hacks/config/crackberg.xml @@ -5,19 +5,20 @@ + _label="Frame rate" _low-label="Low" _high-label="High" + low="0" high="100000" default="20000" + convert="invert"/> -
- + @@ -26,16 +27,16 @@ - +
<_description> diff --git a/hacks/config/critical.xml b/hacks/config/critical.xml index 18fcf2da..55e092ee 100644 --- a/hacks/config/critical.xml +++ b/hacks/config/critical.xml @@ -4,14 +4,16 @@ + + - + <_description> Draws a system of self-organizing lines. It starts out as random diff --git a/hacks/config/crystal.xml b/hacks/config/crystal.xml index 782d48db..2f2d972f 100644 --- a/hacks/config/crystal.xml +++ b/hacks/config/crystal.xml @@ -4,36 +4,40 @@ - - + - + - + + - + + _label="Horizontal symmetries" low="-10" high="10" default="-3"/> - - + _label="Vertical symmetries" low="-10" high="10" default="-3"/> - +
+ + + +
- + <_description> -Moving polygons, similar to a kaleidescope (more like a kaleidescope -than the one called `kaleid,' actually). +Moving polygons, similar to a kaleidoscope. See also the +"Kaleidescope" and "GLeidescope" screen savers. + +http://en.wikipedia.org/wiki/Kaleidoscope Written by Jouk Jansen; 1998. diff --git a/hacks/config/cube21.xml b/hacks/config/cube21.xml index 78ae0d2b..74d7a1b1 100644 --- a/hacks/config/cube21.xml +++ b/hacks/config/cube21.xml @@ -1,60 +1,72 @@ - + - - - - - - - - - - - - - - - -
- - - -
-
- - + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + +
+ +
<_description> Animates a Rubik-like puzzle known as Cube 21 or Square-1. -The rotations are chosen randomly. +The rotations are chosen randomly. See also the "Rubik" and +"GLSnake" screen savers. + +http://en.wikipedia.org/wiki/Square_One_%28puzzle%29 Written by Vasek Potocek; 2005. diff --git a/hacks/config/cubenetic.xml b/hacks/config/cubenetic.xml index ffe465bc..3a9a3eb3 100644 --- a/hacks/config/cubenetic.xml +++ b/hacks/config/cubenetic.xml @@ -5,44 +5,48 @@ - - - +
+ + + +
- - - +
+ + + +
<_description> Draws a pulsating set of overlapping boxes with ever-chaning blobby diff --git a/hacks/config/cubestorm.xml b/hacks/config/cubestorm.xml index 67966444..ae503c1d 100644 --- a/hacks/config/cubestorm.xml +++ b/hacks/config/cubestorm.xml @@ -5,19 +5,20 @@ - +
@@ -26,7 +27,7 @@
- + <_description> Draws a series of rotating 3D boxes that intersect each other and diff --git a/hacks/config/cubicgrid.xml b/hacks/config/cubicgrid.xml index b3b2a30b..8467c056 100644 --- a/hacks/config/cubicgrid.xml +++ b/hacks/config/cubicgrid.xml @@ -4,20 +4,20 @@ - - + _label="Frame rate" _low-label="Low" _high-label="High" + low="0" high="100000" default="20000" convert="invert"/> - - + + + + <_description> Draws the view of an observer located inside a rotating 3D lattice of colored diff --git a/hacks/config/cwaves.xml b/hacks/config/cwaves.xml index 33ddf36d..215d9fe8 100644 --- a/hacks/config/cwaves.xml +++ b/hacks/config/cwaves.xml @@ -4,21 +4,21 @@ - + + <_description> This generates a languidly-scrolling vertical field of sinusoidal colors. diff --git a/hacks/config/cynosure.xml b/hacks/config/cynosure.xml index 2f018e29..ac1350e6 100644 --- a/hacks/config/cynosure.xml +++ b/hacks/config/cynosure.xml @@ -5,19 +5,21 @@ + _label="Number of colors" _low-label="Two" _high-label="Many" + low="2" high="255" default="128"/> + + <_description> Random dropshadowed rectangles pop onto the screen in lockstep. diff --git a/hacks/config/dangerball.xml b/hacks/config/dangerball.xml index db8da5fd..5375f831 100644 --- a/hacks/config/dangerball.xml +++ b/hacks/config/dangerball.xml @@ -5,16 +5,17 @@ - +
@@ -22,7 +23,7 @@
- + <_description> Draws a ball that periodically extrudes many random spikes. Ouch! diff --git a/hacks/config/decayscreen.xml b/hacks/config/decayscreen.xml index 557924fc..75cc7625 100644 --- a/hacks/config/decayscreen.xml +++ b/hacks/config/decayscreen.xml @@ -5,8 +5,8 @@ + + <_description> This takes an image and makes it melt. You've no doubt seen this effect before, but no screensaver would really be complete without it. diff --git a/hacks/config/deco.xml b/hacks/config/deco.xml index 8557cd2d..87fd0164 100644 --- a/hacks/config/deco.xml +++ b/hacks/config/deco.xml @@ -5,32 +5,38 @@ - - - - - -
- - - + + + + + + + + + + + + +
<_description> Subdivides and colors rectangles randomly. It looks kind of like Brady-Bunch-era rec-room wall paneling. +http://en.wikipedia.org/wiki/Piet_Mondrian#Paris_1919.E2.80.931938 + Written by Jamie Zawinski and Michael Bayne; 1997.
diff --git a/hacks/config/deluxe.xml b/hacks/config/deluxe.xml index 634e1216..de3b4955 100644 --- a/hacks/config/deluxe.xml +++ b/hacks/config/deluxe.xml @@ -5,26 +5,27 @@ - + - + <_description> Draws a pulsing sequence of transparent stars, circles, and lines. diff --git a/hacks/config/demon.xml b/hacks/config/demon.xml index ed08cc68..c99799cf 100644 --- a/hacks/config/demon.xml +++ b/hacks/config/demon.xml @@ -4,29 +4,34 @@ - + + + - - + _label="Cell size" low="-20" high="20" default="-7"/> + + <_description> A cellular automaton that starts with a random field, and organizes it into stripes and spirals. +http://en.wikipedia.org/wiki/Maxwell%27s_demon + Written by David Bagley; 1999.
diff --git a/hacks/config/discrete.xml b/hacks/config/discrete.xml index 98a5981b..9640a2c9 100644 --- a/hacks/config/discrete.xml +++ b/hacks/config/discrete.xml @@ -4,19 +4,21 @@ + + - - + + <_description> More "discrete map" systems, including new variants of Hopalong and Julia, and a few others. diff --git a/hacks/config/distort.xml b/hacks/config/distort.xml index c0af41d8..e499132a 100644 --- a/hacks/config/distort.xml +++ b/hacks/config/distort.xml @@ -5,7 +5,7 @@ @@ -17,27 +17,26 @@ - - - +
+ + + +
- - - - - - - - + + + + +
diff --git a/hacks/config/dnalogo.xml b/hacks/config/dnalogo.xml index a787017f..dd182a31 100644 --- a/hacks/config/dnalogo.xml +++ b/hacks/config/dnalogo.xml @@ -4,8 +4,13 @@ + + - + <_description> DNA Lounge diff --git a/hacks/config/drift.xml b/hacks/config/drift.xml index 14ab6c18..aacfe0d2 100644 --- a/hacks/config/drift.xml +++ b/hacks/config/drift.xml @@ -4,19 +4,21 @@ + + - - + + <_description> Drifting recursive fractal cosmic flames. diff --git a/hacks/config/electricsheep.xml b/hacks/config/electricsheep.xml deleted file mode 100644 index 26bd51da..00000000 --- a/hacks/config/electricsheep.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - -
- - -
- -
- - - - - -
- -
- - - -
- -
- -
- - - <_description> - -Displays mpeg video of an animated fractal flame. In the background, -it contributes render cycles to the next animation. Periodically it -uploades completed frames to the server, where they are compressed for -distribution to all clients. - -This program is recommended only if you have a high bandwidth, -always-on connection to the Internet. - -You can find it at <http://www.electricsheep.org/>. - -Written by By Scott Draves. - -
diff --git a/hacks/config/endgame.xml b/hacks/config/endgame.xml index d26abffe..abbea16b 100644 --- a/hacks/config/endgame.xml +++ b/hacks/config/endgame.xml @@ -5,16 +5,20 @@ - - + + <_description> Black slips out of three mating nets, but the fourth one holds him tight! -A brilliant composition! +A brilliant composition! + +See also the "Queens" screen saver. + +http://en.wikipedia.org/wiki/Chess_endgame Written by Blair Tennessy; 2002. diff --git a/hacks/config/engine.xml b/hacks/config/engine.xml index 2698dc89..ed16447e 100644 --- a/hacks/config/engine.xml +++ b/hacks/config/engine.xml @@ -5,12 +5,12 @@ - +
- + <_description> Draws a simple model of an engine that floats around the screen. +http://en.wikipedia.org/wiki/Internal_combustion_engine#Operation + Written by Ben Buxton and Ed Beroset; 2001. diff --git a/hacks/config/epicycle.xml b/hacks/config/epicycle.xml index cee38ff8..0d5aecb2 100644 --- a/hacks/config/epicycle.xml +++ b/hacks/config/epicycle.xml @@ -4,24 +4,26 @@ - - + + + _label="Linger" _low-label="1 second" _high-label="30 seconds" + low="1" high="30" default="2"/> +
+ _label="Line thickness" low="1" high="50" default="4"/> +
@@ -35,11 +37,15 @@ + + <_description> -This program draws the path traced out by a point on the edge of a +This draws the path traced out by a point on the edge of a circle. That circle rotates around a point on the rim of another circle, and so on, several times. These were the basis for the -pre-heliocentric model of planetary motion. +pre-heliocentric model of planetary motion. + +http://en.wikipedia.org/wiki/Deferent_and_epicycle Written by James Youngman; 1998. diff --git a/hacks/config/eruption.xml b/hacks/config/eruption.xml index 44d0eeca..86af1667 100644 --- a/hacks/config/eruption.xml +++ b/hacks/config/eruption.xml @@ -4,37 +4,45 @@ - - - - - - - - - - - - - +
+ + + + + + + + + + + + + + + + + + +
<_description> -Exploding fireworks. +Exploding fireworks. See also the "Fireworkx", "XFlame" and "Pyro" +screen savers. Written by W.P. van Paassen; 2003. diff --git a/hacks/config/euler2d.xml b/hacks/config/euler2d.xml index ee5cd681..f69b24a9 100644 --- a/hacks/config/euler2d.xml +++ b/hacks/config/euler2d.xml @@ -1,15 +1,20 @@ - + + + @@ -30,7 +30,7 @@ - + <_description> Draws various rotating extruded shapes that twist around, lengthen, diff --git a/hacks/config/fadeplot.xml b/hacks/config/fadeplot.xml index 77a619f3..368224fd 100644 --- a/hacks/config/fadeplot.xml +++ b/hacks/config/fadeplot.xml @@ -4,22 +4,25 @@ - - - - + + + + + + <_description> Draws what looks like a waving ribbon following a sinusoidal path. diff --git a/hacks/config/fiberlamp.xml b/hacks/config/fiberlamp.xml index de40e44b..9357730f 100644 --- a/hacks/config/fiberlamp.xml +++ b/hacks/config/fiberlamp.xml @@ -4,14 +4,21 @@ + + + + <_description> Draws a groovy rotating fiber optic lamp. diff --git a/hacks/config/fireflies.xml b/hacks/config/fireflies.xml deleted file mode 100644 index ca92a9db..00000000 --- a/hacks/config/fireflies.xml +++ /dev/null @@ -1,329 +0,0 @@ - - - - - -
- -
- - -
-
- - -
- - -
- - -
-
- - -
- - - -
- -
- -
- - - - - -
-
-
- - - - - - - - - - - - - - - - - - -
- - <_description> -A bunch of fireflies chase a few baits around the screen, leaving colorful -tails which get blown around by the wind. -This program is not included with the -XScreenSaver package, but if you don't have it already, you can find it -at <http://somewhere.fscked.org/fireflies/>. - -Written by Matt Perry. - -
diff --git a/hacks/config/fireworkx.xml b/hacks/config/fireworkx.xml index 9c7c2db0..2a8f675d 100644 --- a/hacks/config/fireworkx.xml +++ b/hacks/config/fireworkx.xml @@ -5,7 +5,7 @@ @@ -13,12 +13,15 @@ _label="Activity" _low-label="Dense" _high-label="Sparse" low="250" high="5000" default="2000"/> - - - + + + + + <_description> -Exploding fireworks. +Exploding fireworks. See also the "Eruption", "XFlame" and "Pyro" +screen savers. Written by Rony B Chandran; 2004. diff --git a/hacks/config/flag.xml b/hacks/config/flag.xml index cd84a4f9..cbce18b9 100644 --- a/hacks/config/flag.xml +++ b/hacks/config/flag.xml @@ -4,13 +4,11 @@ - - - + + + <_description> This draws a waving colored flag, that undulates its way around the -screen. The trick is the flag can contain arbitrary text and images. -By default, it displays either the current system name and OS -type, or a picture of "Bob". +screen. The flag can contain arbitrary text and images. By default, +it displays either the current system name and OS type, or a picture +of "Bob". Written by Charles Vidal and Jamie Zawinski; 1997. diff --git a/hacks/config/flame.xml b/hacks/config/flame.xml index 746966f5..8fce71c2 100644 --- a/hacks/config/flame.xml +++ b/hacks/config/flame.xml @@ -5,16 +5,16 @@ + + <_description> Iterative fractals. diff --git a/hacks/config/flipflop.xml b/hacks/config/flipflop.xml index b6110873..d8fffabe 100644 --- a/hacks/config/flipflop.xml +++ b/hacks/config/flipflop.xml @@ -4,26 +4,41 @@ - - - - - - - - - - +
+ + + + + + + + + + + + +
+ +
+ + + + + + + + +
<_description> Draws a grid of 3D colored tiles that change positions with each other. diff --git a/hacks/config/flipscreen3d.xml b/hacks/config/flipscreen3d.xml index 478a238e..1009a74d 100644 --- a/hacks/config/flipscreen3d.xml +++ b/hacks/config/flipscreen3d.xml @@ -1,17 +1,17 @@ - + - + diff --git a/hacks/config/fliptext.xml b/hacks/config/fliptext.xml index 60402843..ecaea69f 100644 --- a/hacks/config/fliptext.xml +++ b/hacks/config/fliptext.xml @@ -4,36 +4,39 @@ - - + + +
+ - - - - - + - + - + - + + + + + +
<_description> Draws successive pages of text. The lines flip in and out in diff --git a/hacks/config/flow.xml b/hacks/config/flow.xml index 24e12775..76d1bf4c 100644 --- a/hacks/config/flow.xml +++ b/hacks/config/flow.xml @@ -4,35 +4,52 @@ - - - - - - - - - - - - - - - - +
+ + + + + + + + + + + + +
+ +
+ + + + + + + + + + +
<_description> -Strange attractors formed of flows in a 3D differential equation phase space. +Strange attractors formed of flows in a 3D differential equation phase +space. Features the popular attractors described by Lorentz, +Roessler, Birkhoff and Duffing, and can discover entirely new +attractors by itself. + +http://en.wikipedia.org/wiki/Attractor#Strange_attractor Written by Tim Auckland; 1998. diff --git a/hacks/config/fluidballs.xml b/hacks/config/fluidballs.xml index d9d0abc4..10b342f2 100644 --- a/hacks/config/fluidballs.xml +++ b/hacks/config/fluidballs.xml @@ -4,34 +4,39 @@ - - - - - - - - - - - - - - - +
+ + + + + + + + + + + + + + +
+ + + + <_description> Models the physics of bouncing balls, or of particles in a gas or diff --git a/hacks/config/flurry.xml b/hacks/config/flurry.xml index 85b0cf8f..5d99baf5 100644 --- a/hacks/config/flurry.xml +++ b/hacks/config/flurry.xml @@ -4,7 +4,7 @@ - + -
- - - - +
+ + + + + + + + + + + + + +
diff --git a/hacks/config/forest.xml b/hacks/config/forest.xml index 5432f75e..4bce9055 100644 --- a/hacks/config/forest.xml +++ b/hacks/config/forest.xml @@ -5,14 +5,16 @@ + + <_description> Fractal trees. diff --git a/hacks/config/fuzzyflakes.xml b/hacks/config/fuzzyflakes.xml index 97fc8f78..179c46a3 100644 --- a/hacks/config/fuzzyflakes.xml +++ b/hacks/config/fuzzyflakes.xml @@ -4,31 +4,54 @@ - - - - - - - - - - - +
+ + + + + + + +
+ + +
+ + + +
+ + + + + + + +
+ <_description> Falling colored snowflake/flower shapes. diff --git a/hacks/config/galaxy.xml b/hacks/config/galaxy.xml index 45478e39..bc116cd5 100644 --- a/hacks/config/galaxy.xml +++ b/hacks/config/galaxy.xml @@ -4,6 +4,11 @@ + + @@ -11,16 +16,13 @@ _label="Duration" _low-label="Short" _high-label="Long" low="10" high="1000" default="250"/> - - - + + + <_description> This draws spinning galaxies, which then collide and scatter their diff --git a/hacks/config/gears.xml b/hacks/config/gears.xml index f9cc01ff..55aac9f0 100644 --- a/hacks/config/gears.xml +++ b/hacks/config/gears.xml @@ -5,28 +5,31 @@ - +
+
- - <_description> This draws sets of turning, interlocking gears, rotating in three -dimensions. +dimensions. See also the "Pinion" and "MoebiusGears" screen savers. + +http://en.wikipedia.org/wiki/Involute_gear +http://en.wikipedia.org/wiki/Epicyclic_gearing Written by Jamie Zawinski; 2007. diff --git a/hacks/config/gflux.xml b/hacks/config/gflux.xml index 35476cce..a38c7296 100644 --- a/hacks/config/gflux.xml +++ b/hacks/config/gflux.xml @@ -4,32 +4,38 @@ +
+ + + + + + + + + + +
+ - - - - - - - - - + diff --git a/hacks/config/glblur.xml b/hacks/config/glblur.xml index 7a885098..c655a16f 100644 --- a/hacks/config/glblur.xml +++ b/hacks/config/glblur.xml @@ -5,18 +5,18 @@ - + <_description> -This program draws a box and a few line segments, and generates a +This draws a box and a few line segments, and generates a radial blur outward from it. This creates flowing field effects. This is done by rendering the scene into a small texture, then repeatedly rendering increasingly-enlarged and increasingly-transparent versions of that texture onto the frame buffer. As such, it's quite -graphics intensive: don't bother trying to run this if you don't have -hardware-accelerated OpenGL texture support. It will hurt your -machine bad. +GPU-intensive: if you don't have a very good graphics card, it +will hurt your machine bad. Written by Jamie Zawinski; 2002. diff --git a/hacks/config/glcells.xml b/hacks/config/glcells.xml index 2c2c75e6..942c0aea 100644 --- a/hacks/config/glcells.xml +++ b/hacks/config/glcells.xml @@ -4,76 +4,54 @@ - - -
- -
-
- + + + + + + + + + + + + + + +
+ +
+ + +
-
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- - - -
- - - - - -
- - - <_description> Cells growing, dividing and dying on your screen. diff --git a/hacks/config/gleidescope.xml b/hacks/config/gleidescope.xml index cb7b07b4..1e0f8bc0 100644 --- a/hacks/config/gleidescope.xml +++ b/hacks/config/gleidescope.xml @@ -4,28 +4,35 @@ + + + + + +
+
- - - - - <_description> -A kaleidescope that operates on your desktop image, or on +A kaleidoscope that operates on your desktop image, or on image files loaded from disk. +http://en.wikipedia.org/wiki/Kaleidoscope + Written by Andrew Dean; 2003.
diff --git a/hacks/config/glforestfire.xml b/hacks/config/glforestfire.xml index 3d38d4f7..844db120 100644 --- a/hacks/config/glforestfire.xml +++ b/hacks/config/glforestfire.xml @@ -5,24 +5,30 @@ - - - - - - +
+ + + + + + + + + + +
<_description> Draws an animation of sprinkling fire-like 3D triangles in a landscape diff --git a/hacks/config/glhanoi.xml b/hacks/config/glhanoi.xml index d9b0f34b..c4405b7d 100644 --- a/hacks/config/glhanoi.xml +++ b/hacks/config/glhanoi.xml @@ -4,26 +4,29 @@ - + + + - + - - <_description> Solves the Towers of Hanoi puzzle. Move N disks from one pole to another, one disk at a time, with no disk ever resting on a disk smaller than itself. +http://en.wikipedia.org/wiki/Tower_of_Hanoi + Written by Dave Atkinson; 2005. diff --git a/hacks/config/glknots.xml b/hacks/config/glknots.xml index a8502fc5..766b2e03 100644 --- a/hacks/config/glknots.xml +++ b/hacks/config/glknots.xml @@ -4,46 +4,56 @@ - - - - - - - - - -
- - -
- -
- + + + + + + + + + + + + + + +
+ + +
+ +
+ +
+ +
<_description> Generates some twisting 3d knot patterns. Spins 'em around. +http://en.wikipedia.org/wiki/Knot_theory + Written by Jamie Zawinski; 2003. diff --git a/hacks/config/glmatrix.xml b/hacks/config/glmatrix.xml index f882e2fb..8ec8ac5c 100644 --- a/hacks/config/glmatrix.xml +++ b/hacks/config/glmatrix.xml @@ -4,24 +4,24 @@ + + - -
@@ -33,7 +33,7 @@
- +
<_description> diff --git a/hacks/config/glplanet.xml b/hacks/config/glplanet.xml index b58cd21d..2ad5eabf 100644 --- a/hacks/config/glplanet.xml +++ b/hacks/config/glplanet.xml @@ -4,20 +4,15 @@ + + - - - - - +
@@ -26,8 +21,11 @@
- - +
+ + + +
<_description> Draws a planet bouncing around in space. diff --git a/hacks/config/glschool.xml b/hacks/config/glschool.xml index 47dbecbb..0bbade81 100644 --- a/hacks/config/glschool.xml +++ b/hacks/config/glschool.xml @@ -2,33 +2,40 @@ - - - - - - - - - - - -
- - - - -
- - - <_description> - + + +
+ + + + + + + + + + + + +
+ +
+ + + + + +
+ + <_description> Uses Craig Reynolds' Boids algorithm to simulate a school of fish. -Looks best with more fish, so raise the number of fish until the -frame rate declines to 25-30 fps. + +http://en.wikipedia.org/wiki/Boids Written by David C. Lambert; 2006. - +
diff --git a/hacks/config/glslideshow.xml b/hacks/config/glslideshow.xml index 92d8cdc9..bcd7acb3 100644 --- a/hacks/config/glslideshow.xml +++ b/hacks/config/glslideshow.xml @@ -4,38 +4,48 @@ - - - - - - - - - - - - - - - - - +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
<_description> Loads a random sequence of images and smoothly scans and zooms around diff --git a/hacks/config/glsnake.xml b/hacks/config/glsnake.xml index ebca3a7c..33ab3dde 100644 --- a/hacks/config/glsnake.xml +++ b/hacks/config/glsnake.xml @@ -1,37 +1,52 @@ - + - +
+ + - + - + + + - + + - + + +
- - - +
+ + + +
<_description> -Draws a simulation of the Rubik's Snake puzzle. +Draws a simulation of the Rubik's Snake puzzle. See also the "Rubik" +and "Cube21" screen savers. + +http://en.wikipedia.org/wiki/Rubik%27s_Snake Written by Jamie Wilkinson, Andrew Bennetts, and Peter Aylett; 2002. diff --git a/hacks/config/gltext.xml b/hacks/config/gltext.xml index 30929faa..be1e6d7b 100644 --- a/hacks/config/gltext.xml +++ b/hacks/config/gltext.xml @@ -5,14 +5,26 @@ + + +
+ +
- - - - - - + <_description> Displays a few lines of text spinning around in a solid 3D font. +The text can use strftime() escape codes to display the current +date and time. Written by Jamie Zawinski; 2001. diff --git a/hacks/config/goban.xml b/hacks/config/goban.xml deleted file mode 100644 index bedca54a..00000000 --- a/hacks/config/goban.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - <_description> - -Replays historical games of go (aka wei-chi and baduk) on the screen. -You can find it at <http://www.draves.org/goban/>. - -Written by Scott Draves. - - diff --git a/hacks/config/goop.xml b/hacks/config/goop.xml index ab87fa93..c3a71fbd 100644 --- a/hacks/config/goop.xml +++ b/hacks/config/goop.xml @@ -4,44 +4,56 @@ - - - - - - - - - - - - - +
+ + + + + + + + + + + + + + + + +
+ +
+ + + +
<_description> This draws set of animating, transparent, amoeba-like blobs. The blobs change shape as they wander around the screen, and they are translucent, so you can see the lower blobs through the higher ones, and when one passes over another, their colors merge. I got the idea for this from -a cool mouse pad I have, which achieves the same kind of effect in real +a mouse pad I had once, which achieved the same kind of effect in real life by having several layers of plastic with colored oil between them. Written by Jamie Zawinski; 1997. diff --git a/hacks/config/grav.xml b/hacks/config/grav.xml index a719a951..915e00a2 100644 --- a/hacks/config/grav.xml +++ b/hacks/config/grav.xml @@ -4,24 +4,28 @@ - - - - + +
+ + + +
+ <_description> -This program draws a simple orbital simulation. If you turn on -trails, it looks kind of like a cloud-chamber photograph. +This draws a simple orbital simulation. With trails enabled, +it looks kind of like a cloud-chamber photograph. Written by Greg Bowering; 1997. diff --git a/hacks/config/greynetic.xml b/hacks/config/greynetic.xml index d3cde589..3604dba7 100644 --- a/hacks/config/greynetic.xml +++ b/hacks/config/greynetic.xml @@ -5,10 +5,14 @@ + + + + <_description> Draws random colored, stippled and transparent rectangles. diff --git a/hacks/config/halftone.xml b/hacks/config/halftone.xml index 1729d84c..4eaef74b 100644 --- a/hacks/config/halftone.xml +++ b/hacks/config/halftone.xml @@ -4,43 +4,52 @@ - - - - - - - - - - - - - - - +
+ + + + + + + + + + + + + + + + + + +
+ + <_description> Draws the gravity force in each point on the screen seen through a halftone dot pattern. The gravity force is calculated from a set of moving mass points. View it from a distance for best effect. +http://en.wikipedia.org/wiki/Halftone + Written by Peter Jaric; 2002.
diff --git a/hacks/config/halo.xml b/hacks/config/halo.xml index 115cda83..ba05e4f5 100644 --- a/hacks/config/halo.xml +++ b/hacks/config/halo.xml @@ -4,29 +4,35 @@ - - - + + + - +
+ + +
<_description> Draws trippy psychedelic circular patterns that hurt to look at. +http://en.wikipedia.org/wiki/Moire_pattern + Written by Jamie Zawinski; 1993.
diff --git a/hacks/config/helix.xml b/hacks/config/helix.xml index ba4cd0e7..b2eb11d2 100644 --- a/hacks/config/helix.xml +++ b/hacks/config/helix.xml @@ -4,10 +4,17 @@ + + + + <_description> Spirally string-art-ish patterns. diff --git a/hacks/config/hopalong.xml b/hacks/config/hopalong.xml index 3c176798..4c91dbba 100644 --- a/hacks/config/hopalong.xml +++ b/hacks/config/hopalong.xml @@ -5,8 +5,8 @@
@@ -39,11 +39,16 @@ + + + +
<_description> -This draws lacy fractal patterns, based on iteration in the imaginary -plane, from a 1986 Scientific American article. +This draws lacy fractal patterns based on iteration in the imaginary +plane, from a 1986 Scientific American article. See also the +"Discrete" screen saver. Written by Patrick Naughton; 1992. diff --git a/hacks/config/hyperball.xml b/hacks/config/hyperball.xml index 61e31f10..b8ecd2c7 100644 --- a/hacks/config/hyperball.xml +++ b/hacks/config/hyperball.xml @@ -1,12 +1,12 @@ - + + + <_description> This displays 2D projections of the sequence of 3D objects which are the projections of the 4D analog to the cube: as a square is composed @@ -58,6 +60,9 @@ each face. Don't think about it too long, or your brain will melt. See also "polytopes" for a more general version of this using OpenGL. +http://en.wikipedia.org/wiki/Hypercube +http://en.wikipedia.org/wiki/Regular_polytope + Written by Joe Keane, Fritz Mueller, and Jamie Zawinski; 1992. diff --git a/hacks/config/hypertorus.xml b/hacks/config/hypertorus.xml index 6552857b..f32b2404 100644 --- a/hacks/config/hypertorus.xml +++ b/hacks/config/hypertorus.xml @@ -4,45 +4,53 @@ +
+ + +
+
@@ -52,17 +60,17 @@ @@ -71,17 +79,17 @@ @@ -89,20 +97,17 @@
- - - - <_description> -This program shows a rotating Clifford Torus: a torus lying on the +This shows a rotating Clifford Torus: a torus lying on the "surface" of a 4D hypersphere. Inspired by Thomas Banchoff's book "Beyond the Third Dimension: Geometry, Computer Graphics, and Higher Dimensions", Scientific American Library, 1990. +http://en.wikipedia.org/wiki/N-sphere +http://en.wikipedia.org/wiki/Clifford_torus +http://en.wikipedia.org/wiki/Regular_polytope + Written by Carsten Steger; 2003. diff --git a/hacks/config/hypnowheel.xml b/hacks/config/hypnowheel.xml index af4a7087..c5627c83 100644 --- a/hacks/config/hypnowheel.xml +++ b/hacks/config/hypnowheel.xml @@ -4,38 +4,47 @@ - - - - - - - - - -
- - + + + + + +
+ + +
+ + + +
+ + + + + + + +
- - <_description> Draws a series of overlapping, translucent spiral patterns. The tightness of their spirals fluctuates in and out. +http://en.wikipedia.org/wiki/Moire_pattern + Written by Jamie Zawinski; 2008. diff --git a/hacks/config/ifs.xml b/hacks/config/ifs.xml index 78972e1c..fa4a9f7c 100644 --- a/hacks/config/ifs.xml +++ b/hacks/config/ifs.xml @@ -5,27 +5,29 @@ - + - - - - - - +
+ + + + +
+ <_description> This one draws spinning, colliding iterated-function-system images. @@ -33,6 +35,8 @@ This one draws spinning, colliding iterated-function-system images. Note that the "Detail" parameter is exponential. Number of points drawn is functions^detail. +http://en.wikipedia.org/wiki/Iterated_function_system + Written by Chris Le Sueur and Robby Griffin; 1997. diff --git a/hacks/config/imsmap.xml b/hacks/config/imsmap.xml index 85142e12..51adcfe7 100644 --- a/hacks/config/imsmap.xml +++ b/hacks/config/imsmap.xml @@ -1,32 +1,35 @@ - + - - - - + _label="Frame rate" _low-label="Low" _high-label="High" + low="0" high="100000" default="20000" + convert="invert"/> + low="1" high="60" default="5"/> + + + + + + <_description> This generates random cloud-like patterns. The idea is to take four points on the edge of the image, and assign each a random "elevation". diff --git a/hacks/config/interaggregate.xml b/hacks/config/interaggregate.xml index 40a44aa2..fd1a39da 100644 --- a/hacks/config/interaggregate.xml +++ b/hacks/config/interaggregate.xml @@ -4,12 +4,15 @@ - - + _label="Frame rate" _low-label="Low" _high-label="High" + low="0" high="100000" default="18000" convert="invert"/> + + + + <_description> A surface is filled with a hundred medium to small sized circles. diff --git a/hacks/config/interference.xml b/hacks/config/interference.xml index fe594ec7..eed84c44 100644 --- a/hacks/config/interference.xml +++ b/hacks/config/interference.xml @@ -4,40 +4,46 @@ - - - - - - - - - - - - - - - - - - - +
+ + + + + + + + + + + + + + + + + + + +
+ + <_description> Color field based on computing decaying sinusoidal waves. diff --git a/hacks/config/intermomentary.xml b/hacks/config/intermomentary.xml index 1142bcdc..c58e3120 100644 --- a/hacks/config/intermomentary.xml +++ b/hacks/config/intermomentary.xml @@ -4,13 +4,15 @@ + + - + <_description> A surface is filled with a hundred medium to small sized circles. diff --git a/hacks/config/jigglypuff.xml b/hacks/config/jigglypuff.xml index d88b93ee..3597c0f1 100644 --- a/hacks/config/jigglypuff.xml +++ b/hacks/config/jigglypuff.xml @@ -8,42 +8,40 @@
- - + + low="50" high="1000" default="500"/> - + - + low="0" high="1000" default="800"/> + + + - - + _high-label="Collapse" low="0" high="1000" default="100"/> -
@@ -61,7 +59,7 @@ - + @@ -71,11 +69,10 @@ This does bad things with quasi-spherical objects. You have a tetrahedron with tesselated faces. The vertices on these faces have forces on them: one proportional to the distance from the surface of a sphere; and one proportional to the distance from the -neighbors. They also have inertia. - -The resulting effect can range from a shape that does nothing, to a -frenetic polygon storm. Somewhere in between there it usually -manifests as a blob that jiggles in a kind of disturbing manner. +neighbors. They also have inertia. The resulting effect can range +from a shape that does nothing, to a frenetic polygon storm. +Somewhere in between there it usually manifests as a blob that jiggles +in a kind of disturbing manner. Written by Keith Macleod; 2003. diff --git a/hacks/config/jigsaw.xml b/hacks/config/jigsaw.xml index 38ea921e..e2661d18 100644 --- a/hacks/config/jigsaw.xml +++ b/hacks/config/jigsaw.xml @@ -5,17 +5,19 @@ + + <_description> This grabs a screen image, carves it up into a jigsaw puzzle, shuffles it, and then solves the puzzle. This works especially well diff --git a/hacks/config/juggle.xml b/hacks/config/juggle.xml index 6be4319d..f5f9a602 100644 --- a/hacks/config/juggle.xml +++ b/hacks/config/juggle.xml @@ -4,38 +4,54 @@ - - - +
+ + + + + + + - + + +
- - - + + + + +
- - + + + + <_description> Draws a juggling stick-man. See also "Juggler3D". +http://en.wikipedia.org/wiki/Siteswap + Written by Tim Auckland; 2002.
diff --git a/hacks/config/juggler3d.xml b/hacks/config/juggler3d.xml index 39ec8b36..bb7cf26f 100644 --- a/hacks/config/juggler3d.xml +++ b/hacks/config/juggler3d.xml @@ -3,33 +3,52 @@ - - - - - - - - - - - - - - - - - - <_description> +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + +
+ + <_description> 3D simulation of a juggler performing with balls, clubs and rings. +http://en.wikipedia.org/wiki/Siteswap + Written by Brian Apps; 2005. - +
diff --git a/hacks/config/julia.xml b/hacks/config/julia.xml index c7c0d6ef..7213412e 100644 --- a/hacks/config/julia.xml +++ b/hacks/config/julia.xml @@ -4,7 +4,10 @@ - + - - + + <_description> Animates the Julia set (a close relative of the Mandelbrot set). The small moving dot indicates the control point from which the rest of -the image was generated. +the image was generated. See also the "Discrete" screen saver. + +http://en.wikipedia.org/wiki/Julia_set Written by Sean McCullough; 1997. diff --git a/hacks/config/kaleidescope.xml b/hacks/config/kaleidescope.xml index 08ef2397..a819370a 100644 --- a/hacks/config/kaleidescope.xml +++ b/hacks/config/kaleidescope.xml @@ -5,8 +5,8 @@ + + <_description> -A simple kaleidoscope. See also "gleidescope". +A simple kaleidoscope. See also "GLeidescope". + +http://en.wikipedia.org/wiki/Kaleidoscope Written by Ron Tapia; 1997. diff --git a/hacks/config/klein.xml b/hacks/config/klein.xml index b4a2b3f2..0cd83fa7 100644 --- a/hacks/config/klein.xml +++ b/hacks/config/klein.xml @@ -5,8 +5,8 @@ - - + + - + <_description> This draws a visualization of a Klein bottle or some other interesting parametric surfaces. +http://en.wikipedia.org/wiki/Klein_bottle + Written by Andrey Mirtchovski; 2003.
diff --git a/hacks/config/kumppa.xml b/hacks/config/kumppa.xml index 1c67ebc5..192b4266 100644 --- a/hacks/config/kumppa.xml +++ b/hacks/config/kumppa.xml @@ -5,8 +5,8 @@ - + + + <_description> Spiraling, spinning, and very, very fast splashes of color rush toward the screen. diff --git a/hacks/config/lament.xml b/hacks/config/lament.xml index 2befffab..32a0e676 100644 --- a/hacks/config/lament.xml +++ b/hacks/config/lament.xml @@ -5,13 +5,13 @@ - + <_description> Animates a simulation of Lemarchand's Box, the Lament Configuration, @@ -19,6 +19,8 @@ repeatedly solving itself. Warning: occasionally opens doors. +http://en.wikipedia.org/wiki/Lemarchand%27s_box + Written by Jamie Zawinski; 1998. diff --git a/hacks/config/laser.xml b/hacks/config/laser.xml index f2fb066e..37e33d3a 100644 --- a/hacks/config/laser.xml +++ b/hacks/config/laser.xml @@ -4,6 +4,11 @@ + + @@ -11,18 +16,15 @@ _label="Duration" _low-label="Short" _high-label="Long" low="0" high="2000" default="200"/> - - + + <_description> Moving radiating lines, that look vaguely like scanning laser beams. -(Frankie say: relax.) +(Frankie say relax.) Written by Pascal Pensa; 1997. diff --git a/hacks/config/lavalite.xml b/hacks/config/lavalite.xml index b2ee458a..7787698a 100644 --- a/hacks/config/lavalite.xml +++ b/hacks/config/lavalite.xml @@ -1,25 +1,47 @@ - + - +
+ + - + + + + - + + +
- +
+ + +
+ + + +
+ +
+ + +
+ +
+ +
<_description> -Draws a 3D Simulation a Lava Lite(r): odd-shaped blobs of a mysterious +Draws a 3D Simulation a Lava Lite(r). Odd-shaped blobs of a mysterious substance are heated, slowly rise to the top of the bottle, and then -drop back down as they cool. This program requires a fairly fast +drop back down as they cool. This simulation requires a fairly fast machine (both CPU and 3D performance.) "LAVA LITE(r) and the configuration of the LAVA(r) brand motion lamp are @@ -63,6 +77,9 @@ of the globe and base of the motion lamp are registered trademarks of Haggerty Enterprises, Inc. in the U.S.A. and in other countries around the world." +http://en.wikipedia.org/wiki/Lava_lamp +http://en.wikipedia.org/wiki/Metaballs + Written by Jamie Zawinski; 2002.
diff --git a/hacks/config/lcdscrub.xml b/hacks/config/lcdscrub.xml index ce8f203e..09206b6c 100644 --- a/hacks/config/lcdscrub.xml +++ b/hacks/config/lcdscrub.xml @@ -5,16 +5,30 @@
- - - + + + + + + + + + + + + + + + + +
<_description> @@ -27,10 +41,8 @@ However, leaving the screen on and displaying high contrast images can often repair the damage. That's what this screen saver does. See also: - - http://docs.info.apple.com/article.html?artnum=88343 - - http://toastycode.com/blog/2008/02/05/lcd-scrub/ +http://docs.info.apple.com/article.html?artnum=88343 +http://toastycode.com/blog/2008/02/05/lcd-scrub/ Inspired by the like-named program by Daniel Sandler. diff --git a/hacks/config/lightning.xml b/hacks/config/lightning.xml index 0abf9a2a..3c932322 100644 --- a/hacks/config/lightning.xml +++ b/hacks/config/lightning.xml @@ -5,14 +5,16 @@ + + <_description> Crackling fractal lightning bolts. diff --git a/hacks/config/lisa.xml b/hacks/config/lisa.xml index 453be8c5..e4ac8d0d 100644 --- a/hacks/config/lisa.xml +++ b/hacks/config/lisa.xml @@ -4,29 +4,33 @@ - - - + - - - + + + + + <_description> -Lisajous loops. +Lissajous loops. + +http://en.wikipedia.org/wiki/Lissajous_curve Written by Caleb Cullen; 1997. diff --git a/hacks/config/lissie.xml b/hacks/config/lissie.xml index fea213e0..fe5b0eb2 100644 --- a/hacks/config/lissie.xml +++ b/hacks/config/lissie.xml @@ -4,27 +4,32 @@ - + - - + + + + <_description> -This one draws the progress of circular shapes along a path. +Lissajous loops. This one draws the progress of circular shapes along a path. + +http://en.wikipedia.org/wiki/Lissajous_curve Written by Alexander Jolk; 1997. diff --git a/hacks/config/lmorph.xml b/hacks/config/lmorph.xml index 3ee1ddb9..f1be0704 100644 --- a/hacks/config/lmorph.xml +++ b/hacks/config/lmorph.xml @@ -5,16 +5,16 @@ - + + <_description> This generates random spline-ish line drawings and morphs between them. diff --git a/hacks/config/lockward.xml b/hacks/config/lockward.xml index a5e79c84..efa5e1fe 100644 --- a/hacks/config/lockward.xml +++ b/hacks/config/lockward.xml @@ -4,75 +4,60 @@ - - - - - - - - - - - - - + + +
+ + + + + + + +
+ + +
+ +
+ + + + + + + + +
<_description> A translucent spinning, blinking thing. Sort of a cross between the wards in an old combination lock and those old backlit information displays that animated and changed color via polarized light. -Written by Leo L. Schwab; August, 2007. +Written by Leo L. Schwab; 2007.
diff --git a/hacks/config/loop.xml b/hacks/config/loop.xml index 1776736d..028d1f7c 100644 --- a/hacks/config/loop.xml +++ b/hacks/config/loop.xml @@ -4,25 +4,29 @@ + + - - + + <_description> Generates loop-shaped colonies that spawn, age, and eventually die. +http://en.wikipedia.org/wiki/Langton%27s_loops + Written by David Bagley; 1999. diff --git a/hacks/config/m6502.xml b/hacks/config/m6502.xml index 26db9f96..c54d2f8d 100644 --- a/hacks/config/m6502.xml +++ b/hacks/config/m6502.xml @@ -1,18 +1,20 @@ - + + low="5" high="120" default="20" /> - + + + <_description> -The m6502 screensaver emulates a 6502 microprocessor. The family +This emulates a 6502 microprocessor. The family of 6502 chips were used throughout the 70's and 80's in machines such as the Atari 2600, Commodore PET, VIC20 and C64, Apple ][, and the NES. Some example programs are included, and it can also diff --git a/hacks/config/maze.xml b/hacks/config/maze.xml index c72ff7fd..fbbb65c4 100644 --- a/hacks/config/maze.xml +++ b/hacks/config/maze.xml @@ -5,36 +5,36 @@ + _label="Grid size" low="0" high="100" default="0"/> @@ -45,6 +45,8 @@ + + <_description> This generates random mazes (with various different algorithms), and then solves them. Backtracking and look-ahead paths are displayed in diff --git a/hacks/config/memscroller.xml b/hacks/config/memscroller.xml index c41b9974..bf56694c 100644 --- a/hacks/config/memscroller.xml +++ b/hacks/config/memscroller.xml @@ -5,20 +5,22 @@ + + <_description> This draws a dump of its own process memory scrolling across the screen in three windows at three different rates. diff --git a/hacks/config/menger.xml b/hacks/config/menger.xml index 66b7ee70..9eea5c83 100644 --- a/hacks/config/menger.xml +++ b/hacks/config/menger.xml @@ -5,8 +5,8 @@ + _label="Max depth" low="1" high="6" default="3"/> - + <_description> This draws the three-dimensional variant of the recursive Menger Gasket, a cube-based fractal object analagous to the Sierpinski Tetrahedron. +http://en.wikipedia.org/wiki/Menger_sponge +http://en.wikipedia.org/wiki/Sierpinski_carpet + Written by Jamie Zawinski; 2001. diff --git a/hacks/config/metaballs.xml b/hacks/config/metaballs.xml index df6a6020..899272af 100644 --- a/hacks/config/metaballs.xml +++ b/hacks/config/metaballs.xml @@ -6,34 +6,46 @@ - +
+ + - + - + - + + - + - + + + + + +
+ + <_description> Draws two dimensional metaballs: overlapping and merging balls with fuzzy edges. +http://en.wikipedia.org/wiki/Metaballs + Written by W.P. van Paassen; 2003.
diff --git a/hacks/config/mirrorblob.xml b/hacks/config/mirrorblob.xml index 6ce60dda..7b657f86 100644 --- a/hacks/config/mirrorblob.xml +++ b/hacks/config/mirrorblob.xml @@ -7,8 +7,8 @@
- - - - - + + + _label="Resolution" low="4" high="50" default="30"/> + _label="Transparency" low="0.1" high="1.0" default="1.0"/>
- - - + + + - - + + + + + + +
<_description> Draws a wobbly blob that distorts the image behind it. -Requires OpenGL hardware acceleration for nice animation. Written by Jon Dowdall; 2003. diff --git a/hacks/config/mismunch.xml b/hacks/config/mismunch.xml index 7d5a19c0..7963932c 100644 --- a/hacks/config/mismunch.xml +++ b/hacks/config/mismunch.xml @@ -5,8 +5,8 @@ + + <_description> Munching errors! This is a creatively broken misimplementation of the -classic munching squares graphics hack. +classic munching squares graphics hack. See the "Munch" screen saver +for the original. + +http://en.wikipedia.org/wiki/HAKMEM +http://en.wikipedia.org/wiki/Munching_square Written by Steven Hazel; 2004. diff --git a/hacks/config/moebius.xml b/hacks/config/moebius.xml index dbb1be7a..5ae906c7 100644 --- a/hacks/config/moebius.xml +++ b/hacks/config/moebius.xml @@ -5,18 +5,21 @@ - - - + + + <_description> This animates a 3D rendition M.C. Escher's "Moebius Strip II", an image of ants walking along the surface of a moebius strip. +http://en.wikipedia.org/wiki/Moebius_strip +http://en.wikipedia.org/wiki/Maurits_Cornelis_Escher + Written by Marcelo F. Vianna; 1997. diff --git a/hacks/config/moebiusgears.xml b/hacks/config/moebiusgears.xml index 35008a94..cfbaf768 100644 --- a/hacks/config/moebiusgears.xml +++ b/hacks/config/moebiusgears.xml @@ -5,19 +5,21 @@ +
+ _label="Number of gears" low="13" high="99" default="17"/> + _label="Number of teeth" low="7" high="49" default="15"/> +
@@ -26,11 +28,15 @@
- + <_description> Draws a closed, interlinked chain of rotating gears. The layout of -the gears follows the path of a moebius strip. +the gears follows the path of a moebius strip. See also the "Pinion" +and "Gears" screen savers. + +http://en.wikipedia.org/wiki/Involute_gear +http://en.wikipedia.org/wiki/Moebius_strip Written by Jamie Zawinski; 2007. diff --git a/hacks/config/moire.xml b/hacks/config/moire.xml index 54266965..6e4c9b9d 100644 --- a/hacks/config/moire.xml +++ b/hacks/config/moire.xml @@ -5,11 +5,11 @@ - + + + <_description> When the lines on the screen Make more lines in between, That's a moire'! +http://en.wikipedia.org/wiki/Moire_pattern + Written by Jamie Zawinski and Michael Bayne; 1997. diff --git a/hacks/config/moire2.xml b/hacks/config/moire2.xml index e87cf195..1c5d7f14 100644 --- a/hacks/config/moire2.xml +++ b/hacks/config/moire2.xml @@ -5,22 +5,26 @@ + + <_description> Generates fields of concentric circles or ovals, and combines the planes with various operations. The planes are moving independently of one another, causing the interference lines to spray. +http://en.wikipedia.org/wiki/Moire_pattern + Written by Jamie Zawinski; 1998. diff --git a/hacks/config/molecule.xml b/hacks/config/molecule.xml index a5fcc5b3..7c449ef0 100644 --- a/hacks/config/molecule.xml +++ b/hacks/config/molecule.xml @@ -4,36 +4,35 @@ + +
- - - + + + + - - - + + + +
- -
+ - - - - - +