From 5fe1c28ae7a83445e6cce72a3e81c43337f912dc Mon Sep 17 00:00:00 2001 From: zonble Date: Wed, 19 Jan 2022 01:55:07 +0800 Subject: [PATCH] Converts main to Swift. --- McBopomofo.xcodeproj/project.pbxproj | 8 +- Source/main.m | 117 --------------------------- Source/main.swift | 109 +++++++++++++++++++++++++ 3 files changed, 113 insertions(+), 121 deletions(-) delete mode 100644 Source/main.m create mode 100644 Source/main.swift diff --git a/McBopomofo.xcodeproj/project.pbxproj b/McBopomofo.xcodeproj/project.pbxproj index 8293c7f4..36892a2a 100644 --- a/McBopomofo.xcodeproj/project.pbxproj +++ b/McBopomofo.xcodeproj/project.pbxproj @@ -9,7 +9,6 @@ /* Begin PBXBuildFile section */ 6A0D4EA715FC0D2D00ABF4B3 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6A0D4EA615FC0D2D00ABF4B3 /* Cocoa.framework */; }; 6A0D4ED215FC0D6400ABF4B3 /* InputMethodController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6A0D4EC715FC0D6400ABF4B3 /* InputMethodController.mm */; }; - 6A0D4ED315FC0D6400ABF4B3 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A0D4EC815FC0D6400ABF4B3 /* main.m */; }; 6A0D4F0815FC0DA600ABF4B3 /* Bopomofo.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 6A0D4EEF15FC0DA600ABF4B3 /* Bopomofo.tiff */; }; 6A0D4F0915FC0DA600ABF4B3 /* Bopomofo@2x.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 6A0D4EF015FC0DA600ABF4B3 /* Bopomofo@2x.tiff */; }; 6A0D4F4515FC0EB100ABF4B3 /* Mandarin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6A0D4F2015FC0EB100ABF4B3 /* Mandarin.cpp */; }; @@ -57,6 +56,7 @@ D44FB74727919D35003C80A6 /* EmacsKeyHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = D44FB74627919C83003C80A6 /* EmacsKeyHelper.swift */; }; D44FB74A2791B829003C80A6 /* VXHanConvert in Frameworks */ = {isa = PBXBuildFile; productRef = D44FB7492791B829003C80A6 /* VXHanConvert */; }; D44FB74D2792189A003C80A6 /* PhraseReplacementMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D44FB74B2792189A003C80A6 /* PhraseReplacementMap.cpp */; }; + D47B92C027972AD100458394 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = D47B92BF27972AC800458394 /* main.swift */; }; D47F7DCE278BFB57002F9DD7 /* PreferencesWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D47F7DCD278BFB57002F9DD7 /* PreferencesWindowController.swift */; }; D47F7DD0278C0897002F9DD7 /* NonModalAlertWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D47F7DCF278C0897002F9DD7 /* NonModalAlertWindowController.swift */; }; D47F7DD3278C1263002F9DD7 /* UserOverrideModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D47F7DD2278C1263002F9DD7 /* UserOverrideModel.cpp */; }; @@ -95,7 +95,6 @@ 6A0D4EAB15FC0D2D00ABF4B3 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 6A0D4EC615FC0D6400ABF4B3 /* InputMethodController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InputMethodController.h; sourceTree = ""; }; 6A0D4EC715FC0D6400ABF4B3 /* InputMethodController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = InputMethodController.mm; sourceTree = ""; }; - 6A0D4EC815FC0D6400ABF4B3 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 6A0D4EEF15FC0DA600ABF4B3 /* Bopomofo.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = Bopomofo.tiff; sourceTree = ""; }; 6A0D4EF015FC0DA600ABF4B3 /* Bopomofo@2x.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = "Bopomofo@2x.tiff"; sourceTree = ""; }; 6A0D4EF515FC0DA600ABF4B3 /* McBopomofo-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "McBopomofo-Info.plist"; sourceTree = ""; }; @@ -211,6 +210,7 @@ D44FB7482791B346003C80A6 /* VXHanConvert */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = VXHanConvert; path = Packages/VXHanConvert; sourceTree = ""; }; D44FB74B2792189A003C80A6 /* PhraseReplacementMap.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = PhraseReplacementMap.cpp; sourceTree = ""; }; D44FB74C2792189A003C80A6 /* PhraseReplacementMap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PhraseReplacementMap.h; sourceTree = ""; }; + D47B92BF27972AC800458394 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; D47F7DCD278BFB57002F9DD7 /* PreferencesWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesWindowController.swift; sourceTree = ""; }; D47F7DCF278C0897002F9DD7 /* NonModalAlertWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonModalAlertWindowController.swift; sourceTree = ""; }; D47F7DD1278C1263002F9DD7 /* UserOverrideModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserOverrideModel.h; sourceTree = ""; }; @@ -298,7 +298,7 @@ 6A0D4EC715FC0D6400ABF4B3 /* InputMethodController.mm */, D41355D6278D7409005E5CBD /* LanguageModelManager.h */, D41355D7278D7409005E5CBD /* LanguageModelManager.mm */, - 6A0D4EC815FC0D6400ABF4B3 /* main.m */, + D47B92BF27972AC800458394 /* main.swift */, D427F76B278CA1BA004A2160 /* AppDelegate.swift */, D44FB74427915555003C80A6 /* Preferences.swift */, D44FB74627919C83003C80A6 /* EmacsKeyHelper.swift */, @@ -695,8 +695,8 @@ files = ( D427F76C278CA2B0004A2160 /* AppDelegate.swift in Sources */, 6ACC3D442793701600F1B140 /* ParselessPhraseDB.cpp in Sources */, + D47B92C027972AD100458394 /* main.swift in Sources */, D44FB74727919D35003C80A6 /* EmacsKeyHelper.swift in Sources */, - 6A0D4ED315FC0D6400ABF4B3 /* main.m in Sources */, D44FB74D2792189A003C80A6 /* PhraseReplacementMap.cpp in Sources */, D44FB74527915565003C80A6 /* Preferences.swift in Sources */, D47F7DD0278C0897002F9DD7 /* NonModalAlertWindowController.swift in Sources */, diff --git a/Source/main.m b/Source/main.m deleted file mode 100644 index 18c2297e..00000000 --- a/Source/main.m +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright (c) 2011 and onwards The McBopomofo Authors. -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. - -#import -#import -@import InputSourceHelper; - -static NSString *const kConnectionName = @"McBopomofo_1_Connection"; - -int main(int argc, char *argv[]) -{ - @autoreleasepool { - - // register and enable the input source (along with all its input modes) - if (argc > 1 && !strcmp(argv[1], "install")) { - NSString *bundleID = [[NSBundle mainBundle] bundleIdentifier]; - NSURL *bundleURL = nil; - if ([[NSBundle mainBundle] respondsToSelector:@selector(bundleURL)]) { - // For Mac OS X 10.6+ - bundleURL = [[NSBundle mainBundle] bundleURL]; - } - else { - // For Mac OS X 10.5 - bundleURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]; - } - - TISInputSourceRef inputSource = [InputSourceHelper inputSourceForInputSourceID:bundleID]; - - // if this IME name is not found in the list of available IMEs - if (!inputSource) { - NSLog(@"Registering input source %@ at %@.", bundleID, [bundleURL absoluteString]); - // then register - BOOL status = [InputSourceHelper registerInputSource:bundleURL]; - - if (!status) { - NSLog(@"Fatal error: Cannot register input source %@ at %@.", bundleID, [bundleURL absoluteString]); - return -1; - } - - inputSource = [InputSourceHelper inputSourceForInputSourceID:bundleID]; - // if it still doesn't register successfully, bail. - if (!inputSource) { - NSLog(@"Fatal error: Cannot find input source %@ after registration.", bundleID); - return -1; - } - } - - // if it's not enabled, just enabled it - if (inputSource && ![InputSourceHelper inputSourceEnabled:inputSource]) { - NSLog(@"Enabling input source %@ at %@.", bundleID, [bundleURL absoluteString]); - BOOL status = [InputSourceHelper enableInputSource:inputSource]; - - if (!status) { - NSLog(@"Fatal error: Cannot enable input source %@.", bundleID); - return -1; - } - if (![InputSourceHelper inputSourceEnabled:inputSource]){ - NSLog(@"Fatal error: Cannot enable input source %@.", bundleID); - return -1; - } - } - - if (argc > 2 && !strcmp(argv[2], "--all")) { - BOOL enabled = [InputSourceHelper enableAllInputModesForInputSourceBundleID:bundleID]; - if (enabled) { - NSLog(@"All input sources enabled for %@", bundleID); - } - else { - NSLog(@"Cannot enable all input sources for %@, but this is ignored", bundleID); - } - } - - return 0; - } - - NSString *mainNibName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"NSMainNibFile"]; - if (!mainNibName) { - NSLog(@"Fatal error: NSMainNibFile key not defined in Info.plist."); - return -1; - } - - BOOL loadResult = [[NSBundle mainBundle] loadNibNamed:mainNibName owner:[NSApplication sharedApplication] topLevelObjects:NULL]; - if (!loadResult) { - NSLog(@"Fatal error: Cannot load %@.", mainNibName); - return -1; - } - - IMKServer *server = [[IMKServer alloc] initWithName:kConnectionName bundleIdentifier:[[NSBundle mainBundle] bundleIdentifier]]; - if (!server) { - NSLog(@"Fatal error: Cannot initialize input method server with connection %@.", kConnectionName); - return -1; - } - - [[NSApplication sharedApplication] run]; - } - return 0; -} diff --git a/Source/main.swift b/Source/main.swift new file mode 100644 index 00000000..6defc4fd --- /dev/null +++ b/Source/main.swift @@ -0,0 +1,109 @@ +// +// main.swift +// +// Copyright (c) 2011 The McBopomofo Project. +// +// Contributors: +// Mengjuei Hsieh (@mjhsieh) +// Weizhong Yang (@zonble) +// +// Based on the Syrup Project and the Formosana Library +// by Lukhnos Liu (@lukhnos). +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// + +import Cocoa +import InputMethodKit +import InputSourceHelper + +private func install() -> Int32 { + guard let bundleID = Bundle.main.bundleIdentifier else { + return -1 + } + let bundleUrl = Bundle.main.bundleURL + var inputSource = InputSourceHelper.inputSource(for: bundleID) + + if inputSource == nil { + NSLog("Registering input source \(bundleID) at \(bundleUrl.absoluteString)"); + // then register + let status = InputSourceHelper.registerTnputSource(at: bundleUrl) + + if !status { + NSLog("Fatal error: Cannot register input source \(bundleID) at \(bundleUrl.absoluteString).") + return -1 + } + + inputSource = InputSourceHelper.inputSource(for: bundleID) + } + + guard let inputSource = inputSource else { + NSLog("Fatal error: Cannot find input source \(bundleID) after registration.") + return -1 + } + + if !InputSourceHelper.inputSourceEnabled(for: inputSource) { + NSLog("Enabling input source \(bundleID) at \(bundleUrl.absoluteString).") + let status = InputSourceHelper.enable(inputSource: inputSource) + if !status { + NSLog("Fatal error: Cannot enable input source \(bundleID).") + return -1 + } + if !InputSourceHelper.inputSourceEnabled(for: inputSource) { + NSLog("Fatal error: Cannot enable input source \(bundleID).") + return -1 + } + } + + if CommandLine.arguments.count > 2 && CommandLine.arguments[2] == "--all" { + let enabled = InputSourceHelper.enableAllInputMode(for: bundleID) + NSLog(enabled ? "All input sources enabled for \(bundleID)" : "Cannot enable all input sources for \(bundleID), but this is ignored") + } + return 0 +} + +let kConnectionName = "McBopomofo_1_Connection" + +if CommandLine.arguments.count > 1 { + if CommandLine.arguments[1] == "install" { + let exitCode = install() + exit(exitCode) + } +} + +guard let mainNibName = Bundle.main.infoDictionary?["NSMainNibFile"] as? String else { + NSLog("Fatal error: NSMainNibFile key not defined in Info.plist."); + exit(-1) +} + +let loaded = Bundle.main.loadNibNamed(mainNibName, owner: NSApp, topLevelObjects: nil) +if !loaded { + NSLog("Fatal error: Cannot load \(mainNibName).") + exit(-1) +} + +guard let bundleID = Bundle.main.bundleIdentifier, let server = IMKServer(name: kConnectionName, bundleIdentifier: bundleID) else { + NSLog("Fatal error: Cannot initialize input method server with connection \(kConnectionName).") + exit(-1) +} + +NSApp.run()