http://slackware.bholcomb.com/slackware/slackware-11.0/source/xap/xscreensaver/xscree...
[xscreensaver] / OSX / AppController.m
diff --git a/OSX/AppController.m b/OSX/AppController.m
new file mode 100644 (file)
index 0000000..76911b3
--- /dev/null
@@ -0,0 +1,200 @@
+/* xscreensaver, Copyright (c) 2006 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* 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