diff --git a/Source/Installer/AppDelegate.h b/Source/Installer/AppDelegate.h index a1a30d9f..8f95771b 100644 --- a/Source/Installer/AppDelegate.h +++ b/Source/Installer/AppDelegate.h @@ -31,10 +31,14 @@ { @protected NSString *_installingVersion; - NSString *_currentVersion; + BOOL _upgrading; NSButton *_installButton; NSButton *_cancelButton; NSTextView *_textView; + NSWindow *_progressSheet; + NSProgressIndicator *_progressIndicator; + NSDate *_translocationRemovalStartTime; + NSInteger _currentVersionNumber; } - (IBAction)agreeAndInstallAction:(id)sender; - (IBAction)cancelAction:(id)sender; @@ -42,4 +46,6 @@ @property (assign) IBOutlet NSButton *installButton; @property (assign) IBOutlet NSButton *cancelButton; @property (assign) IBOutlet NSTextView *textView; +@property (assign) IBOutlet NSWindow *progressSheet; +@property (assign) IBOutlet NSProgressIndicator *progressIndicator; @end diff --git a/Source/Installer/AppDelegate.m b/Source/Installer/AppDelegate.m index a39d473b..b35d7cf2 100644 --- a/Source/Installer/AppDelegate.m +++ b/Source/Installer/AppDelegate.m @@ -26,6 +26,7 @@ // #import "AppDelegate.h" +#import static NSString *const kTargetBin = @"McBopomofo"; static NSString *const kTargetType = @"app"; @@ -34,49 +35,75 @@ static NSString *const kDestinationPartial = @"~/Library/Input Methods/"; static NSString *const kTargetPartialPath = @"~/Library/Input Methods/McBopomofo.app"; static NSString *const kTargetFullBinPartialPath = @"~/Library/Input Methods/McBopomofo.app/Contents/MacOS/McBopomofo"; +static const NSTimeInterval kTranslocationRemovalTickInterval = 0.5; +static const NSTimeInterval kTranslocationRemovalDeadline = 60.0; + @implementation AppDelegate @synthesize installButton = _installButton; @synthesize cancelButton = _cancelButton; @synthesize textView = _textView; +@synthesize progressSheet = _progressSheet; +@synthesize progressIndicator = _progressIndicator; - (void)dealloc { [_installingVersion release]; - [_currentVersion release]; + [_translocationRemovalStartTime release]; [super dealloc]; } - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { - [[self window] center]; - [[self window] orderFront:self]; - [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; + [self.cancelButton setNextKeyView:self.installButton]; + [self.installButton setNextKeyView:self.cancelButton]; + [[self window] setDefaultButtonCell:[self.installButton cell]]; NSAttributedString *attrStr = [[[NSAttributedString alloc] initWithRTF:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"License" ofType:@"rtf"]] documentAttributes:NULL] autorelease]; [[self.textView textStorage] setAttributedString:attrStr]; NSBundle *installingBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:kTargetBin ofType:kTargetType]]; - _installingVersion = [[[installingBundle infoDictionary] objectForKey:@"CFBundleShortVersionString"] retain]; - - [[self window] setTitle:[NSString stringWithFormat:NSLocalizedString(@"%@ (for version %@)", nil), [[self window] title], _installingVersion]]; + _installingVersion = [[[installingBundle infoDictionary] objectForKey:(id)kCFBundleVersionKey] retain]; + NSString *versionString = [[installingBundle infoDictionary] objectForKey:@"CFBundleShortVersionString"]; + + [[self window] setTitle:[NSString stringWithFormat:NSLocalizedString(@"%@ (for version %@, r%@)", nil), [[self window] title], versionString, _installingVersion]]; if ([[NSFileManager defaultManager] fileExistsAtPath:[kTargetPartialPath stringByExpandingTildeInPath]]) { NSBundle *currentBundle = [NSBundle bundleWithPath:[kTargetPartialPath stringByExpandingTildeInPath]]; - _currentVersion = [[[currentBundle infoDictionary] objectForKey:@"CFBundleShortVersionString"] retain]; + + NSString *shortVersion = [[currentBundle infoDictionary] objectForKey:@"CFBundleShortVersionString"]; + NSString *currentVersion = [[currentBundle infoDictionary] objectForKey:(id)kCFBundleVersionKey]; + + _currentVersionNumber = [currentVersion integerValue]; + if (shortVersion && currentVersion && [currentVersion compare:_installingVersion options:NSNumericSearch] == NSOrderedAscending) { + _upgrading = YES; + } } - - if (_currentVersion && [_currentVersion compare:_installingVersion] == NSOrderedAscending) { + + if (_upgrading) { [_installButton setTitle:NSLocalizedString(@"Agree and Upgrade", nil)]; } + + [[self window] center]; + [[self window] orderFront:self]; + [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; } - (IBAction)agreeAndInstallAction:(id)sender { [_cancelButton setEnabled:NO]; [_installButton setEnabled:NO]; - + [self removeThenInstallInputMethod]; +} + +- (void)removeThenInstallInputMethod +{ if ([[NSFileManager defaultManager] fileExistsAtPath:[kTargetPartialPath stringByExpandingTildeInPath]]) { + + BOOL shouldWaitForTranslocationRemoval = + [self appBundleTranslocatedToARandomizedPath:kTargetPartialPath] && + [self.window respondsToSelector:@selector(beginSheet:completionHandler:)]; + // http://www.cocoadev.com/index.pl?MoveToTrash NSString *sourceDir = [kDestinationPartial stringByExpandingTildeInPath]; NSString *trashDir = [NSHomeDirectory() stringByAppendingPathComponent:@".Trash"]; @@ -85,16 +112,50 @@ static NSString *const kTargetFullBinPartialPath = @"~/Library/Input Methods/McB [[NSWorkspace sharedWorkspace] performFileOperation:NSWorkspaceRecycleOperation source:sourceDir destination:trashDir files:[NSArray arrayWithObject:kTargetBundle] tag:&tag]; (void)tag; - // alno need to restart SystemUIServer to ensure that the icon is fully cleaned up - if (_currentVersion && [_currentVersion compare:@"0.9.4"] != NSOrderedDescending) { - NSTask *restartSystemUIServerTask = [NSTask launchedTaskWithLaunchPath:@"/usr/bin/killall" arguments:[NSArray arrayWithObjects: @"-9", @"SystemUIServer", nil]]; - [restartSystemUIServerTask waitUntilExit]; - } - NSTask *killTask = [NSTask launchedTaskWithLaunchPath:@"/usr/bin/killall" arguments:[NSArray arrayWithObjects: @"-9", kTargetBin, nil]]; [killTask waitUntilExit]; + + if (shouldWaitForTranslocationRemoval) { + [self.progressIndicator startAnimation:self]; + [self.window beginSheet:self.progressSheet completionHandler:^(NSModalResponse returnCode) { + // Schedule the install action in runloop so that the sheet gets a change to dismiss itself. + dispatch_async(dispatch_get_main_queue(), ^{ + if (returnCode == NSModalResponseContinue) { + [self installInputMethodWithWarning:NO]; + } else { + [self installInputMethodWithWarning:YES]; + } + }); + }]; + + [_translocationRemovalStartTime release]; + _translocationRemovalStartTime = [[NSDate date] retain]; + [NSTimer scheduledTimerWithTimeInterval:kTranslocationRemovalTickInterval target:self selector:@selector(timerTick:) userInfo:nil repeats:YES]; + return; + } } + [self installInputMethodWithWarning:NO]; +} + +- (void)timerTick:(NSTimer *)timer +{ + NSTimeInterval elapsed = [[NSDate date] timeIntervalSinceDate:_translocationRemovalStartTime]; + [self.progressIndicator setDoubleValue:MIN(elapsed / kTranslocationRemovalDeadline, 1.0)]; + + if (elapsed >= kTranslocationRemovalDeadline) { + [timer invalidate]; + [self.window endSheet:self.progressSheet returnCode:NSModalResponseCancel]; + } else if (![self appBundleTranslocatedToARandomizedPath:kTargetPartialPath]) { + [self.progressIndicator setDoubleValue:1.0]; + [timer invalidate]; + [self.window endSheet:self.progressSheet returnCode:NSModalResponseContinue]; + } +} + + +- (void)installInputMethodWithWarning:(BOOL)warning +{ NSTask *cpTask = [NSTask launchedTaskWithLaunchPath:@"/bin/cp" arguments:[NSArray arrayWithObjects:@"-R", [[NSBundle mainBundle] pathForResource:kTargetBin ofType:kTargetType], [kDestinationPartial stringByExpandingTildeInPath], nil]]; [cpTask waitUntilExit]; if ([cpTask terminationStatus] != 0) { @@ -103,19 +164,20 @@ static NSString *const kTargetFullBinPartialPath = @"~/Library/Input Methods/McB } NSArray *installArgs = [NSArray arrayWithObjects:@"install", nil]; - if (_currentVersion && [_currentVersion compare:@"0.9.4"] != NSOrderedDescending) { - installArgs = [installArgs arrayByAddingObject:@"--all"]; - } - NSTask *installTask = [NSTask launchedTaskWithLaunchPath:[kTargetFullBinPartialPath stringByExpandingTildeInPath] arguments:installArgs]; - [installTask waitUntilExit]; + [installTask waitUntilExit]; if ([installTask terminationStatus] != 0) { NSRunAlertPanel(NSLocalizedString(@"Install Failed", nil), NSLocalizedString(@"Cannot activate the input method.", nil), NSLocalizedString(@"Cancel", nil), nil, nil); [NSApp terminate:self]; } - NSRunAlertPanel(NSLocalizedString(@"Installation Successful", nil), NSLocalizedString(@"McBopomofo is ready to use.", nil), NSLocalizedString(@"OK", nil), nil, nil); - [NSApp terminate:self]; + if (warning) { + NSRunAlertPanel(NSLocalizedString(@"Attention", nil), NSLocalizedString(@"McBopomofo is upgraded, but please log out or reboot for the new version to be fully functional.", nil), NSLocalizedString(@"OK", nil), nil, nil); + } else { + NSRunAlertPanel(NSLocalizedString(@"Installation Successful", nil), NSLocalizedString(@"McBopomofo is ready to use.", nil), NSLocalizedString(@"OK", nil), nil, nil); + } + + [[NSApplication sharedApplication] performSelector:@selector(terminate:) withObject:self afterDelay:0.1]; } @@ -128,4 +190,22 @@ static NSString *const kTargetFullBinPartialPath = @"~/Library/Input Methods/McB { [NSApp terminate:self]; } + +// Determines if an app is translocated by Gatekeeper to a randomized path +// See https://weblog.rogueamoeba.com/2016/06/29/sierra-and-gatekeeper-path-randomization/ +- (BOOL)appBundleTranslocatedToARandomizedPath:(NSString *)bundle +{ + const char *bundleAbsPath = [[bundle stringByExpandingTildeInPath] UTF8String]; + int entryCount = getfsstat(NULL, 0, 0); + int entrySize = sizeof(struct statfs); + struct statfs *bufs = (struct statfs *)calloc(entryCount, entrySize); + entryCount = getfsstat(bufs, entryCount * entrySize, MNT_NOWAIT); + for (int i = 0; i < entryCount; i++) { + if (!strcmp(bundleAbsPath, bufs[i].f_mntfromname)) { + return YES; + } + } + return NO; + +} @end diff --git a/Source/Installer/en.lproj/Localizable.strings b/Source/Installer/en.lproj/Localizable.strings index 97c4125d..048ef949 100644 --- a/Source/Installer/en.lproj/Localizable.strings +++ b/Source/Installer/en.lproj/Localizable.strings @@ -25,3 +25,6 @@ /* No comment provided by engineer. */ "McBopomofo is ready to use." = "McBopomofo is ready to use."; +"Stopping the old version. This may take up to one minute…" = "Stopping the old version. This may take up to one minute…"; +"Attention" = "Attention"; +"McBopomofo is upgraded, but please log out or reboot for the new version to be fully functional." = "McBopomofo is upgraded, but please log out or reboot for the new version to be fully functional."; diff --git a/Source/Installer/en.lproj/MainMenu.xib b/Source/Installer/en.lproj/MainMenu.xib index 7ad5912e..3ced5670 100644 --- a/Source/Installer/en.lproj/MainMenu.xib +++ b/Source/Installer/en.lproj/MainMenu.xib @@ -1,995 +1,207 @@ - - - 1060 - 11E53 - 2549 - 1138.47 - 569.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 2549 - - - NSButton - NSButtonCell - NSCustomObject - NSMenu - NSMenuItem - NSScrollView - NSScroller - NSTextField - NSTextFieldCell - NSTextView - NSView - NSWindowTemplate - - - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - - NSApplication - - - FirstResponder - - - NSApplication - - - AMainMenu - - - - McBopomofo Installer - - 1048576 - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - submenuAction: - - McBopomofo Installer - - - - About Install McBopomofo - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Services - - 1048576 - 2147483647 - - - submenuAction: - - Services - - _NSServicesMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Hide Install McBopomofo - h - 1048576 - 2147483647 - - - - - - Hide Others - h - 1572864 - 2147483647 - - - - - - Show All - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Quit Install McBopomofo - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - File - - 1048576 - 2147483647 - - - submenuAction: - - File - - - - Close - w - 1048576 - 2147483647 - - - - - - - - - Edit - - 1048576 - 2147483647 - - - - - - Format - - 2147483647 - - - - - - View - - 1048576 - 2147483647 - - - - - - Window - - 1048576 - 2147483647 - - - - - - Help - - 2147483647 - - - - - _NSMainMenu - - - 3 - 2 - {{335, 390}, {640, 360}} - 1954021376 - McBopomofo Installer - NSWindow - - - - - 256 - - - - 256 - - - - 2304 - - - - 2322 - {583, 14} - - - - _NS:13 - - - - - - - - - - - - 134 - - - - 583 - 1 - - - 12261 - 0 - - - 3 - MQA - - - - 6 - System - selectedTextBackgroundColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 6 - System - selectedTextColor - - 3 - MAA - - - - - - - 1 - MCAwIDEAA - - - {8, -8} - 13 - - - - - - 1 - - 6 - {598, 10000000} - {223, 0} - - - - {{1, 1}, {583, 249}} - - - - _NS:11 - - - - {4, 5} - - 79691776 - - - - - - file://localhost/Applications/Xcode.app/Contents/SharedFrameworks/DVTKit.framework/Resources/DVTIbeamCursor.tiff - - - - - 3 - MCAwAA - - - - 4 - - - - 256 - {{584, 1}, {15, 249}} - - - - _NS:84 - - _doScroller: - 1 - 0.85256409645080566 - - - - -2147483392 - {{-100, -100}, {87, 18}} - - - - _NS:33 - 1 - - _doScroller: - 1 - 0.94565218687057495 - - - {{20, 60}, {600, 251}} - - - - _NS:9 - 133138 - - - - - - - 268 - {{460, 12}, {166, 32}} - - - - _NS:9 - YES - - 67239424 - 134217728 - Agree and Install - - LucidaGrande - 13 - 1044 - - _NS:9 - - -2038284033 - 129 - - - 200 - 25 - - - - - 268 - {{330, 12}, {130, 32}} - - - - _NS:9 - YES - - 67239424 - 134217728 - Cancel - - _NS:9 - - -2038284033 - 129 - - Gw - 200 - 25 - - - - - 268 - {{17, 323}, {559, 17}} - - - - _NS:1505 - YES - - 68288064 - 272630784 - Welcome to the McBopomofo Installer! Please read the following Software Licence: - - _NS:1505 - - - 6 - System - controlColor - - - - 6 - System - controlTextColor - - - - - - - 268 - {{17, 19}, {337, 17}} - - - - _NS:1505 - YES - - 68288064 - 272630784 - By installing the software I agree to the terms above. - - LucidaGrande - 11 - 3100 - - _NS:1505 - - - - - - - {640, 360} - - - - - {{0, 0}, {1440, 878}} - {10000000000000, 10000000000000} - NO - - - AppDelegate - - - NSFontManager - - - - - - - terminate: - - - - 449 - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - delegate - - - - 495 - - - - performClose: - - - - 193 - - - - hide: - - - - 367 - - - - hideOtherApplications: - - - - 368 - - - - unhideAllApplications: - - - - 370 - - - - delegate - - - - 706 - - - - window - - - - 532 - - - - textView - - - - 705 - - - - cancelAction: - - - - 707 - - - - agreeAndInstallAction: - - - - 708 - - - - installButton - - - - 709 - - - - cancelButton - - - - 710 - - - - - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 29 - - - - - - - - - - - - - - 19 - - - - - - 56 - - - - - - - - 217 - - - - - - 83 - - - - - - - - 81 - - - - - - - - 73 - - - - - 57 - - - - - - - - - - - - - - - - 58 - - - - - 134 - - - - - 150 - - - - - 136 - - - - - 144 - - - - - 236 - - - - - 131 - - - - - - - - 149 - - - - - 145 - - - - - 130 - - - - - 295 - - - - - - 371 - - - - - - - - 372 - - - - - - - - - - - - 375 - - - - - - 420 - - - - - 490 - - - - - - 494 - - - - - 536 - - - - - - - - - - 539 - - - - - 538 - - - - - 537 - - - - - 575 - - - - - - - - 576 - - - - - 592 - - - - - - - - 593 - - - - - 623 - - - - - - - - 624 - - - - - 688 - - - - - - - - 689 - - - - - - - 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.InterfaceBuilder.CocoaPlugin - 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.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{380, 496}, {480, 360}} - - 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.InterfaceBuilder.CocoaPlugin - 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.InterfaceBuilder.CocoaPlugin - 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.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - 710 - - - - - AppDelegate - NSObject - - window - NSWindow - - - window - - window - NSWindow - - - - IBProjectSource - ./Classes/AppDelegate.h - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - YES - 3 - - {11, 11} - {10, 3} - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Installer/zh-Hant.lproj/Localizable.strings b/Source/Installer/zh-Hant.lproj/Localizable.strings index 87214d52..97a971de 100644 --- a/Source/Installer/zh-Hant.lproj/Localizable.strings +++ b/Source/Installer/zh-Hant.lproj/Localizable.strings @@ -25,3 +25,6 @@ /* No comment provided by engineer. */ "McBopomofo is ready to use." = "小麥注音輸入法安裝成功"; +"Finish" = "結束"; +"Attention" = "請注意"; +"McBopomofo is upgraded, but please log out or reboot for the new version to be fully functional." = "McBopomofo 安裝完成,但建議您登出或重新開機,以便順利使用新版。"; diff --git a/Source/Installer/zh-Hant.lproj/MainMenu.xib b/Source/Installer/zh-Hant.lproj/MainMenu.xib index 9d51ddb8..acb07695 100644 --- a/Source/Installer/zh-Hant.lproj/MainMenu.xib +++ b/Source/Installer/zh-Hant.lproj/MainMenu.xib @@ -1,994 +1,207 @@ - - - 1060 - 11E53 - 2549 - 1138.47 - 569.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 2549 - - - NSButton - NSButtonCell - NSCustomObject - NSMenu - NSMenuItem - NSScrollView - NSScroller - NSTextField - NSTextFieldCell - NSTextView - NSView - NSWindowTemplate - - - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - - NSApplication - - - FirstResponder - - - NSApplication - - - AMainMenu - - - - 安裝小麥注音 - - 1048576 - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - submenuAction: - - 安裝小麥注音 - - - - 關於小麥注音安裝程式 - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - 服務 - - 1048576 - 2147483647 - - - submenuAction: - - 服務 - - _NSServicesMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - 隱藏小麥注音安裝程式 - h - 1048576 - 2147483647 - - - - - - 隱藏其他程式 - h - 1572864 - 2147483647 - - - - - - 顯示所有程式 - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - 離開小麥注音安裝程式 - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - 檔案 - - 1048576 - 2147483647 - - - submenuAction: - - 檔案 - - - - 關閉 - w - 1048576 - 2147483647 - - - - - - - - - Edit - - 1048576 - 2147483647 - - - - - - Format - - 2147483647 - - - - - - View - - 1048576 - 2147483647 - - - - - - Window - - 1048576 - 2147483647 - - - - - - Help - - 2147483647 - - - - - _NSMainMenu - - - 3 - 2 - {{335, 390}, {640, 360}} - 1954021376 - 小麥注音輸入法安裝程式 - NSWindow - - - - - 256 - - - - 256 - - - - 2304 - - - - 2322 - {583, 14} - - - - _NS:13 - - - - - - - - - - - - 134 - - - - 583 - 1 - - - 12261 - 0 - - - 3 - MQA - - - - 6 - System - selectedTextBackgroundColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 6 - System - selectedTextColor - - 3 - MAA - - - - - - - 1 - MCAwIDEAA - - - {8, -8} - 13 - - - - - - 1 - - 6 - {598, 10000000} - {223, 0} - - - - {{1, 1}, {583, 249}} - - - - _NS:11 - - - - {4, 5} - - 79691776 - - - - - - file://localhost/Applications/Xcode.app/Contents/SharedFrameworks/DVTKit.framework/Resources/DVTIbeamCursor.tiff - - - - - 3 - MCAwAA - - - - 4 - - - - 256 - {{584, 1}, {15, 249}} - - - - _NS:84 - - _doScroller: - 1 - 0.85256409645080566 - - - - -2147483392 - {{-100, -100}, {87, 18}} - - - - _NS:33 - 1 - - _doScroller: - 1 - 0.94565218687057495 - - - {{20, 60}, {600, 251}} - - - - _NS:9 - 133138 - - - - - - - 268 - {{460, 12}, {166, 32}} - - - _NS:9 - YES - - 67239424 - 134217728 - 同意安裝 - - LucidaGrande - 13 - 1044 - - _NS:9 - - -2038284033 - 129 - - - 200 - 25 - - - - - 268 - {{330, 12}, {130, 32}} - - - - _NS:9 - YES - - 67239424 - 134217728 - 取消 - - _NS:9 - - -2038284033 - 129 - - Gw - 200 - 25 - - - - - 268 - {{17, 323}, {559, 17}} - - - - _NS:1505 - YES - - 68288064 - 272630784 - 歡迎您安裝「小麥注音輸入法」!在安裝之前,請您閱讀本軟體的使用授權: - - _NS:1505 - - - 6 - System - controlColor - - - - 6 - System - controlTextColor - - - - - - - 268 - {{17, 19}, {337, 17}} - - - - _NS:1505 - YES - - 68288064 - 272630784 - 點選「同意安裝」,表示您同意本軟體的使用授權。 - - LucidaGrande - 11 - 3100 - - _NS:1505 - - - - - - - {640, 360} - - - - - {{0, 0}, {1440, 878}} - {10000000000000, 10000000000000} - NO - - - AppDelegate - - - NSFontManager - - - - - - - terminate: - - - - 449 - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - delegate - - - - 495 - - - - performClose: - - - - 193 - - - - hide: - - - - 367 - - - - hideOtherApplications: - - - - 368 - - - - unhideAllApplications: - - - - 370 - - - - delegate - - - - 706 - - - - window - - - - 532 - - - - textView - - - - 705 - - - - cancelAction: - - - - 707 - - - - agreeAndInstallAction: - - - - 708 - - - - installButton - - - - 709 - - - - cancelButton - - - - 710 - - - - - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 29 - - - - - - - - - - - - - - 19 - - - - - - 56 - - - - - - - - 217 - - - - - - 83 - - - - - - - - 81 - - - - - - - - 73 - - - - - 57 - - - - - - - - - - - - - - - - 58 - - - - - 134 - - - - - 150 - - - - - 136 - - - - - 144 - - - - - 236 - - - - - 131 - - - - - - - - 149 - - - - - 145 - - - - - 130 - - - - - 295 - - - - - - 371 - - - - - - - - 372 - - - - - - - - - - - - 375 - - - - - - 420 - - - - - 490 - - - - - - 494 - - - - - 536 - - - - - - - - - - 539 - - - - - 538 - - - - - 537 - - - - - 575 - - - - - - - - 576 - - - - - 592 - - - - - - - - 593 - - - - - 623 - - - - - - - - 624 - - - - - 688 - - - - - - - - 689 - - - - - - - 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.InterfaceBuilder.CocoaPlugin - 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.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{380, 496}, {480, 360}} - - 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.InterfaceBuilder.CocoaPlugin - 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.InterfaceBuilder.CocoaPlugin - 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.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - 710 - - - - - AppDelegate - NSObject - - window - NSWindow - - - window - - window - NSWindow - - - - IBProjectSource - ./Classes/AppDelegate.h - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - YES - 3 - - {11, 11} - {10, 3} - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +