-/* xscreensaver, Copyright (c) 2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2012-2014 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
#import "SaverListController.h"
#import "SaverRunner.h"
+#import "yarandom.h"
#import "version.h"
#undef countof
{
// Extract the version number and release date from the version string.
// Here's an area where I kind of wish I had "Two Problems".
+ // I guess I could add custom key to the Info.plist for this.
NSArray *a = [[NSString stringWithCString: screensaver_id
encoding:NSASCIIStringEncoding]
[[[NSBundle mainBundle] bundlePath]
stringByAppendingPathComponent:
@"iSaverRunner29t.png"]];
- UIBarButtonItem *button = [[[UIBarButtonItem alloc]
- initWithImage: img
- style: UIBarButtonItemStylePlain
- target: self
- action: @selector(titleTapped:)]
- autorelease];
- button.width = img.size.width;
- self.navigationItem.rightBarButtonItem = button;
+ UIButton *button = [[UIButton alloc] init];
+ [button setFrame: CGRectMake(0, 0, img.size.width, img.size.height)];
+ [button setBackgroundImage:img forState:UIControlStateNormal];
+ [button addTarget:self
+ action:@selector(titleTapped:)
+ forControlEvents:UIControlEventTouchUpInside];
+ self.navigationItem.rightBarButtonItem =
+ [[UIBarButtonItem alloc] initWithCustomView: button];
+ [button release];
// The title bar
SaverRunner *s =
(SaverRunner *) [[UIApplication sharedApplication] delegate];
if (! s) return;
- if (! [s isKindOfClass:[SaverRunner class]])
- abort();
+ NSAssert ([s isKindOfClass:[SaverRunner class]], @"not a SaverRunner");
[s loadSaver: cell.textLabel.text];
}
SaverRunner *s =
(SaverRunner *) [[UIApplication sharedApplication] delegate];
if (! s) return;
- if (! [s isKindOfClass:[SaverRunner class]])
- abort();
+ NSAssert ([s isKindOfClass:[SaverRunner class]], @"not a SaverRunner");
[s openPreferences: cell.textLabel.text];
}
}
+/* We need this to respond to "shake" gestures
+ */
+- (BOOL)canBecomeFirstResponder
+{
+ return YES;
+}
+
+- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
+{
+}
+
+- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
+{
+}
+
+
+/* Shake means load a random screen saver.
+ */
+- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
+{
+ if (motion != UIEventSubtypeMotionShake)
+ return;
+ NSMutableArray *a = [NSMutableArray arrayWithCapacity: 200];
+ for (NSArray *sec in letter_sections)
+ for (NSString *s in sec)
+ [a addObject: s];
+ int n = [a count];
+ if (! n) return;
+ NSString *which = [a objectAtIndex: (random() % n)];
+
+ SaverRunner *s =
+ (SaverRunner *) [[UIApplication sharedApplication] delegate];
+ if (! s) return;
+ NSAssert ([s isKindOfClass:[SaverRunner class]], @"not a SaverRunner");
+ [self scrollTo: which];
+ [s loadSaver: which];
+}
+
+
- (void)dealloc
{
for (int i = 0; i < countof(list_by_letter); i++)