From cae65ddd05f3077f91cd2c145ef5ce54d718708d Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Wed, 19 Jan 2011 20:19:15 +1300 Subject: [PATCH] Gut the osx launcher of everything except for the necessary platform shims (Ensure mono is installed, set DYLD_LIBRARY_PATH, Hide dock/menubar if running in fullscreen). TODO: Parse the yaml to disable menubar only if running fullscreen, register openra:// urls. --- OpenRA.Launcher.Mac/Controller.h | 26 +- OpenRA.Launcher.Mac/Controller.m | 270 +------ OpenRA.Launcher.Mac/Download.h | 36 - OpenRA.Launcher.Mac/Download.m | 196 ----- .../English.lproj/MainMenu.xib | 702 +----------------- OpenRA.Launcher.Mac/GameInstall.h | 29 - OpenRA.Launcher.Mac/GameInstall.m | 180 ----- OpenRA.Launcher.Mac/HttpRequest.h | 29 - OpenRA.Launcher.Mac/HttpRequest.m | 80 -- OpenRA.Launcher.Mac/ImageAndTextCell.h | 62 -- OpenRA.Launcher.Mac/ImageAndTextCell.m | 252 ------- OpenRA.Launcher.Mac/JSBridge.h | 23 - OpenRA.Launcher.Mac/JSBridge.m | 236 ------ OpenRA.Launcher.Mac/Mod.h | 33 - OpenRA.Launcher.Mac/Mod.m | 58 -- OpenRA.Launcher.Mac/OpenRA-Info.plist | 4 +- .../OpenRA.xcodeproj/project.pbxproj | 42 -- OpenRA.Launcher.Mac/SidebarEntry.h | 32 - OpenRA.Launcher.Mac/SidebarEntry.m | 84 --- .../Release/OpenRA.app/Contents/Info.plist | 4 +- .../Release/OpenRA.app/Contents/MacOS/OpenRA | Bin 215684 -> 68552 bytes .../Resources/English.lproj/MainMenu.nib | Bin 13681 -> 6774 bytes OpenRA.Launcher.Mac/main.m | 7 +- 23 files changed, 70 insertions(+), 2315 deletions(-) delete mode 100644 OpenRA.Launcher.Mac/Download.h delete mode 100644 OpenRA.Launcher.Mac/Download.m delete mode 100644 OpenRA.Launcher.Mac/GameInstall.h delete mode 100644 OpenRA.Launcher.Mac/GameInstall.m delete mode 100644 OpenRA.Launcher.Mac/HttpRequest.h delete mode 100644 OpenRA.Launcher.Mac/HttpRequest.m delete mode 100755 OpenRA.Launcher.Mac/ImageAndTextCell.h delete mode 100755 OpenRA.Launcher.Mac/ImageAndTextCell.m delete mode 100644 OpenRA.Launcher.Mac/JSBridge.h delete mode 100644 OpenRA.Launcher.Mac/JSBridge.m delete mode 100644 OpenRA.Launcher.Mac/Mod.h delete mode 100644 OpenRA.Launcher.Mac/Mod.m delete mode 100644 OpenRA.Launcher.Mac/SidebarEntry.h delete mode 100644 OpenRA.Launcher.Mac/SidebarEntry.m diff --git a/OpenRA.Launcher.Mac/Controller.h b/OpenRA.Launcher.Mac/Controller.h index dad2656956..497140b514 100644 --- a/OpenRA.Launcher.Mac/Controller.h +++ b/OpenRA.Launcher.Mac/Controller.h @@ -7,36 +7,16 @@ */ #import -#import -@class Mod; -@class SidebarEntry; -@class GameInstall; -@class JSBridge; -@class Download; + @interface Controller : NSObject { - SidebarEntry *sidebarItems; - GameInstall *game; - NSDictionary *allMods; - NSMutableArray *httpRequests; - NSMutableDictionary *downloads; BOOL hasMono; NSString *monoPath; - + NSString *gamePath; + IBOutlet NSWindow *window; - IBOutlet NSOutlineView *outlineView; - IBOutlet WebView *webView; } -@property(readonly) NSDictionary *allMods; -@property(readonly) WebView *webView; - (void)launchMod:(NSString *)mod; -- (void)populateModInfo; -- (SidebarEntry *)sidebarModsTree; -- (SidebarEntry *)sidebarOtherTree; - -- (void)fetchURL:(NSString *)url withCallback:(NSString *)cb; -- (BOOL)registerDownload:(NSString *)key withURL:(NSString *)url filePath:(NSString *)path; -- (Download *)downloadWithKey:(NSString *)key; - (BOOL)initMono; @end diff --git a/OpenRA.Launcher.Mac/Controller.m b/OpenRA.Launcher.Mac/Controller.m index 04aa5455a9..0f24311b16 100644 --- a/OpenRA.Launcher.Mac/Controller.m +++ b/OpenRA.Launcher.Mac/Controller.m @@ -7,17 +7,8 @@ */ #import "Controller.h" -#import "Mod.h" -#import "SidebarEntry.h" -#import "GameInstall.h" -#import "ImageAndTextCell.h" -#import "JSBridge.h" -#import "Download.h" -#import "HttpRequest.h" @implementation Controller -@synthesize allMods; -@synthesize webView; + (void)initialize { @@ -28,43 +19,11 @@ - (void)awakeFromNib { - NSString *gamePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"gamepath"]; + gamePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"gamepath"]; hasMono = [self initMono]; NSLog(@"%d, %@",hasMono, monoPath); - if (hasMono) - { - game = [[GameInstall alloc] initWithGamePath:gamePath monoPath:monoPath]; - [[JSBridge sharedInstance] setController:self]; - downloads = [[NSMutableDictionary alloc] init]; - httpRequests = [[NSMutableArray alloc] init]; - - NSTableColumn *col = [outlineView tableColumnWithIdentifier:@"mods"]; - ImageAndTextCell *imageAndTextCell = [[[ImageAndTextCell alloc] init] autorelease]; - [col setDataCell:imageAndTextCell]; - - sidebarItems = [[SidebarEntry headerWithTitle:@""] retain]; - [self populateModInfo]; - id modsRoot = [self sidebarModsTree]; - [sidebarItems addChild:modsRoot]; - //id otherRoot = [self sidebarOtherTree]; - //[sidebarItems addChild:otherRoot]; - - - [outlineView reloadData]; - [outlineView expandItem:modsRoot expandChildren:YES]; - - if ([[modsRoot children] count] > 0) - { - id firstMod = [[modsRoot children] objectAtIndex:0]; - int row = [outlineView rowForItem:firstMod]; - [outlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO]; - [[webView mainFrame] loadRequest:[NSURLRequest requestWithURL: [firstMod url]]]; - } - - //[outlineView expandItem:otherRoot expandChildren:YES]; - } } - (void)applicationDidFinishLaunching:(NSNotification *)aNotification @@ -77,18 +36,17 @@ otherButton:nil informativeTextWithFormat:@"OpenRA requires the Mono Framework version 2.6.7 or later."]; - [alert beginSheetModalForWindow:window modalDelegate:self didEndSelector:@selector(monoAlertEnded:code:context:) contextInfo:NULL]; + + if ([alert runModal] == NSAlertDefaultReturn) + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://www.go-mono.com/mono-downloads/download.html"]]; + + [[NSApplication sharedApplication] terminate:self]; + } + else + { + [self launchMod:@"cnc"]; + [NSApp terminate: nil]; } -} - -- (void)monoAlertEnded:(NSAlert *)alert - code:(int)button - context:(void *)v -{ - if (button == NSAlertDefaultReturn) - [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://www.go-mono.com/mono-downloads/download.html"]]; - - [[NSApplication sharedApplication] terminate:self]; } - (BOOL)initMono @@ -143,203 +101,49 @@ - (void)dealloc { - [sidebarItems release]; sidebarItems = nil; - [downloads release]; downloads = nil; - [httpRequests release]; httpRequests = nil; [monoPath release]; monoPath = nil; + [gamePath release]; gamePath = nil; [super dealloc]; } -- (void)populateModInfo -{ - // Get info for all installed mods - [allMods autorelease]; - allMods = [[game infoForMods:[game installedMods]] retain]; -} -- (SidebarEntry *)sidebarModsTree +-(void)launchMod:(NSString *)mod { - SidebarEntry *rootItem = [SidebarEntry headerWithTitle:@"MODS"]; - for (id key in allMods) - { - id aMod = [allMods objectForKey:key]; - if ([aMod standalone]) - { - id path = [[game gamePath] stringByAppendingPathComponent:@"mods"]; - id child = [SidebarEntry entryWithMod:aMod allMods:allMods basePath:path]; - [rootItem addChild:child]; - } - } + // Use LaunchServices because neither NSTask or NSWorkspace support Info.plist _and_ arguments pre-10.6 - return rootItem; -} - -- (SidebarEntry *)sidebarOtherTree -{ - SidebarEntry *rootItem = [SidebarEntry headerWithTitle:@"OTHER"]; - [rootItem addChild:[SidebarEntry entryWithTitle:@"Support" url:nil icon:nil]]; - [rootItem addChild:[SidebarEntry entryWithTitle:@"Credits" url:nil icon:nil]]; + // First argument is the directory to run in + // Second...Nth arguments are passed to OpenRA.Game.exe + // Launcher wrapper sets mono --debug, gl renderer and support dir. + NSArray *args = [NSArray arrayWithObjects:@"--launch", gamePath, monoPath, + [NSString stringWithFormat:@"SupportDir=%@",[@"~/Library/Application Support/OpenRA" stringByExpandingTildeInPath]], + [NSString stringWithFormat:@"Game.Mods=%@",mod], + nil]; - return rootItem; -} - -- (void)launchMod:(NSString *)mod -{ - [game launchMod:mod]; -} - -- (BOOL)registerDownload:(NSString *)key withURL:(NSString *)url filePath:(NSString *)path; -{ - if ([downloads objectForKey:key] != nil) - return NO; + FSRef appRef; + CFURLGetFSRef((CFURLRef)[NSURL URLWithString:[[[NSBundle mainBundle] executablePath] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]], &appRef); - [downloads setObject:[Download downloadWithURL:url filename:path key:key game:game] - forKey:key]; - return YES; -} - -- (Download *)downloadWithKey:(NSString *)key -{ - return [downloads objectForKey:key]; -} - -- (void)fetchURL:(NSString *)url withCallback:(NSString *)cb -{ - // Clean up any completed requests - for (int i = [httpRequests count] - 1; i >= 0; i--) - if ([[httpRequests objectAtIndex:i] terminated]) - [httpRequests removeObjectAtIndex:i]; + // Set the launch parameters + LSApplicationParameters params; + params.version = 0; + params.flags = kLSLaunchDefaults | kLSLaunchNewInstance; + params.application = &appRef; + params.asyncLaunchRefCon = NULL; + params.environment = NULL; // CFDictionaryRef of environment variables; could be useful + params.argv = (CFArrayRef)args; + params.initialEvent = NULL; - // Create request - [httpRequests addObject:[HttpRequest requestWithURL:url callback:cb game:game]]; -} - -#pragma mark Sidebar Datasource and Delegate -- (NSInteger)outlineView:(NSOutlineView *)anOutlineView numberOfChildrenOfItem:(id)item -{ - // Can be called before awakeFromNib; return nothing - if (sidebarItems == nil) - return 0; + ProcessSerialNumber psn; + OSStatus err = LSOpenApplication(¶ms, &psn); - // Root item - if (item == nil) - return [[sidebarItems children] count]; - - return [[item children] count]; + // Bring the game window to the front + if (err == noErr) + SetFrontProcess(&psn); } -- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item -{ - return (item == nil) ? YES : [[item children] count] != 0; -} - -- (id)outlineView:(NSOutlineView *)outlineView - child:(NSInteger)index - ofItem:(id)item -{ - if (item == nil) - return [[sidebarItems children] objectAtIndex:index]; - - return [[item children] objectAtIndex:index]; -} - --(BOOL)outlineView:(NSOutlineView*)outlineView isGroupItem:(id)item -{ - if (item == nil) - return NO; - - return [item isHeader]; -} - -- (id)outlineView:(NSOutlineView *)outlineView -objectValueForTableColumn:(NSTableColumn *)tableColumn - byItem:(id)item -{ - return [item title]; -} - -- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item; -{ - // don't allow headers to be selected - if ([item isHeader] || [item url] == nil) - return NO; - - [[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:[item url]]]; - - return YES; -} - -- (void)outlineView:(NSOutlineView *)olv willDisplayCell:(NSCell*)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item -{ - if ([[tableColumn identifier] isEqualToString:@"mods"]) - { - if ([cell isKindOfClass:[ImageAndTextCell class]]) - { - [(ImageAndTextCell*)cell setImage:[item icon]]; - } - } -} - -#pragma mark WebView delegates -- (void)webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)windowObject forFrame:(WebFrame *)frame -{ - // Cancel any in progress http requests - for (HttpRequest *r in httpRequests) - [r cancel]; - - [windowObject setValue:[JSBridge sharedInstance] forKey:@"external"]; -} - -- (void)webView:(WebView *)webView addMessageToConsole:(NSDictionary *)dictionary -{ - NSLog(@"%@",dictionary); -} - - #pragma mark Application delegates - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender { return YES; } -- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender -{ - int count = 0; - for (NSString *key in downloads) - if ([[(Download *)[downloads objectForKey:key] status] isEqualToString:@"DOWNLOADING"]) - count++; - - if (count == 0) - return NSTerminateNow; - - NSString *format = count == 1 ? @"1 download is" : [NSString stringWithFormat:@"%d downloads are",count]; - NSAlert *alert = [NSAlert alertWithMessageText:@"Are you sure you want to quit?" - defaultButton:@"Wait" - alternateButton:@"Quit" - otherButton:nil - informativeTextWithFormat:@"%@ in progress and will be cancelled if you quit.", format]; - - [alert beginSheetModalForWindow:window modalDelegate:self didEndSelector:@selector(quitAlertEnded:code:context:) contextInfo:NULL]; - return NSTerminateLater; -} - -- (void)quitAlertEnded:(NSAlert *)alert - code:(int)button - context:(void *)v -{ - NSApplicationTerminateReply reply = (button == NSAlertDefaultReturn) ? NSTerminateCancel : NSTerminateNow; - [[NSApplication sharedApplication] replyToApplicationShouldTerminate:reply]; -} - -- (void)applicationWillTerminate:(NSNotification *)aNotification -{ - // Cancel all in-progress downloads - for (NSString *key in downloads) - { - Download *d = [downloads objectForKey:key]; - if ([[d status] isEqualToString:@"DOWNLOADING"]) - [d cancel]; - } -} - @end diff --git a/OpenRA.Launcher.Mac/Download.h b/OpenRA.Launcher.Mac/Download.h deleted file mode 100644 index 8ebda59225..0000000000 --- a/OpenRA.Launcher.Mac/Download.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see LICENSE. - */ - -#import - -@class GameInstall; -@interface Download : NSObject -{ - NSString *key; - NSString *url; - NSString *filename; - GameInstall *game; - NSTask *task; - NSString *status; - NSString *error; - int bytesCompleted; - int bytesTotal; -} - -@property(readonly) NSString *key; -@property(readonly) NSString *status; -@property(readonly) int bytesCompleted; -@property(readonly) int bytesTotal; -@property(readonly) NSString *error; - -+ (id)downloadWithURL:(NSString *)aURL filename:(NSString *)aFilename key:(NSString *)aKey game:(GameInstall *)aGame; -- (id)initWithURL:(NSString *)aURL filename:(NSString *)aFilename key:(NSString *)aKey game:(GameInstall *)game; -- (BOOL)start; -- (BOOL)cancel; -- (BOOL)extractToPath:(NSString *)aPath; -@end \ No newline at end of file diff --git a/OpenRA.Launcher.Mac/Download.m b/OpenRA.Launcher.Mac/Download.m deleted file mode 100644 index 0c90fe3e8c..0000000000 --- a/OpenRA.Launcher.Mac/Download.m +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see LICENSE. - */ - -#import "Download.h" -#import "GameInstall.h" -#import "JSBridge.h" - -@implementation Download -@synthesize key; -@synthesize status; -@synthesize bytesCompleted; -@synthesize bytesTotal; -@synthesize error; - -+ (id)downloadWithURL:(NSString *)aURL filename:(NSString *)aFilename key:(NSString *)aKey game:(GameInstall *)aGame -{ - id newObject = [[self alloc] initWithURL:aURL filename:aFilename key:aKey game:aGame]; - [newObject autorelease]; - return newObject; -} - -- (id)initWithURL:(NSString *)aURL filename:(NSString *)aFilename key:(NSString *)aKey game:(GameInstall *)aGame; -{ - self = [super init]; - if (self != nil) - { - url = [aURL retain]; - filename = [aFilename retain]; - key = [aKey retain]; - game = [aGame retain]; - error = @""; - - if ([[NSFileManager defaultManager] fileExistsAtPath:filename]) - { - status = @"DOWNLOADED"; - bytesCompleted = bytesTotal = [[[NSFileManager defaultManager] attributesOfItemAtPath:filename error:NULL] fileSize]; - } - else - { - status = @"AVAILABLE"; - bytesCompleted = bytesTotal = -1; - } - } - return self; -} - - -- (BOOL)start -{ - status = @"DOWNLOADING"; - task = [game runAsyncUtilityWithArg:[NSString stringWithFormat:@"--download-url=%@,%@",url,filename] - delegate:self - responseSelector:@selector(downloadResponded:) - terminatedSelector:@selector(utilityTerminated:)]; - [task retain]; - return YES; -} - -- (BOOL)cancel -{ - status = @"ERROR"; - error = @"Download Cancelled"; - - [[NSFileManager defaultManager] removeItemAtPath:filename error:NULL]; - bytesCompleted = bytesTotal = -1; - - [[JSBridge sharedInstance] runCallback:@"downloadProgressed" withArgument:[self key]]; - [[NSNotificationCenter defaultCenter] removeObserver:self - name:NSFileHandleReadCompletionNotification - object:[[task standardOutput] fileHandleForReading]]; - [task terminate]; - return YES; -} - -- (void)downloadResponded:(NSNotification *)n -{ - NSData *data = [[n userInfo] valueForKey:NSFileHandleNotificationDataItem]; - NSString *response = [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease]; - - // Response can contain multiple lines, or no lines. Split into lines, and parse each in turn - NSArray *lines = [response componentsSeparatedByString:@"\n"]; - for (NSString *line in lines) - { - NSRange separator = [line rangeOfString:@":"]; - if (separator.location == NSNotFound) - continue; // We only care about messages of the form key: value - - NSString *type = [line substringToIndex:separator.location]; - NSString *message = [[line substringFromIndex:separator.location+1] - stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; - - if ([type isEqualToString:@"Error"]) - { - status = @"ERROR"; - [error autorelease]; - if ([[message substringToIndex:36] isEqualToString:@"The remote server returned an error:"]) - error = [[message substringFromIndex:37] retain]; - else - error = [message retain]; - } - - else if ([type isEqualToString:@"Status"]) - { - if ([message isEqualToString:@"Completed"]) - { - status = @"DOWNLOADED"; - } - - // Parse download status info - int done,total; - if (sscanf([message UTF8String], "%*d%% %d/%d bytes", &done, &total) == 2) - { - bytesCompleted = done; - bytesTotal = total; - } - } - } - [[JSBridge sharedInstance] runCallback:@"downloadProgressed" withArgument:[self key]]; - - // Keep reading - if ([n object] != nil) - [[n object] readInBackgroundAndNotify]; -} - -- (BOOL)extractToPath:(NSString *)aPath -{ - status = @"EXTRACTING"; - task = [game runAsyncUtilityWithArg:[NSString stringWithFormat:@"--extract-zip=%@,%@",filename,aPath] - delegate:self - responseSelector:@selector(extractResponded:) - terminatedSelector:@selector(utilityTerminated:)]; - [task retain]; - return YES; -} - -- (void)extractResponded:(NSNotification *)n -{ - NSData *data = [[n userInfo] valueForKey:NSFileHandleNotificationDataItem]; - NSString *response = [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease]; - - // Response can contain multiple lines, or no lines. Split into lines, and parse each in turn - NSArray *lines = [response componentsSeparatedByString:@"\n"]; - for (NSString *line in lines) - { - NSLog(@"%@",line); - NSRange separator = [line rangeOfString:@":"]; - if (separator.location == NSNotFound) - continue; // We only care about messages of the form key: value - - NSString *type = [line substringToIndex:separator.location]; - NSString *message = [[line substringFromIndex:separator.location+1] - stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; - - if ([type isEqualToString:@"Error"]) - { - status = @"ERROR"; - [error autorelease]; - error = [message retain]; - } - - else if ([type isEqualToString:@"Status"]) - { - if ([message isEqualToString:@"Completed"]) - { - status = @"EXTRACTED"; - } - } - } - [[JSBridge sharedInstance] runCallback:@"extractProgressed" withArgument:[self key]]; - - // Keep reading - if ([n object] != nil) - [[n object] readInBackgroundAndNotify]; -} - -- (void)utilityTerminated:(NSNotification *)n -{ - NSLog(@"download terminated"); - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc removeObserver:self name:NSFileHandleReadCompletionNotification object:[[task standardOutput] fileHandleForReading]]; - [nc removeObserver:self name:NSTaskDidTerminateNotification object:task]; - [task release]; task = nil; - - if (status == @"ERROR") - { - [[NSFileManager defaultManager] removeItemAtPath:filename error:NULL]; - bytesCompleted = bytesTotal = -1; - } -} - -@end diff --git a/OpenRA.Launcher.Mac/English.lproj/MainMenu.xib b/OpenRA.Launcher.Mac/English.lproj/MainMenu.xib index 5826fb609a..dd81d1a4d6 100644 --- a/OpenRA.Launcher.Mac/English.lproj/MainMenu.xib +++ b/OpenRA.Launcher.Mac/English.lproj/MainMenu.xib @@ -1,32 +1,21 @@ - 1060 - 10H574 - 804 + 1050 + 10J567 + 823 1038.35 - 461.00 + 462.00 - YES - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.WebKitIBPlugin - - - YES - 804 - 804 - + com.apple.InterfaceBuilder.CocoaPlugin + 823 YES - - + YES - com.apple.WebKitIBPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -268,264 +257,6 @@ _NSMainMenu - - 15 - 2 - {{335, 281}, {659, 469}} - 1954021376 - OpenRA Launcher - NSWindow - - {3.40282e+38, 3.40282e+38} - - - 256 - - YES - - - 274 - - YES - - - 256 - - YES - - - 274 - - YES - - - 2304 - - YES - - - 256 - {188, 468} - - YES - - - -2147483392 - {{224, 0}, {16, 17}} - - - YES - - mods - 185 - 16 - 1000 - - 75628096 - 2048 - - - LucidaGrande - 11 - 3100 - - - 3 - MC4zMzMzMzI5ODU2AA - - - 6 - System - headerTextColor - - 3 - MAA - - - - - 337772096 - 2048 - Text Cell - - LucidaGrande - 13 - 1044 - - - - 6 - System - controlBackgroundColor - - 3 - MC42NjY2NjY2ODY1AA - - - - 6 - System - controlTextColor - - - - 3 - YES - YES - - - - 3 - 0.0 - - 6 - System - _sourceListBackgroundColor - - 1 - MC44MzkyMTU2OTU5IDAuODY2NjY2Njc0NiAwLjg5ODAzOTIyMTgAA - - - - 6 - System - gridColor - - 3 - MC41AA - - - 20 - -767557632 - - - 4 - 15 - 0 - YES - 1 - 1 - 14 - - - {{1, 1}, {188, 468}} - - - - - 4 - - - - -2147483392 - {{224, 17}, {15, 102}} - - - _doScroller: - 0.99786323308944702 - - - - -2147483392 - {{1, 453}, {141, 15}} - - 1 - - _doScroller: - 0.99295777082443237 - - - {190, 470} - - - 562 - - - - QSAAAEEgAABBoAAAQaAAAA - - - {189, 469} - - 2 - NSView - - - - 256 - - YES - - - 274 - - YES - - YES - Apple HTML pasteboard type - Apple PDF pasteboard type - Apple PICT pasteboard type - Apple URL pasteboard type - Apple Web Archive pasteboard type - NSColor pasteboard type - NSFilenamesPboardType - NSStringPboardType - NeXT RTFD pasteboard type - NeXT Rich Text Format v1.0 pasteboard type - NeXT TIFF v4.0 pasteboard type - WebURLsWithTitlesPboardType - public.png - public.url - public.url-name - - - {469, 469} - - - - - - - - YES - - YES - WebKitDefaultFixedFontSize - WebKitDefaultFontSize - WebKitMinimumFontSize - - - YES - - - - - - - YES - YES - - - {{190, 0}, {469, 469}} - - 2 - NSView - - - {659, 469} - - 2 - YES - 2 - - - {659, 469} - - 2 - - {{0, 0}, {1920, 1178}} - {3.40282e+38, 3.40282e+38} - Controller @@ -605,46 +336,6 @@ 493 - - - dataSource - - - - 582 - - - - delegate - - - - 583 - - - - outlineView - - - - 585 - - - - webView - - - - 590 - - - - frameLoadDelegate - - - - 591 - delegate @@ -653,14 +344,6 @@ 592 - - - window - - - - 593 - @@ -835,24 +518,6 @@ - - 371 - - - YES - - - - - - 372 - - - YES - - - - 490 @@ -876,88 +541,11 @@ - - 555 - - - YES - - - - - - - 557 - - - YES - - - - - - 556 - - - YES - - - - - - 568 - - - YES - - - - - - - - 569 - - - - - 570 - - - - - 571 - - - YES - - - - - - 573 - - - YES - - - - - - 576 - - - 579 - - 589 - - - @@ -1004,40 +592,21 @@ 29.ImportedFromIB2 29.WindowOrigin 29.editorWindowContentRectSynchronizationRect - 371.IBEditorWindowLastContentRect - 371.IBPluginDependency - 371.IBWindowTemplateEditedContentRect - 371.NSWindowTemplate.visibleAtLaunch - 371.editorWindowContentRectSynchronizationRect - 371.windowTemplate.maxSize - 372.IBPluginDependency 490.IBPluginDependency 491.IBEditorWindowLastContentRect 491.IBPluginDependency 492.IBPluginDependency 5.IBPluginDependency 5.ImportedFromIB2 - 555.IBPluginDependency - 556.IBPluginDependency - 557.IBPluginDependency 56.IBPluginDependency 56.ImportedFromIB2 - 568.IBPluginDependency - 568.IBViewBoundsToFrameTransform - 569.IBPluginDependency 57.IBEditorWindowLastContentRect 57.IBPluginDependency 57.ImportedFromIB2 57.editorWindowContentRectSynchronizationRect - 570.IBPluginDependency - 571.IBPluginDependency - 573.IBPluginDependency - 576.IBPluginDependency 579.IBPluginDependency 58.IBPluginDependency 58.ImportedFromIB2 - 589.IBPluginDependency - 589.IBViewBoundsToFrameTransform 92.IBPluginDependency 92.ImportedFromIB2 @@ -1083,13 +652,6 @@ {74, 862} {{6, 978}, {478, 20}} - {{378, 537}, {659, 469}} - com.apple.InterfaceBuilder.CocoaPlugin - {{378, 537}, {659, 469}} - - {{33, 99}, {480, 360}} - {3.40282e+38, 3.40282e+38} - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{540, 813}, {161, 23}} com.apple.InterfaceBuilder.CocoaPlugin @@ -1097,28 +659,14 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAADBoAAAwy4AAA - - com.apple.InterfaceBuilder.CocoaPlugin {{392, 653}, {190, 183}} com.apple.InterfaceBuilder.CocoaPlugin {{23, 794}, {245, 183}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.WebKitIBPlugin - com.apple.InterfaceBuilder.CocoaPlugin @@ -1148,42 +696,14 @@ Controller NSObject - YES - - YES - outlineView - webView - window - - - YES - NSOutlineView - WebView - NSWindow - + window + NSWindow - YES - - YES - outlineView - webView - window - - - YES - - outlineView - NSOutlineView - - - webView - WebView - - - window - NSWindow - + window + + window + NSWindow @@ -1194,14 +714,6 @@ YES - - NSActionCell - NSCell - - IBFrameworkSource - AppKit.framework/Headers/NSActionCell.h - - NSApplication NSResponder @@ -1245,30 +757,6 @@ AppKit.framework/Headers/NSUserInterfaceItemSearching.h - - NSCell - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSCell.h - - - - NSControl - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSControl.h - - - - NSFormatter - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFormatter.h - - NSMenu NSObject @@ -1306,7 +794,10 @@ NSObject - + + IBFrameworkSource + AppKit.framework/Headers/NSControl.h + NSObject @@ -1356,7 +847,7 @@ NSObject - + IBFrameworkSource AppKit.framework/Headers/NSOutlineView.h @@ -1377,7 +868,7 @@ NSObject - + IBFrameworkSource AppKit.framework/Headers/NSTableView.h @@ -1599,11 +1090,6 @@ WebKit.framework/Headers/WebUIDelegate.h - - NSOutlineView - NSTableView - - NSResponder @@ -1619,51 +1105,6 @@ AppKit.framework/Headers/NSResponder.h - - NSScrollView - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSScrollView.h - - - - NSScroller - NSControl - - IBFrameworkSource - AppKit.framework/Headers/NSScroller.h - - - - NSSplitView - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSSplitView.h - - - - NSTableColumn - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTableColumn.h - - - - NSTableView - NSControl - - - - NSTextFieldCell - NSActionCell - - IBFrameworkSource - AppKit.framework/Headers/NSTextFieldCell.h - - NSView @@ -1709,116 +1150,13 @@ AppKit.framework/Headers/NSWindowScripting.h - - WebView - NSView - - YES - - YES - goBack: - goForward: - makeTextLarger: - makeTextSmaller: - makeTextStandardSize: - reload: - reloadFromOrigin: - stopLoading: - takeStringURLFrom: - toggleContinuousSpellChecking: - toggleSmartInsertDelete: - - - YES - id - id - id - id - id - id - id - id - id - id - id - - - - YES - - YES - goBack: - goForward: - makeTextLarger: - makeTextSmaller: - makeTextStandardSize: - reload: - reloadFromOrigin: - stopLoading: - takeStringURLFrom: - toggleContinuousSpellChecking: - toggleSmartInsertDelete: - - - YES - - goBack: - id - - - goForward: - id - - - makeTextLarger: - id - - - makeTextSmaller: - id - - - makeTextStandardSize: - id - - - reload: - id - - - reloadFromOrigin: - id - - - stopLoading: - id - - - takeStringURLFrom: - id - - - toggleContinuousSpellChecking: - id - - - toggleSmartInsertDelete: - id - - - - - IBFrameworkSource - WebKit.framework/Headers/WebView.h - - 0 IBCocoaFramework com.apple.InterfaceBuilder.CocoaPlugin.macosx - + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 diff --git a/OpenRA.Launcher.Mac/GameInstall.h b/OpenRA.Launcher.Mac/GameInstall.h deleted file mode 100644 index 94b922f5d3..0000000000 --- a/OpenRA.Launcher.Mac/GameInstall.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see LICENSE. - */ - -#import - -@class Mod; -@class Controller; -@interface GameInstall : NSObject { - NSString *gamePath; - NSString *monoPath; - NSMutableDictionary *downloadTasks; -} -@property(readonly) NSString *gamePath; - --(id)initWithGamePath:(NSString *)gamepath monoPath:(NSString *)monopath; --(void)launchMod:(NSString *)mod; -- (NSString *)runUtilityQuery:(NSString *)arg; -- (NSArray *)installedMods; -- (NSDictionary *)infoForMods:(NSArray *)mods; -- (NSTask *)runAsyncUtilityWithArg:(NSString *)arg - delegate:(id)object - responseSelector:(SEL)response - terminatedSelector:(SEL)terminated; -@end diff --git a/OpenRA.Launcher.Mac/GameInstall.m b/OpenRA.Launcher.Mac/GameInstall.m deleted file mode 100644 index 943fa34e5c..0000000000 --- a/OpenRA.Launcher.Mac/GameInstall.m +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see LICENSE. - */ - -#import "GameInstall.h" -#import "Controller.h" -#import "Mod.h" - -@implementation GameInstall -@synthesize gamePath; - --(id)initWithGamePath:(NSString *)gamepath monoPath:(NSString *)monopath -{ - self = [super init]; - if (self != nil) - { - gamePath = [gamepath retain]; - monoPath = [monopath retain]; - downloadTasks = [[NSMutableDictionary alloc] init]; - } - return self; -} - -- (void)dealloc -{ - [gamePath release]; gamePath = nil; - [monoPath release]; monoPath = nil; - [downloadTasks release]; downloadTasks = nil; - [super dealloc]; -} - -- (NSArray *)installedMods -{ - id raw = [self runUtilityQuery:@"-l"]; - id mods = [raw stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; - return [mods componentsSeparatedByString:@"\n"]; -} - -- (NSDictionary *)infoForMods:(NSArray *)mods -{ - id query = [NSString stringWithFormat:@"-i=%@",[mods componentsJoinedByString:@","]]; - NSArray *lines = [[self runUtilityQuery:query] componentsSeparatedByString:@"\n"]; - - NSMutableDictionary *ret = [NSMutableDictionary dictionary]; - NSMutableDictionary *fields = nil; - NSString *current = nil; - for (id l in lines) - { - NSString *line = [l stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; - if (line == nil || [line length] == 0) - continue; - - id kv = [line componentsSeparatedByString:@":"]; - if ([kv count] < 2) - continue; - - id key = [[kv objectAtIndex:0] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; - id value = [[kv objectAtIndex:1] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; - - if ([key isEqualToString:@"Error"]) - { - NSLog(@"Error: %@",value); - continue; - } - - if ([key isEqualToString:@"Mod"]) - { - // Commit prev mod - if (current != nil) - { - id path = [gamePath stringByAppendingPathComponent:[NSString stringWithFormat:@"mods/%@",current]]; - [ret setObject:[Mod modWithId:current fields:fields path:path] forKey:current]; - } - NSLog(@"Parsing mod `%@`",value); - current = value; - fields = [NSMutableDictionary dictionary]; - } - - if (fields != nil) - [fields setObject:[value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] - forKey:key]; - } - if (current != nil) - { - id path = [gamePath stringByAppendingPathComponent:[NSString stringWithFormat:@"mods/%@",current]]; - [ret setObject:[Mod modWithId:current fields:fields path:path] forKey:current]; - } - - return ret; -} - --(void)launchMod:(NSString *)mod -{ - // Use LaunchServices because neither NSTask or NSWorkspace support Info.plist _and_ arguments pre-10.6 - - // First argument is the directory to run in - // Second...Nth arguments are passed to OpenRA.Game.exe - // Launcher wrapper sets mono --debug, gl renderer and support dir. - NSArray *args = [NSArray arrayWithObjects:@"--launch", gamePath, monoPath, - [NSString stringWithFormat:@"SupportDir=%@",[@"~/Library/Application Support/OpenRA" stringByExpandingTildeInPath]], - [NSString stringWithFormat:@"Game.Mods=%@",mod], - nil]; - - FSRef appRef; - CFURLGetFSRef((CFURLRef)[NSURL URLWithString:[[[NSBundle mainBundle] executablePath] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]], &appRef); - - // Set the launch parameters - LSApplicationParameters params; - params.version = 0; - params.flags = kLSLaunchDefaults | kLSLaunchNewInstance; - params.application = &appRef; - params.asyncLaunchRefCon = NULL; - params.environment = NULL; // CFDictionaryRef of environment variables; could be useful - params.argv = (CFArrayRef)args; - params.initialEvent = NULL; - - ProcessSerialNumber psn; - OSStatus err = LSOpenApplication(¶ms, &psn); - - // Bring the game window to the front - if (err == noErr) - SetFrontProcess(&psn); -} - -- (NSString *)runUtilityQuery:(NSString *)arg -{ - NSPipe *outPipe = [NSPipe pipe]; - NSMutableArray *taskArgs = [NSMutableArray arrayWithObject:@"OpenRA.Utility.exe"]; - [taskArgs addObject:arg]; - - NSTask *task = [[NSTask alloc] init]; - [task setCurrentDirectoryPath:gamePath]; - [task setLaunchPath:monoPath]; - [task setArguments:taskArgs]; - [task setStandardOutput:outPipe]; - [task setStandardError:[task standardOutput]]; - [task launch]; - NSData *data = [[outPipe fileHandleForReading] readDataToEndOfFile]; - [task waitUntilExit]; - [task release]; - - return [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease]; -} - -- (NSTask *)runAsyncUtilityWithArg:(NSString *)arg - delegate:(id)object - responseSelector:(SEL)response - terminatedSelector:(SEL)terminated -{ - NSTask *task = [[[NSTask alloc] init] autorelease]; - NSPipe *pipe = [NSPipe pipe]; - - NSMutableArray *taskArgs = [NSMutableArray arrayWithObject:@"OpenRA.Utility.exe"]; - [taskArgs addObject:arg]; - - [task setCurrentDirectoryPath:gamePath]; - [task setLaunchPath:monoPath]; - [task setArguments:taskArgs]; - [task setStandardOutput:pipe]; - - NSFileHandle *readHandle = [pipe fileHandleForReading]; - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc addObserver:object - selector:response - name:NSFileHandleReadCompletionNotification - object:readHandle]; - [nc addObserver:object - selector:terminated - name:NSTaskDidTerminateNotification - object:task]; - [task launch]; - [readHandle readInBackgroundAndNotify]; - return task; -} - -@end diff --git a/OpenRA.Launcher.Mac/HttpRequest.h b/OpenRA.Launcher.Mac/HttpRequest.h deleted file mode 100644 index a1ad188591..0000000000 --- a/OpenRA.Launcher.Mac/HttpRequest.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see LICENSE. - */ - -#import - -@class WebScriptObject; -@class GameInstall; -@interface HttpRequest : NSObject -{ - NSString *url; - NSString *callback; - GameInstall *game; - NSTask *task; - NSMutableData *response; - BOOL cancelled; -} -@property(readonly) NSString *url; - -+ (id)requestWithURL:(NSString *)aURL callback:(NSString *)aCallback game:(GameInstall *)aGame; -- (id)initWithURL:(NSString *)aURL callback:(NSString *)aCallback game:(GameInstall *)aGame; -- (void)cancel; -- (BOOL)terminated; - -@end diff --git a/OpenRA.Launcher.Mac/HttpRequest.m b/OpenRA.Launcher.Mac/HttpRequest.m deleted file mode 100644 index 27647f1893..0000000000 --- a/OpenRA.Launcher.Mac/HttpRequest.m +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see LICENSE. - */ - -#import "HttpRequest.h" -#import "JSBridge.h" -#import "GameInstall.h" - -@implementation HttpRequest -@synthesize url; - -+ (id)requestWithURL:(NSString *)aURL callback:(NSString *)aCallback game:(GameInstall *)aGame -{ - id newObject = [[self alloc] initWithURL:aURL callback:aCallback game:aGame]; - [newObject autorelease]; - return newObject; -} - -- (id)initWithURL:(NSString *)aURL callback:(NSString *)aCallback game:(GameInstall *)aGame; -{ - self = [super init]; - if (self != nil) - { - url = [aURL retain]; - callback = [aCallback retain]; - game = [aGame retain]; - response = [[NSMutableData alloc] init]; - - task = [game runAsyncUtilityWithArg:[NSString stringWithFormat:@"--download-url=%@",url] - delegate:self - responseSelector:@selector(utilityResponded:) - terminatedSelector:@selector(utilityTerminated:)]; - [task retain]; - } - return self; -} - -- (void)cancel -{ - cancelled = YES; - [[NSNotificationCenter defaultCenter] removeObserver:self - name:NSFileHandleReadCompletionNotification - object:[[task standardOutput] fileHandleForReading]]; - [task terminate]; -} - -- (void)utilityResponded:(NSNotification *)n -{ - NSData *data = [[n userInfo] valueForKey:NSFileHandleNotificationDataItem]; - [response appendData:data]; - - // Keep reading - if ([n object] != nil) - [[n object] readInBackgroundAndNotify]; -} - -- (void)utilityTerminated:(NSNotification *)n -{ - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc removeObserver:self name:NSFileHandleReadCompletionNotification object:[[task standardOutput] fileHandleForReading]]; - [nc removeObserver:self name:NSTaskDidTerminateNotification object:task]; - [task release]; task = nil; - - if (!cancelled) - { - NSString *data = [[[NSString alloc] initWithData:response encoding:NSASCIIStringEncoding] autorelease]; - [[JSBridge sharedInstance] runCallback:callback withArgument:data]; - } -} - -- (BOOL)terminated -{ - return task == nil; -} - -@end diff --git a/OpenRA.Launcher.Mac/ImageAndTextCell.h b/OpenRA.Launcher.Mac/ImageAndTextCell.h deleted file mode 100755 index f75674d6e4..0000000000 --- a/OpenRA.Launcher.Mac/ImageAndTextCell.h +++ /dev/null @@ -1,62 +0,0 @@ -// -// File: ImageAndTextCell.h -// -// Abstract: Subclass of NSTextFieldCell which can display text and an image simultaneously. -// -// Version: 1.0 -// -// Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Inc. ("Apple") -// in consideration of your agreement to the following terms, and your use, -// installation, modification or redistribution of this Apple software -// constitutes acceptance of these terms. If you do not agree with these -// terms, please do not use, install, modify or redistribute this Apple -// software. -// -// In consideration of your agreement to abide by the following terms, and -// subject to these terms, Apple grants you a personal, non - exclusive -// license, under Apple's copyrights in this original Apple software ( the -// "Apple Software" ), to use, reproduce, modify and redistribute the Apple -// Software, with or without modifications, in source and / or binary forms; -// provided that if you redistribute the Apple Software in its entirety and -// without modifications, you must retain this notice and the following text -// and disclaimers in all such redistributions of the Apple Software. Neither -// the name, trademarks, service marks or logos of Apple Inc. may be used to -// endorse or promote products derived from the Apple Software without specific -// prior written permission from Apple. Except as expressly stated in this -// notice, no other rights or licenses, express or implied, are granted by -// Apple herein, including but not limited to any patent rights that may be -// infringed by your derivative works or by other works in which the Apple -// Software may be incorporated. -// -// The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO -// WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED -// WARRANTIES OF NON - INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A -// PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION -// ALONE OR IN COMBINATION WITH YOUR PRODUCTS. -// -// IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR -// CONSEQUENTIAL DAMAGES ( INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION ) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION -// AND / OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER -// UNDER THEORY OF CONTRACT, TORT ( INCLUDING NEGLIGENCE ), STRICT LIABILITY OR -// OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Copyright (C) 2007 Apple Inc. All Rights Reserved. -// - -#import - -@interface ImageAndTextCell : NSTextFieldCell -{ -@private - NSImage *image; -} - -- (void)setImage:(NSImage *)anImage; -- (NSImage*)image; - -- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView; -- (NSSize)cellSize; - -@end diff --git a/OpenRA.Launcher.Mac/ImageAndTextCell.m b/OpenRA.Launcher.Mac/ImageAndTextCell.m deleted file mode 100755 index 58f28d80df..0000000000 --- a/OpenRA.Launcher.Mac/ImageAndTextCell.m +++ /dev/null @@ -1,252 +0,0 @@ -// -// File: ImageAndTextCell.m -// -// Abstract: Subclass of NSTextFieldCell which can display text and an image simultaneously. -// -// Version: 1.0 -// -// Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Inc. ("Apple") -// in consideration of your agreement to the following terms, and your use, -// installation, modification or redistribution of this Apple software -// constitutes acceptance of these terms. If you do not agree with these -// terms, please do not use, install, modify or redistribute this Apple -// software. -// -// In consideration of your agreement to abide by the following terms, and -// subject to these terms, Apple grants you a personal, non - exclusive -// license, under Apple's copyrights in this original Apple software ( the -// "Apple Software" ), to use, reproduce, modify and redistribute the Apple -// Software, with or without modifications, in source and / or binary forms; -// provided that if you redistribute the Apple Software in its entirety and -// without modifications, you must retain this notice and the following text -// and disclaimers in all such redistributions of the Apple Software. Neither -// the name, trademarks, service marks or logos of Apple Inc. may be used to -// endorse or promote products derived from the Apple Software without specific -// prior written permission from Apple. Except as expressly stated in this -// notice, no other rights or licenses, express or implied, are granted by -// Apple herein, including but not limited to any patent rights that may be -// infringed by your derivative works or by other works in which the Apple -// Software may be incorporated. -// -// The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO -// WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED -// WARRANTIES OF NON - INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A -// PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION -// ALONE OR IN COMBINATION WITH YOUR PRODUCTS. -// -// IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR -// CONSEQUENTIAL DAMAGES ( INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION ) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION -// AND / OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER -// UNDER THEORY OF CONTRACT, TORT ( INCLUDING NEGLIGENCE ), STRICT LIABILITY OR -// OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Copyright (C) 2007 Apple Inc. All Rights Reserved. -// - -#import "ImageAndTextCell.h" -//#import "BaseNode.h" - -@implementation ImageAndTextCell - -#define kIconImageSize 16.0 - -#define kImageOriginXOffset 3 -#define kImageOriginYOffset 1 - -#define kTextOriginXOffset 2 -#define kTextOriginYOffset 2 -#define kTextHeightAdjust 4 - -// ------------------------------------------------------------------------------- -// init: -// ------------------------------------------------------------------------------- -- (id)init -{ - self = [super init]; - - // we want a smaller font - [self setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; - - return self; -} - -// ------------------------------------------------------------------------------- -// dealloc: -// ------------------------------------------------------------------------------- -- (void)dealloc -{ - [image release]; - image = nil; - [super dealloc]; -} - -// ------------------------------------------------------------------------------- -// copyWithZone:zone -// ------------------------------------------------------------------------------- -- (id)copyWithZone:(NSZone*)zone -{ - ImageAndTextCell *cell = (ImageAndTextCell*)[super copyWithZone:zone]; - cell->image = [image retain]; - return cell; -} - -// ------------------------------------------------------------------------------- -// setImage:anImage -// ------------------------------------------------------------------------------- -- (void)setImage:(NSImage*)anImage -{ - if (anImage != image) - { - [image autorelease]; - image = [anImage retain]; - [image setSize:NSMakeSize(kIconImageSize, kIconImageSize)]; - } -} - -// ------------------------------------------------------------------------------- -// image: -// ------------------------------------------------------------------------------- -- (NSImage*)image -{ - return image; -} - -// ------------------------------------------------------------------------------- -// isGroupCell: -// ------------------------------------------------------------------------------- -- (BOOL)isGroupCell -{ - return ([self image] == nil && [[self title] length] > 0); -} - -// ------------------------------------------------------------------------------- -// titleRectForBounds:cellRect -// -// Returns the proper bound for the cell's title while being edited -// ------------------------------------------------------------------------------- -- (NSRect)titleRectForBounds:(NSRect)cellRect -{ - // the cell has an image: draw the normal item cell - NSSize imageSize; - NSRect imageFrame; - - imageSize = [image size]; - NSDivideRect(cellRect, &imageFrame, &cellRect, 3 + imageSize.width, NSMinXEdge); - - imageFrame.origin.x += kImageOriginXOffset; - imageFrame.origin.y -= kImageOriginYOffset; - imageFrame.size = imageSize; - - imageFrame.origin.y += ceil((cellRect.size.height - imageFrame.size.height) / 2); - - NSRect newFrame = cellRect; - newFrame.origin.x += kTextOriginXOffset; - newFrame.origin.y += kTextOriginYOffset; - newFrame.size.height -= kTextHeightAdjust; - - return newFrame; -} - -// ------------------------------------------------------------------------------- -// editWithFrame:inView:editor:delegate:event -// ------------------------------------------------------------------------------- -- (void)editWithFrame:(NSRect)aRect inView:(NSView*)controlView editor:(NSText*)textObj delegate:(id)anObject event:(NSEvent*)theEvent -{ - NSRect textFrame = [self titleRectForBounds:aRect]; - [super editWithFrame:textFrame inView:controlView editor:textObj delegate:anObject event:theEvent]; -} - -// ------------------------------------------------------------------------------- -// selectWithFrame:inView:editor:delegate:event:start:length -// ------------------------------------------------------------------------------- -- (void)selectWithFrame:(NSRect)aRect inView:(NSView*)controlView editor:(NSText*)textObj delegate:(id)anObject start:(NSInteger)selStart length:(NSInteger)selLength -{ - NSRect textFrame = [self titleRectForBounds:aRect]; - [super selectWithFrame:textFrame inView:controlView editor:textObj delegate:anObject start:selStart length:selLength]; -} - -// ------------------------------------------------------------------------------- -// drawWithFrame:cellFrame:controlView: -// ------------------------------------------------------------------------------- -- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView -{ - if (image != nil) - { - // the cell has an image: draw the normal item cell - NSSize imageSize; - NSRect imageFrame; - - imageSize = [image size]; - NSDivideRect(cellFrame, &imageFrame, &cellFrame, 3 + imageSize.width, NSMinXEdge); - - imageFrame.origin.x += kImageOriginXOffset; - imageFrame.origin.y -= kImageOriginYOffset; - imageFrame.size = imageSize; - - if ([controlView isFlipped]) - imageFrame.origin.y += ceil((cellFrame.size.height + imageFrame.size.height) / 2); - else - imageFrame.origin.y += ceil((cellFrame.size.height - imageFrame.size.height) / 2); - [image compositeToPoint:imageFrame.origin operation:NSCompositeSourceOver]; - - NSRect newFrame = cellFrame; - newFrame.origin.x += kTextOriginXOffset; - newFrame.origin.y += kTextOriginYOffset; - newFrame.size.height -= kTextHeightAdjust; - [super drawWithFrame:newFrame inView:controlView]; - } - else - { - if ([self isGroupCell]) - { - // Center the text in the cellFrame, and call super to do thew ork of actually drawing. - CGFloat yOffset = floor((NSHeight(cellFrame) - [[self attributedStringValue] size].height) / 2.0); - cellFrame.origin.y += yOffset; - cellFrame.size.height -= (kTextOriginYOffset*yOffset); - [super drawWithFrame:cellFrame inView:controlView]; - } - } -} - -// ------------------------------------------------------------------------------- -// cellSize: -// ------------------------------------------------------------------------------- -- (NSSize)cellSize -{ - NSSize cellSize = [super cellSize]; - cellSize.width += (image ? [image size].width : 0) + 3; - return cellSize; -} - -// ------------------------------------------------------------------------------- -// hitTestForEvent: -// -// In 10.5, we need you to implement this method for blocking drag and drop of a given cell. -// So NSCell hit testing will determine if a row can be dragged or not. -// -// NSTableView calls this cell method when starting a drag, if the hit cell returns -// NSCellHitTrackableArea, the particular row will be tracked instead of dragged. -// -// ------------------------------------------------------------------------------- -/* -- (NSUInteger)hitTestForEvent:(NSEvent *)event inRect:(NSRect)cellFrame ofView:(NSView *)controlView -{ - NSInteger result = NSCellHitContentArea; - - NSOutlineView* hostingOutlineView = (NSOutlineView*)[self controlView]; - if (hostingOutlineView) - { - NSInteger selectedRow = [hostingOutlineView selectedRow]; - BaseNode* node = [[hostingOutlineView itemAtRow:selectedRow] representedObject]; - - if (![node isDraggable]) // is the node isDraggable (i.e. non-file system based objects) - result = NSCellHitTrackableArea; - } - - return result; -} -*/ -@end - diff --git a/OpenRA.Launcher.Mac/JSBridge.h b/OpenRA.Launcher.Mac/JSBridge.h deleted file mode 100644 index ec31f26bb3..0000000000 --- a/OpenRA.Launcher.Mac/JSBridge.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see LICENSE. - */ - - -#import - -@class Controller; -@class Download; -@interface JSBridge : NSObject { - Controller *controller; - NSDictionary *methods; -} -@property(readonly) NSDictionary *methods; - -+ (JSBridge *)sharedInstance; -- (void)setController:(Controller *)aController; -- (void)runCallback:(NSString *)cb withArgument:(NSString *)arg; -@end diff --git a/OpenRA.Launcher.Mac/JSBridge.m b/OpenRA.Launcher.Mac/JSBridge.m deleted file mode 100644 index 09fa40ed38..0000000000 --- a/OpenRA.Launcher.Mac/JSBridge.m +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see LICENSE. - */ - -#import "JSBridge.h" -#import "Controller.h" -#import "Download.h" -#import "Mod.h" - -static JSBridge *SharedInstance; - -@implementation JSBridge -@synthesize methods; - -+ (JSBridge *)sharedInstance -{ - if (SharedInstance == nil) - SharedInstance = [[JSBridge alloc] init]; - - return SharedInstance; -} - -+ (NSString *)webScriptNameForSelector:(SEL)sel -{ - return [[[JSBridge sharedInstance] methods] objectForKey:NSStringFromSelector(sel)]; -} - -+ (BOOL)isSelectorExcludedFromWebScript:(SEL)sel -{ - return [[[JSBridge sharedInstance] methods] objectForKey:NSStringFromSelector(sel)] == nil; -} - --(id)init -{ - self = [super init]; - if (self != nil) - { - methods = [[NSDictionary dictionaryWithObjectsAndKeys: - @"launchMod", NSStringFromSelector(@selector(launchMod:)), - @"log", NSStringFromSelector(@selector(log:)), - @"existsInMod", NSStringFromSelector(@selector(fileExists:inMod:)), - @"metadata", NSStringFromSelector(@selector(metadata:forMod:)), - @"httpRequest", NSStringFromSelector(@selector(httpRequest:withCallback:)), - - // File downloading - @"registerDownload", NSStringFromSelector(@selector(registerDownload:withURL:filename:)), - @"startDownload", NSStringFromSelector(@selector(startDownload:)), - @"cancelDownload", NSStringFromSelector(@selector(cancelDownload:)), - @"downloadStatus", NSStringFromSelector(@selector(downloadStatus:)), - @"downloadError", NSStringFromSelector(@selector(downloadError:)), - @"bytesCompleted", NSStringFromSelector(@selector(bytesCompleted:)), - @"bytesTotal", NSStringFromSelector(@selector(bytesTotal:)), - @"extractDownload", NSStringFromSelector(@selector(extractDownload:toPath:inMod:)), - nil] retain]; - } - return self; -} - -- (void)setController:(Controller *)aController -{ - controller = [aController retain]; -} - -- (void)dealloc -{ - [controller release]; controller = nil; - [super dealloc]; -} - -- (void)runCallback:(NSString *)cb withArgument:(NSString *)arg -{ - NSString *cmd = [NSString stringWithFormat:@"%@('%@')", cb, - [arg stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"]]; - [[[controller webView] windowScriptObject] evaluateWebScript:cmd]; -} - -#pragma mark JS API methods - -- (BOOL)launchMod:(NSString *)aMod -{ - // Build the list of mods to launch - NSMutableArray *mods = [NSMutableArray array]; - NSString *current = aMod; - - // Assemble the mods in the reverse order to work around an engine bug - while (current != nil) - { - Mod *mod = [[controller allMods] objectForKey:current]; - if (mod == nil) - { - NSLog(@"Unknown mod: %@", current); - return NO; - } - [mods addObject:current]; - - if ([mod standalone]) - current = nil; - else - current = [mod requires]; - } - // Todo: Reverse the array ordering once the engine bug is fixed - - [controller launchMod:[mods componentsJoinedByString:@","]]; - return YES; -} - -- (BOOL)registerDownload:(NSString *)key withURL:(NSString *)url filename:(NSString *)filename -{ - // Create the download directory if it doesn't exist - NSString *downloadDir = [@"~/Library/Application Support/OpenRA/Downloads/" stringByExpandingTildeInPath]; - if (![[NSFileManager defaultManager] fileExistsAtPath:downloadDir]) - [[NSFileManager defaultManager] createDirectoryAtPath:downloadDir withIntermediateDirectories:YES attributes:nil error:NULL]; - - // Disallow traversing directories; take only the last component - NSString *path = [downloadDir stringByAppendingPathComponent:[filename lastPathComponent]]; - return [controller registerDownload:key withURL:url filePath:path]; -} - -- (NSString *)downloadStatus:(NSString *)key -{ - Download *d = [controller downloadWithKey:key]; - if (d == nil) - return @"NOT_REGISTERED"; - - return [d status]; -} - -- (NSString *)downloadError:(NSString *)key -{ - Download *d = [controller downloadWithKey:key]; - if (d == nil) - return @""; - - return [d error]; -} - -- (BOOL)startDownload:(NSString *)key -{ - Download *d = [controller downloadWithKey:key]; - return (d == nil) ? NO : [d start]; -} - -- (BOOL)cancelDownload:(NSString *)key -{ - Download *d = [controller downloadWithKey:key]; - return (d == nil) ? NO : [d cancel]; -} - -- (int)bytesCompleted:(NSString *)key -{ - Download *d = [controller downloadWithKey:key]; - return (d == nil) ? -1 : [d bytesCompleted]; -} - -- (int)bytesTotal:(NSString *)key -{ - Download *d = [controller downloadWithKey:key]; - return (d == nil) ? -1 : [d bytesTotal]; -} - -- (BOOL)extractDownload:(NSString *)key toPath:(NSString *)aFile inMod:(NSString *)aMod -{ - Download *d = [controller downloadWithKey:key]; - if (d == nil) - { - NSLog(@"Unknown download"); - return NO; - } - if (![[d status] isEqualToString:@"DOWNLOADED"]) - { - NSLog(@"Invalid download status"); - return NO; - } - - id mod = [[controller allMods] objectForKey:aMod]; - if (mod == nil) - { - NSLog(@"Invalid or unknown mod: %@", aMod); - return NO; - } - - // Disallow traversing up the directory tree - id path = [aMod stringByAppendingPathComponent:[aFile stringByReplacingOccurrencesOfString:@"../" - withString:@""]]; - - [d extractToPath:path]; - return YES; -} - -- (void)log:(NSString *)message -{ - NSLog(@"js: %@",message); -} - -- (BOOL)fileExists:(NSString *)aFile inMod:(NSString *)aMod -{ - id mod = [[controller allMods] objectForKey:aMod]; - if (mod == nil) - { - NSLog(@"Invalid or unknown mod: %@", aMod); - return NO; - } - - // Disallow traversing up the directory tree - id path = [[mod path] stringByAppendingPathComponent:[aFile stringByReplacingOccurrencesOfString:@"../" - withString:@""]]; - - return [[NSFileManager defaultManager] fileExistsAtPath:path]; -} - -- (NSString *)metadata:(NSString *)aField forMod:(NSString *)aMod -{ - id mod = [[controller allMods] objectForKey:aMod]; - if (mod == nil) - { - NSLog(@"Invalid or unknown mod: %@", aMod); - return @""; - } - - if ([aField isEqualToString:@"VERSION"]) - return [mod version]; - - NSLog(@"Invalid or unknown field: %@", aField); - return @""; -} - -- (void)httpRequest:(NSString *)url withCallback:(NSString *)cb -{ - [controller fetchURL:url withCallback:cb]; -} - -@end diff --git a/OpenRA.Launcher.Mac/Mod.h b/OpenRA.Launcher.Mac/Mod.h deleted file mode 100644 index 5c4fb234c8..0000000000 --- a/OpenRA.Launcher.Mac/Mod.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see LICENSE. - */ - -#import - -@interface Mod : NSObject { - NSString *path; - NSString *mod; - NSString *title; - NSString *version; - NSString *author; - NSString *requires; - NSString *description; - BOOL standalone; -} - -@property (readonly) NSString *mod; -@property (readonly) NSString *title; -@property (readonly) NSString *version; -@property (readonly) NSString *author; -@property (readonly) NSString *description; -@property (readonly) NSString *requires; -@property (readonly) NSString *path; -@property (readonly) BOOL standalone; - -+ (id)modWithId:(NSString *)mid fields:(id)fields path:(NSString *)path; -- (id)initWithId:(NSString *)anId fields:(NSDictionary *)fields path:(NSString *)path; -@end diff --git a/OpenRA.Launcher.Mac/Mod.m b/OpenRA.Launcher.Mac/Mod.m deleted file mode 100644 index 4dcced95ac..0000000000 --- a/OpenRA.Launcher.Mac/Mod.m +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see LICENSE. - */ - -#import "Mod.h" - - -@implementation Mod -@synthesize mod; -@synthesize title; -@synthesize version; -@synthesize author; -@synthesize description; -@synthesize requires; -@synthesize standalone; -@synthesize path; - -+ (id)modWithId:(NSString *)mod fields:(id)fields path:(NSString *)aPath -{ - id newObject = [[self alloc] initWithId:mod fields:fields path:aPath]; - [newObject autorelease]; - return newObject; -} - -- (id)initWithId:(NSString *)anId fields:(NSDictionary *)fields path:(NSString *)aPath -{ - self = [super init]; - if (self) - { - mod = [anId retain]; - path = [aPath retain]; - title = [[fields objectForKey:@"Title"] retain]; - version = [[fields objectForKey:@"Version"] retain]; - author = [[fields objectForKey:@"Author"] retain]; - description = [[fields objectForKey:@"Description"] retain]; - requires = [[fields objectForKey:@"Requires"] retain]; - standalone = ([[fields objectForKey:@"Standalone"] isEqualToString:@"True"]); - } - return self; -} - -- (void) dealloc -{ - [mod release]; mod = nil; - [path release]; path = nil; - [title release]; title = nil; - [version release]; version = nil; - [author release]; author = nil; - [description release]; description = nil; - [requires release]; requires = nil; - [super dealloc]; -} - -@end diff --git a/OpenRA.Launcher.Mac/OpenRA-Info.plist b/OpenRA.Launcher.Mac/OpenRA-Info.plist index 95ace488c8..fa1cb03573 100644 --- a/OpenRA.Launcher.Mac/OpenRA-Info.plist +++ b/OpenRA.Launcher.Mac/OpenRA-Info.plist @@ -9,9 +9,9 @@ CFBundleIconFile OpenRA.icns CFBundleName - OpenRA Launcher + OpenRA CFBundleDisplayName - OpenRA Launcher + OpenRA CFBundleIdentifier org.open-ra.launcher CFBundleInfoDictionaryVersion diff --git a/OpenRA.Launcher.Mac/OpenRA.xcodeproj/project.pbxproj b/OpenRA.Launcher.Mac/OpenRA.xcodeproj/project.pbxproj index 5e6ff11485..878f66cc8a 100644 --- a/OpenRA.Launcher.Mac/OpenRA.xcodeproj/project.pbxproj +++ b/OpenRA.Launcher.Mac/OpenRA.xcodeproj/project.pbxproj @@ -11,16 +11,9 @@ 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; - DA38212212925344003B0BB5 /* JSBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = DA38212112925344003B0BB5 /* JSBridge.m */; }; - DA7D85671295E92900E58547 /* Download.m in Sources */ = {isa = PBXBuildFile; fileRef = DA7D85661295E92900E58547 /* Download.m */; }; DA81FA821290F5C800C48F2F /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = DA81FA811290F5C800C48F2F /* Controller.m */; }; - DA81FAAA1290FA0000C48F2F /* Mod.m in Sources */ = {isa = PBXBuildFile; fileRef = DA81FAA91290FA0000C48F2F /* Mod.m */; }; - DA81FB9312910A8B00C48F2F /* ImageAndTextCell.m in Sources */ = {isa = PBXBuildFile; fileRef = DA81FB9212910A8B00C48F2F /* ImageAndTextCell.m */; }; DA81FBDC12910E4900C48F2F /* OpenRA.icns in Resources */ = {isa = PBXBuildFile; fileRef = DA81FBDB12910E4900C48F2F /* OpenRA.icns */; }; - DA81FC3F12911E2B00C48F2F /* GameInstall.m in Sources */ = {isa = PBXBuildFile; fileRef = DA81FC3E12911E2B00C48F2F /* GameInstall.m */; }; DA9295A712921DF900EDB02E /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA9295A612921DF900EDB02E /* WebKit.framework */; }; - DA9296901292328200EDB02E /* SidebarEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = DA92968F1292328200EDB02E /* SidebarEntry.m */; }; - DAA3F31C12CBF60D00E214BF /* HttpRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = DAA3F31B12CBF60D00E214BF /* HttpRequest.m */; }; DAB887F5129E5D6C00C99407 /* SDL in Resources */ = {isa = PBXBuildFile; fileRef = DAB887EE129E5D6100C99407 /* SDL */; }; /* End PBXBuildFile section */ @@ -34,24 +27,10 @@ 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 8D1107310486CEB800E47090 /* OpenRA-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "OpenRA-Info.plist"; sourceTree = ""; }; 8D1107320486CEB800E47090 /* OpenRA.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OpenRA.app; sourceTree = BUILT_PRODUCTS_DIR; }; - DA38212012925344003B0BB5 /* JSBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSBridge.h; sourceTree = ""; }; - DA38212112925344003B0BB5 /* JSBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSBridge.m; sourceTree = ""; }; - DA7D85651295E92900E58547 /* Download.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Download.h; sourceTree = ""; }; - DA7D85661295E92900E58547 /* Download.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Download.m; sourceTree = ""; }; DA81FA801290F5C800C48F2F /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Controller.h; sourceTree = ""; }; DA81FA811290F5C800C48F2F /* Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Controller.m; sourceTree = ""; }; - DA81FAA81290FA0000C48F2F /* Mod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Mod.h; sourceTree = ""; }; - DA81FAA91290FA0000C48F2F /* Mod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Mod.m; sourceTree = ""; }; - DA81FB9112910A8B00C48F2F /* ImageAndTextCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageAndTextCell.h; sourceTree = ""; }; - DA81FB9212910A8B00C48F2F /* ImageAndTextCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ImageAndTextCell.m; sourceTree = ""; }; DA81FBDB12910E4900C48F2F /* OpenRA.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = OpenRA.icns; sourceTree = ""; }; - DA81FC3D12911E2B00C48F2F /* GameInstall.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GameInstall.h; sourceTree = ""; }; - DA81FC3E12911E2B00C48F2F /* GameInstall.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GameInstall.m; sourceTree = ""; }; DA9295A612921DF900EDB02E /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; - DA92968E1292328200EDB02E /* SidebarEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SidebarEntry.h; sourceTree = ""; }; - DA92968F1292328200EDB02E /* SidebarEntry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SidebarEntry.m; sourceTree = ""; }; - DAA3F31A12CBF60D00E214BF /* HttpRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HttpRequest.h; sourceTree = ""; }; - DAA3F31B12CBF60D00E214BF /* HttpRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HttpRequest.m; sourceTree = ""; }; DAB887EE129E5D6100C99407 /* SDL */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = SDL; sourceTree = ""; }; /* End PBXFileReference section */ @@ -71,22 +50,8 @@ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( - DA81FB9112910A8B00C48F2F /* ImageAndTextCell.h */, - DA81FB9212910A8B00C48F2F /* ImageAndTextCell.m */, DA81FA801290F5C800C48F2F /* Controller.h */, DA81FA811290F5C800C48F2F /* Controller.m */, - DA81FAA81290FA0000C48F2F /* Mod.h */, - DA81FAA91290FA0000C48F2F /* Mod.m */, - DA81FC3D12911E2B00C48F2F /* GameInstall.h */, - DA81FC3E12911E2B00C48F2F /* GameInstall.m */, - DA7D85651295E92900E58547 /* Download.h */, - DA7D85661295E92900E58547 /* Download.m */, - DA92968E1292328200EDB02E /* SidebarEntry.h */, - DA92968F1292328200EDB02E /* SidebarEntry.m */, - DA38212112925344003B0BB5 /* JSBridge.m */, - DA38212012925344003B0BB5 /* JSBridge.h */, - DAA3F31A12CBF60D00E214BF /* HttpRequest.h */, - DAA3F31B12CBF60D00E214BF /* HttpRequest.m */, ); name = Classes; sourceTree = ""; @@ -228,13 +193,6 @@ files = ( 8D11072D0486CEB800E47090 /* main.m in Sources */, DA81FA821290F5C800C48F2F /* Controller.m in Sources */, - DA81FAAA1290FA0000C48F2F /* Mod.m in Sources */, - DA81FB9312910A8B00C48F2F /* ImageAndTextCell.m in Sources */, - DA81FC3F12911E2B00C48F2F /* GameInstall.m in Sources */, - DA9296901292328200EDB02E /* SidebarEntry.m in Sources */, - DA38212212925344003B0BB5 /* JSBridge.m in Sources */, - DA7D85671295E92900E58547 /* Download.m in Sources */, - DAA3F31C12CBF60D00E214BF /* HttpRequest.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/OpenRA.Launcher.Mac/SidebarEntry.h b/OpenRA.Launcher.Mac/SidebarEntry.h deleted file mode 100644 index c40864b72e..0000000000 --- a/OpenRA.Launcher.Mac/SidebarEntry.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see LICENSE. - */ - -#import - -@class Mod; -@interface SidebarEntry : NSObject -{ - BOOL isHeader; - NSString *title; - NSImage *icon; - NSURL *url; - NSMutableArray *children; -} - -@property (readonly) BOOL isHeader; -@property (readonly) NSString *title; -@property (readonly) NSMutableArray* children; -@property (readonly) NSImage* icon; - -+ (id)headerWithTitle:(NSString *)aTitle; -+ (id)entryWithTitle:(NSString *)aTitle url:(NSURL *)aURL icon:(id)anIcon; -+ (id)entryWithMod:(Mod *)baseMod allMods:(NSDictionary *)allMods basePath:(NSString *)aPath; -- (id)initWithTitle:(NSString *)aTitle url:(NSURL *)aURL icon:(id)anIcon isHeader:(BOOL)aHeader; -- (void)addChild:(id)child; -- (NSURL *)url; -@end diff --git a/OpenRA.Launcher.Mac/SidebarEntry.m b/OpenRA.Launcher.Mac/SidebarEntry.m deleted file mode 100644 index 2410ecc2c9..0000000000 --- a/OpenRA.Launcher.Mac/SidebarEntry.m +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see LICENSE. - */ - -#import "SidebarEntry.h" -#import "Mod.h" - -@implementation SidebarEntry -@synthesize isHeader; -@synthesize title; -@synthesize children; -@synthesize icon; - -+ (id)headerWithTitle:(NSString *)aTitle; -{ - id newObject = [[self alloc] initWithTitle:aTitle url:nil icon:nil isHeader:YES]; - [newObject autorelease]; - return newObject; -} - -+ (id)entryWithTitle:(NSString *)aTitle url:(NSURL *)aURL icon:(id)anIcon -{ - id newObject = [[self alloc] initWithTitle:aTitle url:aURL icon:anIcon isHeader:NO]; - [newObject autorelease]; - return newObject; -} - -+ (id)entryWithMod:(Mod *)baseMod allMods:(NSDictionary *)allMods basePath:(NSString *)basePath -{ - // TODO: Get the mod icon from the Mod - // Temporary hack until mods define an icon - NSString *imageName = [[NSBundle mainBundle] pathForResource:@"OpenRA" ofType:@"icns"]; - NSImage *icon = [[[NSImage alloc] initWithContentsOfFile:imageName] autorelease]; - NSURL *url = [NSURL URLWithString:[[[baseMod path] stringByAppendingPathComponent:@"mod.html"] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]]; - SidebarEntry *ret = [SidebarEntry entryWithTitle:[baseMod title] url:url icon:icon]; - - for (id key in allMods) - { - id aMod = [allMods objectForKey:key]; - if (![[aMod requires] isEqualToString:[baseMod mod]]) - continue; - - id child = [SidebarEntry entryWithMod:aMod allMods:allMods basePath:basePath]; - [ret addChild:child]; - } - return ret; -} - -- (id)initWithTitle:(NSString *)aTitle url:(NSURL *)aURL icon:(id)anIcon isHeader:(BOOL)isaHeader -{ - self = [super init]; - if (self) - { - isHeader = isaHeader; - title = [aTitle retain]; - url = [aURL retain]; - icon = [anIcon retain]; - children = [[NSMutableArray alloc] init]; - } - return self; -} - -- (void)addChild:(Mod *)child -{ - [children addObject:child]; -} - -- (NSURL *)url -{ - return url; -} - -- (void) dealloc -{ - [title release]; title = nil; - [url release]; url = nil; - [icon release]; icon = nil; - [super dealloc]; -} -@end diff --git a/OpenRA.Launcher.Mac/build/Release/OpenRA.app/Contents/Info.plist b/OpenRA.Launcher.Mac/build/Release/OpenRA.app/Contents/Info.plist index 8b9cbfdac4..e87e49f3a1 100644 --- a/OpenRA.Launcher.Mac/build/Release/OpenRA.app/Contents/Info.plist +++ b/OpenRA.Launcher.Mac/build/Release/OpenRA.app/Contents/Info.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion English CFBundleDisplayName - OpenRA Launcher + OpenRA CFBundleExecutable OpenRA CFBundleIconFile @@ -15,7 +15,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - OpenRA Launcher + OpenRA CFBundlePackageType APPL CFBundleShortVersionString diff --git a/OpenRA.Launcher.Mac/build/Release/OpenRA.app/Contents/MacOS/OpenRA b/OpenRA.Launcher.Mac/build/Release/OpenRA.app/Contents/MacOS/OpenRA index 09b0232c523fe34de8ce01697be90e90bb1df30b..4c08b7990638d249f1cd6419d0806eea4c5928f2 100755 GIT binary patch literal 68552 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≤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

HM8G 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 literal 13681 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 LUjB{$_pbjxXI6XX diff --git a/OpenRA.Launcher.Mac/main.m b/OpenRA.Launcher.Mac/main.m index 854be1b519..f3b367a68e 100644 --- a/OpenRA.Launcher.Mac/main.m +++ b/OpenRA.Launcher.Mac/main.m @@ -44,7 +44,12 @@ int main(int argc, char *argv[]) sprintf(buf,"%s:%s",argv[2], old); setenv("DYLD_LIBRARY_PATH", buf, 1); } - + + // Hide the menubar if we are running fullscreen + // TODO: HACK: Parse the settings.yaml / commandline args for fullscreen options + if (YES) + [NSMenu setMenuBarVisible:NO]; + /* Exec mono */ execve(args[0], args, environ); }