diff --git a/Source/Data b/Source/Data index b5e6f15c198f87c4cf0227bc6d9b4346e86228a0..81eed557432fe6d7ba3246edea7f7f78626dde8f 160000 --- a/Source/Data +++ b/Source/Data @@ -1 +1 @@ -Subproject commit b5e6f15c198f87c4cf0227bc6d9b4346e86228a0 +Subproject commit 81eed557432fe6d7ba3246edea7f7f78626dde8f diff --git a/Source/Modules/ControllerModules/KeyHandler_Core.swift b/Source/Modules/ControllerModules/KeyHandler_Core.swift index 7124b2b9eda56f28afaba347063885cd8cd75978..ed01529dc6731f16aebaf1179ac24024eeabb0fe 100644 --- a/Source/Modules/ControllerModules/KeyHandler_Core.swift +++ b/Source/Modules/ControllerModules/KeyHandler_Core.swift @@ -127,15 +127,92 @@ public class KeyHandler { return arrResult } + /// 鞏固當前組字器游標上下文,防止在當前游標位置固化節點時給作業範圍以外的內容帶來不想要的變化。 + /// + /// 打比方說輸入法原廠詞庫內有「章太炎」一詞,你敲「章太炎」,然後想把「太」改成「泰」以使其變成「章泰炎」。 + /// **macOS 內建的注音輸入法不會在這個過程對這個詞除了「太」以外的部分有任何變動**, + /// 但所有 OV 系輸入法都對此有 Bug:會將這些部分全部重設為各自的讀音下的最高原始權重的漢字。 + /// 也就是說,選字之後的結果可能會變成「張泰言」。 + /// + /// - Remark: 類似的可以拿來測試的詞有「蔡依林」「周杰倫」。 + /// + /// 測試時請務必也測試「敲長句子、且這種詞在句子中間出現時」的情況。 + /// + /// 威注音輸入法截至 v1.9.3 SP2 版為止都受到上游的這個 Bug 的影響,且在 v1.9.4 版利用該函式修正了這個缺陷。 + /// 該修正必須搭配至少天權星組字引擎 v2.0.2 版方可生效。算法可能比較囉唆,但至少在常用情形下不會再發生該問題。 + /// - Parameter theCandidate: 要拿來覆寫的詞音配對。 + func consolidateCursorContext(with theCandidate: Megrez.Compositor.Candidate) { + let grid = compositor + var frontBoundaryEX = compositor.width - 1 + var rearBoundaryEX = 0 + if grid.overrideCandidate(theCandidate, at: actualCandidateCursor) { + guard let node = compositor.walkedNodes.findNode(at: actualCandidateCursor, target: &frontBoundaryEX) else { + return + } + rearBoundaryEX = max(0, frontBoundaryEX - node.keyArray.count) + } + + var frontBoundary = 0 + guard let node = compositor.walkedNodes.findNode(at: actualCandidateCursor, target: &frontBoundary) else { return } + // 這兩個參數都得 -1。之前單獨測試的時候發現會有位置偏移。 + var rearBoundary = min(max(0, frontBoundary - node.keyArray.count), rearBoundaryEX) // 防呆 + frontBoundary = max(min(frontBoundary, compositor.width), frontBoundaryEX) // 防呆。 + + let cursorBackup = compositor.cursor + while compositor.cursor > rearBoundary { compositor.jumpCursorBySpan(to: .rear) } + rearBoundary = min(compositor.cursor, rearBoundary) + compositor.cursor = cursorBackup // 游標歸位,再接著計算。 + while compositor.cursor < frontBoundary { compositor.jumpCursorBySpan(to: .front) } + frontBoundary = max(compositor.cursor, frontBoundary) + compositor.cursor = cursorBackup // 計算結束,游標歸位。 + + // 接下來獲取這個範圍內的媽的都不知道該怎麼講了。 + var nodeIndices = [Int]() // 僅作統計用。 + + var position = rearBoundary // 臨時統計用 + while position < frontBoundary { + guard let regionIndex = compositor.cursorRegionMap[position] else { + position += 1 + continue + } + if !nodeIndices.contains(regionIndex) { + nodeIndices.append(regionIndex) // 新增統計 + guard compositor.walkedNodes.count > regionIndex else { break } // 防呆 + let currentNode = compositor.walkedNodes[regionIndex] + guard currentNode.keyArray.count == currentNode.value.count else { + compositor.overrideCandidate(currentNode.currentPair, at: position) + position += currentNode.keyArray.count + continue + } + let values = currentNode.currentPair.value.map { String($0) } + for (subPosition, key) in currentNode.keyArray.enumerated() { + guard values.count > subPosition else { break } // 防呆,應該沒有發生的可能性 + let thePair = Megrez.Compositor.Candidate( + key: key, value: values[subPosition] + ) + compositor.overrideCandidate(thePair, at: position) + position += 1 + } + continue + } + position += 1 + } + } + /// 在組字器內,以給定之候選字(詞音配對)、來試圖在給定游標位置所在之處指定選字處理過程。 - /// 然後再將對應的節錨內的節點標記為「已經手動選字過」。 + /// 然後再將對應的節錨內的節點標記為「已經手動選字過」。我們稱之為「固化節點」。 /// - Parameters: /// - value: 給定之候選字(詞音配對)。 /// - respectCursorPushing: 若該選項為 true,則會在選字之後始終將游標推送至選字後的節錨的前方。 func fixNode(candidate: (String, String), respectCursorPushing: Bool = true) { - let actualCursor = actualCandidateCursor let theCandidate: Megrez.Compositor.Candidate = .init(key: candidate.0, value: candidate.1) - if !compositor.overrideCandidate(theCandidate, at: actualCursor, overrideType: .withHighScore) { return } + + /// 必須先鞏固當前組字器游標上下文。 + consolidateCursorContext(with: theCandidate) + + // 回到正常流程。 + + if !compositor.overrideCandidate(theCandidate, at: actualCandidateCursor) { return } let previousWalk = compositor.walkedNodes // 開始爬軌。 walk() diff --git a/Source/Modules/ControllerModules/ctlInputMethod_Core.swift b/Source/Modules/ControllerModules/ctlInputMethod_Core.swift index f050521ab8dc46de990a4193781ee5ce9a36000a..24744004213c1fc1e85f3c4a2d6199a3868f9f1f 100644 --- a/Source/Modules/ControllerModules/ctlInputMethod_Core.swift +++ b/Source/Modules/ControllerModules/ctlInputMethod_Core.swift @@ -111,10 +111,7 @@ class ctlInputMethod: IMKInputController { keyHandler.clear() // 這句不要砍,因為後面 handle State.Empty() 不一定執行。 keyHandler.ensureParser() - if #available(macOS 10.13, *) { - } else { - mgrPrefs.useIMKCandidateWindow = false // 防呆。macOS 10.11 用 IMK 選字窗會崩潰。 - } + mgrPrefs.fixOddPreferences() if isASCIIMode { if mgrPrefs.disableShiftTogglingAlphanumericalMode { diff --git a/Source/Modules/IMEModules/IME.swift b/Source/Modules/IMEModules/IME.swift index 6ae9fd733eff9db89016f1ecaf29f1441f72b78c..4e22a7bc8b080a738c51b60839d26978ae374e7b 100644 --- a/Source/Modules/IMEModules/IME.swift +++ b/Source/Modules/IMEModules/IME.swift @@ -102,7 +102,7 @@ public enum IME { // MARK: - System Dark Mode Status Detector. - static func isDarkMode() -> Bool { + static var isDarkMode: Bool { if #available(macOS 10.15, *) { let appearanceDescription = NSApplication.shared.effectiveAppearance.debugDescription .lowercased() diff --git a/Source/Modules/IMEModules/mgrPrefs.swift b/Source/Modules/IMEModules/mgrPrefs.swift index 59c8dd3a0edfbb9a81385f12c41058d65ab371db..e4b94b287a27a57cb5b9b64d52f2d2f7e3ee951e 100644 --- a/Source/Modules/IMEModules/mgrPrefs.swift +++ b/Source/Modules/IMEModules/mgrPrefs.swift @@ -280,6 +280,9 @@ public enum mgrPrefs { UserDefaults.standard.setDefault( mgrPrefs.upperCaseLetterKeyBehavior, forKey: UserDef.kUpperCaseLetterKeyBehavior.rawValue ) + UserDefaults.standard.setDefault( + mgrPrefs.disableShiftTogglingAlphanumericalMode, forKey: UserDef.kDisableShiftTogglingAlphanumericalMode.rawValue + ) // ----- @@ -399,6 +402,12 @@ public enum mgrPrefs { @UserDefault(key: UserDef.kUpperCaseLetterKeyBehavior.rawValue, defaultValue: 0) static var upperCaseLetterKeyBehavior: Int + @UserDefault(key: UserDef.kTogglingAlphanumericalModeWithLShift.rawValue, defaultValue: true) + static var togglingAlphanumericalModeWithLShift: Bool + + @UserDefault(key: UserDef.kDisableShiftTogglingAlphanumericalMode.rawValue, defaultValue: false) + static var disableShiftTogglingAlphanumericalMode: Bool + // MARK: - Settings (Tier 2) @UserDefault(key: UserDef.kUseIMKCandidateWindow.rawValue, defaultValue: false) @@ -415,14 +424,8 @@ public enum mgrPrefs { @UserDefault(key: UserDef.kShouldAlwaysUseShiftKeyAccommodation.rawValue, defaultValue: false) static var shouldAlwaysUseShiftKeyAccommodation: Bool - @UserDefault(key: UserDef.kDisableShiftTogglingAlphanumericalMode.rawValue, defaultValue: false) - static var disableShiftTogglingAlphanumericalMode: Bool - // MARK: - Settings (Tier 3) - @UserDefault(key: UserDef.kTogglingAlphanumericalModeWithLShift.rawValue, defaultValue: true) - static var togglingAlphanumericalModeWithLShift: Bool - static var minCandidateLength: Int { mgrPrefs.allowBoostingSingleKanjiAsUserPhrase ? 1 : 2 } @@ -466,33 +469,44 @@ public enum mgrPrefs { } @UserDefault(key: UserDef.kChineseConversionEnabled.rawValue, defaultValue: false) - static var chineseConversionEnabled: Bool + static var chineseConversionEnabled: Bool { + didSet { + // 康熙轉換與 JIS 轉換不能同時開啟,否則會出現某些奇奇怪怪的情況 + if chineseConversionEnabled, shiftJISShinjitaiOutputEnabled { + toggleShiftJISShinjitaiOutputEnabled() + UserDefaults.standard.set( + shiftJISShinjitaiOutputEnabled, forKey: UserDef.kShiftJISShinjitaiOutputEnabled.rawValue + ) + } + UserDefaults.standard.set( + chineseConversionEnabled, forKey: UserDef.kChineseConversionEnabled.rawValue + ) + } + } @discardableResult static func toggleChineseConversionEnabled() -> Bool { chineseConversionEnabled = !chineseConversionEnabled - // 康熙轉換與 JIS 轉換不能同時開啟,否則會出現某些奇奇怪怪的情況 - if chineseConversionEnabled, shiftJISShinjitaiOutputEnabled { - toggleShiftJISShinjitaiOutputEnabled() + return chineseConversionEnabled + } + + @UserDefault(key: UserDef.kShiftJISShinjitaiOutputEnabled.rawValue, defaultValue: false) + static var shiftJISShinjitaiOutputEnabled: Bool { + didSet { + // 康熙轉換與 JIS 轉換不能同時開啟,否則會出現某些奇奇怪怪的情況 + if shiftJISShinjitaiOutputEnabled, chineseConversionEnabled { + toggleChineseConversionEnabled() + UserDefaults.standard.set( + chineseConversionEnabled, forKey: UserDef.kChineseConversionEnabled.rawValue + ) + } UserDefaults.standard.set( shiftJISShinjitaiOutputEnabled, forKey: UserDef.kShiftJISShinjitaiOutputEnabled.rawValue ) } - UserDefaults.standard.set(chineseConversionEnabled, forKey: UserDef.kChineseConversionEnabled.rawValue) - return chineseConversionEnabled } - @UserDefault(key: UserDef.kShiftJISShinjitaiOutputEnabled.rawValue, defaultValue: false) - static var shiftJISShinjitaiOutputEnabled: Bool - @discardableResult static func toggleShiftJISShinjitaiOutputEnabled() -> Bool { shiftJISShinjitaiOutputEnabled = !shiftJISShinjitaiOutputEnabled - // 康熙轉換與 JIS 轉換不能同時開啟,否則會出現某些奇奇怪怪的情況 - if shiftJISShinjitaiOutputEnabled, chineseConversionEnabled { - toggleChineseConversionEnabled() - } - UserDefaults.standard.set( - shiftJISShinjitaiOutputEnabled, forKey: UserDef.kShiftJISShinjitaiOutputEnabled.rawValue - ) return shiftJISShinjitaiOutputEnabled } @@ -664,6 +678,21 @@ public enum mgrPrefs { static var usingHotKeyCurrencyNumerals: Bool } +// MARK: Auto parameter fix procedures, executed everytime on ctlInputMethod.activateServer(). + +extension mgrPrefs { + static func fixOddPreferences() { + // 防呆。macOS 10.11 用 IMK 選字窗會崩潰。 + if #unavailable(macOS 10.13) { mgrPrefs.useIMKCandidateWindow = false } + if #unavailable(macOS 10.15) { + handleDefaultCandidateFontsByLangIdentifier = false + shouldAlwaysUseShiftKeyAccommodation = false + disableShiftTogglingAlphanumericalMode = false + togglingAlphanumericalModeWithLShift = false + } + } +} + // MARK: Snapshot Extension var snapshot: [String: Any]? diff --git a/Source/Modules/LangModelRelated/SubLMs/lmUserOverride.swift b/Source/Modules/LangModelRelated/SubLMs/lmUserOverride.swift index 1b1e8a02b69a8ab8e47e675ca532a2af48be47a4..afda1f2aa73e0188df6262abab00defa75891324 100644 --- a/Source/Modules/LangModelRelated/SubLMs/lmUserOverride.swift +++ b/Source/Modules/LangModelRelated/SubLMs/lmUserOverride.swift @@ -223,34 +223,6 @@ extension Array where Element == Megrez.Compositor.Node { } return counter } - - public func findNode(at cursor: Int, target outCursorPastNode: inout Int) -> Megrez.Compositor.Node? { - guard !isEmpty else { return nil } - let cursor = Swift.max(0, Swift.min(cursor, keys.count)) - - if cursor == 0, let theFirst = first { - outCursorPastNode = theFirst.spanLength - return theFirst - } - - // 同時應對「游標在右端」與「游標離右端還差一個位置」的情形。 - if cursor >= keys.count - 1, let theLast = last { - outCursorPastNode = keys.count - return theLast - } - - var accumulated = 0 - for neta in self { - accumulated += neta.spanLength - if accumulated > cursor { - outCursorPastNode = accumulated - return neta - } - } - - // 下述情形本不應該出現。 - return nil - } } // MARK: - Private Methods diff --git a/Source/Modules/LanguageParsers/Megrez/1_Compositor.swift b/Source/Modules/LanguageParsers/Megrez/1_Compositor.swift index 9d0be5063807efef2c3987126a4212a2b4da600c..078fdf97c3230e14f837e0f87802c29274c42908 100644 --- a/Source/Modules/LanguageParsers/Megrez/1_Compositor.swift +++ b/Source/Modules/LanguageParsers/Megrez/1_Compositor.swift @@ -13,7 +13,7 @@ extension Megrez { /// 簡單的貝氏推論:因為底層的語言模組只會提供單元圖資料。一旦將所有可以組字的單元圖 /// 作為節點塞到組字器內,就可以用一個簡單的有向無環圖爬軌過程、來利用這些隱性資料值 /// 算出最大相似估算結果。 - public class Compositor { + public struct Compositor { /// 就文字輸入方向而言的方向。 public enum TypingDirection { case front, rear } /// 軌格增減行為。 @@ -51,7 +51,7 @@ extension Megrez { self.separator = separator } - public func clear() { + public mutating func clear() { cursor = 0 keys.removeAll() spans.removeAll() @@ -62,7 +62,7 @@ extension Megrez { /// 在游標位置插入給定的索引鍵。 /// - Parameter key: 要插入的索引鍵。 /// - Returns: 該操作是否成功執行。 - @discardableResult public func insertKey(_ key: String) -> Bool { + @discardableResult public mutating func insertKey(_ key: String) -> Bool { guard !key.isEmpty, key != separator, langModel.hasUnigramsFor(key: key) else { return false } keys.insert(key, at: cursor) resizeGrid(at: cursor, do: .expand) @@ -77,7 +77,7 @@ extension Megrez { /// 如果是朝著與文字輸入方向相反的方向砍的話,游標位置會自動遞減。 /// - Parameter direction: 指定方向(相對於文字輸入方向而言)。 /// - Returns: 該操作是否成功執行。 - @discardableResult public func dropKey(direction: TypingDirection) -> Bool { + @discardableResult public mutating func dropKey(direction: TypingDirection) -> Bool { let isBackSpace: Bool = direction == .rear ? true : false guard cursor != (isBackSpace ? 0 : keys.count) else { return false } keys.remove(at: cursor - (isBackSpace ? 1 : 0)) @@ -90,7 +90,7 @@ extension Megrez { /// 按幅位來前後移動游標。 /// - Parameter direction: 移動方向。 /// - Returns: 該操作是否順利完成。 - @discardableResult public func jumpCursorBySpan(to direction: TypingDirection) -> Bool { + @discardableResult public mutating func jumpCursorBySpan(to direction: TypingDirection) -> Bool { switch direction { case .front: if cursor == width { return false } @@ -158,7 +158,7 @@ extension Megrez.Compositor { /// - Parameters: /// - location: 給定的幅位座標。 /// - action: 指定是擴張還是縮減一個幅位。 - func resizeGrid(at location: Int, do action: ResizeBehavior) { + mutating func resizeGrid(at location: Int, do action: ResizeBehavior) { let location = max(min(location, spans.count), 0) // 防呆 switch action { case .expand: @@ -255,7 +255,7 @@ extension Megrez.Compositor { } } - func updateCursorJumpingTables(_ walkedNodes: [Node]) { + mutating func updateCursorJumpingTables(_ walkedNodes: [Node]) { var cursorRegionMapDict = [Int: Int]() cursorRegionMapDict[-1] = 0 // 防呆 var counter = 0 diff --git a/Source/Modules/LanguageParsers/Megrez/2_Walker.swift b/Source/Modules/LanguageParsers/Megrez/2_Walker.swift index b7f4b091856594890d3f03aa7b18bf7efcc7dcc4..385f837a8455f646e0493e262ad185a2aff47826 100644 --- a/Source/Modules/LanguageParsers/Megrez/2_Walker.swift +++ b/Source/Modules/LanguageParsers/Megrez/2_Walker.swift @@ -11,7 +11,7 @@ extension Megrez.Compositor { /// 對於 `G = (V, E)`,該算法的運行次數為 `O(|V|+|E|)`,其中 `G` 是一個有向無環圖。 /// 這意味著,即使軌格很大,也可以用很少的算力就可以爬軌。 /// - Returns: 爬軌結果+該過程是否順利執行。 - @discardableResult public func walk() -> ([Node], Bool) { + @discardableResult public mutating func walk() -> ([Node], Bool) { var result = [Node]() defer { walkedNodes = result diff --git a/Source/Modules/LanguageParsers/Megrez/3_Candidate.swift b/Source/Modules/LanguageParsers/Megrez/3_Candidate.swift index 2e57e6cd94ad7149b652c783f40ccf1bfab2c0bb..2b1c46b5432c2f10dfaac8156e2db98a52e0a64b 100644 --- a/Source/Modules/LanguageParsers/Megrez/3_Candidate.swift +++ b/Source/Modules/LanguageParsers/Megrez/3_Candidate.swift @@ -144,13 +144,17 @@ extension Megrez.Compositor { guard let overridden = overridden else { return false } // 啥也不覆寫。 for i in overridden.spanIndex..bc」的爬軌途徑(尤其是當 A 和 B 使用「0」作為複寫數值的情況下)。這樣 /// 一來,「A-B」就不一定始終會是爬軌函式的青睞結果了。所以,這裡一定要用大於 0 的 /// 數(比如野獸常數),以讓「c」更容易單獨被選中。 - public static let kOverridingScore: Double = 114_514 + public var overridingScore: Double = 114_514 private(set) var key: String private(set) var keyArray: [String] @@ -81,7 +81,7 @@ extension Megrez.Compositor { public var score: Double { guard !unigrams.isEmpty else { return 0 } switch overrideType { - case .withHighScore: return Megrez.Compositor.Node.kOverridingScore + case .withHighScore: return overridingScore case .withTopUnigramScore: return unigrams[0].score default: return currentUnigram.score } @@ -139,4 +139,45 @@ extension Array where Element == Megrez.Compositor.Node { /// 從一個節點陣列當中取出目前的索引鍵陣列。 public var keys: [String] { map(\.key) } + + /// 在陣列內以給定游標位置找出對應的節點。 + /// - Parameters: + /// - cursor: 給定游標位置。 + /// - outCursorPastNode: 找出的節點的前端位置。 + /// - Returns: 查找結果。 + public func findNode(at cursor: Int, target outCursorPastNode: inout Int) -> Megrez.Compositor.Node? { + guard !isEmpty else { return nil } + let cursor = Swift.max(0, Swift.min(cursor, keys.count)) + + if cursor == 0, let theFirst = first { + outCursorPastNode = theFirst.spanLength + return theFirst + } + + // 同時應對「游標在右端」與「游標離右端還差一個位置」的情形。 + if cursor >= keys.count - 1, let theLast = last { + outCursorPastNode = keys.count + return theLast + } + + var accumulated = 0 + for neta in self { + accumulated += neta.spanLength + if accumulated > cursor { + outCursorPastNode = accumulated + return neta + } + } + + // 下述情形本不應該出現。 + return nil + } + + /// 在陣列內以給定游標位置找出對應的節點。 + /// - Parameter cursor: 給定游標位置。 + /// - Returns: 查找結果。 + public func findNode(at cursor: Int) -> Megrez.Compositor.Node? { + var useless = 0 + return findNode(at: cursor, target: &useless) + } } diff --git a/Source/Modules/UIModules/CandidateUI/ctlCandidateUniversal.swift b/Source/Modules/UIModules/CandidateUI/ctlCandidateUniversal.swift index e25ada9d71837981445b8e828ca161f7b1725044..8acc32dccc4e463285e4ed044ee2a99d400690f3 100644 --- a/Source/Modules/UIModules/CandidateUI/ctlCandidateUniversal.swift +++ b/Source/Modules/UIModules/CandidateUI/ctlCandidateUniversal.swift @@ -135,6 +135,43 @@ private class vwrCandidateUniversal: NSView { cellPadding = ceil(biggestSize / 4.0) * 2 } + func ensureLangIdentifier(for attr: inout [NSAttributedString.Key: AnyObject]) { + if mgrPrefs.handleDefaultCandidateFontsByLangIdentifier { + switch IME.currentInputMode { + case InputMode.imeModeCHS: + if #available(macOS 12.0, *) { + attr[.languageIdentifier] = "zh-Hans" as AnyObject + } + case InputMode.imeModeCHT: + if #available(macOS 12.0, *) { + attr[.languageIdentifier] = + (mgrPrefs.shiftJISShinjitaiOutputEnabled || mgrPrefs.chineseConversionEnabled) + ? "ja" as AnyObject : "zh-Hant" as AnyObject + } + default: + break + } + } + } + + var highlightedColor: NSColor { + var result = NSColor.alternateSelectedControlColor + var colorBlendAmount: CGFloat = IME.isDarkMode ? 0.3 : 0.0 + if #available(macOS 10.14, *), !IME.isDarkMode, IME.currentInputMode == .imeModeCHT { + colorBlendAmount = 0.15 + } + // The background color of the highlightened candidate + switch IME.currentInputMode { + case InputMode.imeModeCHS: + result = NSColor.systemRed + case InputMode.imeModeCHT: + result = NSColor.systemBlue + default: break + } + let blendingAgainstTarget: NSColor = IME.isDarkMode ? NSColor.black : NSColor.white + return result.blended(withFraction: colorBlendAmount, of: blendingAgainstTarget)! + } + override func draw(_: NSRect) { let bounds = bounds NSColor.controlBackgroundColor.setFill() // Candidate list panel base background @@ -161,24 +198,7 @@ private class vwrCandidateUniversal: NSView { var activeCandidateIndexAttr = keyLabelAttrDict var activeCandidateAttr = candidateAttrDict if index == highlightedIndex { - let colorBlendAmount: CGFloat = IME.isDarkMode() ? 0.3 : 0 - // The background color of the highlightened candidate - switch IME.currentInputMode { - case InputMode.imeModeCHS: - NSColor.systemRed.blended( - withFraction: colorBlendAmount, - of: NSColor.black - )! - .setFill() - case InputMode.imeModeCHT: - NSColor.systemBlue.blended( - withFraction: colorBlendAmount, - of: NSColor.black - )! - .setFill() - default: - NSColor.alternateSelectedControlColor.setFill() - } + highlightedColor.setFill() // Highlightened index text color activeCandidateIndexAttr[.foregroundColor] = NSColor.selectedMenuItemTextColor .withAlphaComponent(0.84) @@ -187,22 +207,7 @@ private class vwrCandidateUniversal: NSView { let path: NSBezierPath = .init(roundedRect: rctCandidateArea, xRadius: 6, yRadius: 6) path.fill() } - if mgrPrefs.handleDefaultCandidateFontsByLangIdentifier { - switch IME.currentInputMode { - case InputMode.imeModeCHS: - if #available(macOS 12.0, *) { - activeCandidateAttr[.languageIdentifier] = "zh-Hans" as AnyObject - } - case InputMode.imeModeCHT: - if #available(macOS 12.0, *) { - activeCandidateAttr[.languageIdentifier] = - (mgrPrefs.shiftJISShinjitaiOutputEnabled || mgrPrefs.chineseConversionEnabled) - ? "ja" as AnyObject : "zh-Hant" as AnyObject - } - default: - break - } - } + ensureLangIdentifier(for: &activeCandidateAttr) (keyLabels[index] as NSString).draw( in: rctLabel, withAttributes: activeCandidateIndexAttr ) @@ -232,24 +237,7 @@ private class vwrCandidateUniversal: NSView { var activeCandidateIndexAttr = keyLabelAttrDict var activeCandidateAttr = candidateAttrDict if index == highlightedIndex { - let colorBlendAmount: CGFloat = IME.isDarkMode() ? 0.3 : 0 - // The background color of the highlightened candidate - switch IME.currentInputMode { - case InputMode.imeModeCHS: - NSColor.systemRed.blended( - withFraction: colorBlendAmount, - of: NSColor.black - )! - .setFill() - case InputMode.imeModeCHT: - NSColor.systemBlue.blended( - withFraction: colorBlendAmount, - of: NSColor.black - )! - .setFill() - default: - NSColor.alternateSelectedControlColor.setFill() - } + highlightedColor.setFill() // Highlightened index text color activeCandidateIndexAttr[.foregroundColor] = NSColor.selectedMenuItemTextColor .withAlphaComponent(0.84) @@ -258,22 +246,7 @@ private class vwrCandidateUniversal: NSView { let path: NSBezierPath = .init(roundedRect: rctCandidateArea, xRadius: 6, yRadius: 6) path.fill() } - if mgrPrefs.handleDefaultCandidateFontsByLangIdentifier { - switch IME.currentInputMode { - case InputMode.imeModeCHS: - if #available(macOS 12.0, *) { - activeCandidateAttr[.languageIdentifier] = "zh-Hans" as AnyObject - } - case InputMode.imeModeCHT: - if #available(macOS 12.0, *) { - activeCandidateAttr[.languageIdentifier] = - (mgrPrefs.shiftJISShinjitaiOutputEnabled || mgrPrefs.chineseConversionEnabled) - ? "ja" as AnyObject : "zh-Hant" as AnyObject - } - default: - break - } - } + ensureLangIdentifier(for: &activeCandidateAttr) (keyLabels[index] as NSString).draw( in: rctLabel, withAttributes: activeCandidateIndexAttr ) diff --git a/Source/Modules/UIModules/PrefUI/suiPrefPaneDevZone.swift b/Source/Modules/UIModules/PrefUI/suiPrefPaneDevZone.swift index c6639bb1f2e406e3bb0f6132e2ca12f087c74ab7..0de10a9d22cb67f75fb6b851fc8b14a1360ae820 100644 --- a/Source/Modules/UIModules/PrefUI/suiPrefPaneDevZone.swift +++ b/Source/Modules/UIModules/PrefUI/suiPrefPaneDevZone.swift @@ -16,8 +16,6 @@ struct suiPrefPaneDevZone: View { forKey: UserDef.kHandleDefaultCandidateFontsByLangIdentifier.rawValue) @State private var selShouldAlwaysUseShiftKeyAccommodation: Bool = UserDefaults.standard.bool( forKey: UserDef.kShouldAlwaysUseShiftKeyAccommodation.rawValue) - @State private var selDisableShiftTogglingAlphanumericalMode: Bool = UserDefaults.standard.bool( - forKey: UserDef.kDisableShiftTogglingAlphanumericalMode.rawValue) private let contentWidth: Double = { switch mgrPrefs.appleLanguages[0] { case "ja": @@ -72,12 +70,6 @@ struct suiPrefPaneDevZone: View { ) ) .preferenceDescription().fixedSize(horizontal: false, vertical: true) - Toggle( - LocalizedStringKey("Completely disable using Shift key to toggling alphanumerical mode"), - isOn: $selDisableShiftTogglingAlphanumericalMode.onChange { - mgrPrefs.disableShiftTogglingAlphanumericalMode = selDisableShiftTogglingAlphanumericalMode - } - ) } } } diff --git a/Source/Modules/UIModules/PrefUI/suiPrefPaneExperience.swift b/Source/Modules/UIModules/PrefUI/suiPrefPaneExperience.swift index 0c209b30529adbe2a3d689dd845135a1d09fc247..463d90b73cd737985ecdb50c06077803d8bf2133 100644 --- a/Source/Modules/UIModules/PrefUI/suiPrefPaneExperience.swift +++ b/Source/Modules/UIModules/PrefUI/suiPrefPaneExperience.swift @@ -36,6 +36,8 @@ struct suiPrefPaneExperience: View { forKey: UserDef.kTogglingAlphanumericalModeWithLShift.rawValue) @State private var selUpperCaseLetterKeyBehavior = UserDefaults.standard.integer( forKey: UserDef.kUpperCaseLetterKeyBehavior.rawValue) + @State private var selDisableShiftTogglingAlphanumericalMode: Bool = UserDefaults.standard.bool( + forKey: UserDef.kDisableShiftTogglingAlphanumericalMode.rawValue) private let contentWidth: Double = { switch mgrPrefs.appleLanguages[0] { case "ja": @@ -149,6 +151,12 @@ struct suiPrefPaneExperience: View { isOn: $selTogglingAlphanumericalModeWithLShift.onChange { mgrPrefs.togglingAlphanumericalModeWithLShift = selTogglingAlphanumericalModeWithLShift } + ).disabled(mgrPrefs.disableShiftTogglingAlphanumericalMode == true) + Toggle( + LocalizedStringKey("Completely disable using Shift key to toggling alphanumerical mode"), + isOn: $selDisableShiftTogglingAlphanumericalMode.onChange { + mgrPrefs.disableShiftTogglingAlphanumericalMode = selDisableShiftTogglingAlphanumericalMode + } ) Toggle( LocalizedStringKey("Allow backspace-editing miscomposed readings"), diff --git a/Source/Modules/UIModules/PrefUI/suiPrefPaneGeneral.swift b/Source/Modules/UIModules/PrefUI/suiPrefPaneGeneral.swift index 505ad520879158a189005fc17d21fd2487cfafc4..ace615c3e33e37f44d9c05df5bdee2ebe45153d3 100644 --- a/Source/Modules/UIModules/PrefUI/suiPrefPaneGeneral.swift +++ b/Source/Modules/UIModules/PrefUI/suiPrefPaneGeneral.swift @@ -133,20 +133,14 @@ struct suiPrefPaneGeneral: View { LocalizedStringKey("Auto-convert traditional Chinese glyphs to KangXi characters"), isOn: $selEnableKanjiConvToKangXi.onChange { mgrPrefs.chineseConversionEnabled = selEnableKanjiConvToKangXi - if selEnableKanjiConvToKangXi { - mgrPrefs.shiftJISShinjitaiOutputEnabled = !selEnableKanjiConvToKangXi - selEnableKanjiConvToJIS = !selEnableKanjiConvToKangXi - } + selEnableKanjiConvToJIS = mgrPrefs.shiftJISShinjitaiOutputEnabled } ) Toggle( LocalizedStringKey("Auto-convert traditional Chinese glyphs to JIS Shinjitai characters"), isOn: $selEnableKanjiConvToJIS.onChange { mgrPrefs.shiftJISShinjitaiOutputEnabled = selEnableKanjiConvToJIS - if selEnableKanjiConvToJIS { - mgrPrefs.chineseConversionEnabled = !selEnableKanjiConvToJIS - selEnableKanjiConvToKangXi = !selEnableKanjiConvToJIS - } + selEnableKanjiConvToKangXi = mgrPrefs.chineseConversionEnabled } ) Toggle( diff --git a/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib b/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib index 1f8b3a0b53ba971d2167618929cd5478b074c250..65a6875260c63162b862c02161ceb4326482b627 100644 --- a/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib +++ b/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib @@ -1,8 +1,8 @@ - + - + @@ -344,11 +344,11 @@ - + - + @@ -356,7 +356,7 @@ - + @@ -375,7 +375,7 @@ - + @@ -383,7 +383,7 @@ - + @@ -391,7 +391,7 @@ - + @@ -416,7 +416,7 @@ - + @@ -434,7 +434,7 @@ - + @@ -442,7 +442,7 @@ - - + @@ -520,7 +510,7 @@ - + @@ -547,7 +537,7 @@ - + @@ -572,7 +562,7 @@ - + @@ -613,8 +603,6 @@ - - @@ -652,9 +640,8 @@ - - + @@ -1057,11 +1044,11 @@ - + - + Warning: This page is for testing future features. @@ -1071,10 +1058,10 @@ Features listed here may not work as expected. - + - - - - - - - - - - + - + - + - This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later. @@ -1124,24 +1089,18 @@ Features listed here may not work as expected. - - - - - + + - + + - - - - - + diff --git a/Source/WindowNIBs/en.lproj/frmPrefWindow.strings b/Source/WindowNIBs/en.lproj/frmPrefWindow.strings index 9be7c456d1b10e67899c9b0180ea991691af59ae..6becf982d84af80eb4dc50d23ab531c094040961 100644 --- a/Source/WindowNIBs/en.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/en.lproj/frmPrefWindow.strings @@ -45,7 +45,6 @@ "chkAutoCorrectReadingCombination.title" = "Automatically correct reading combinations when typing"; "chkFetchSuggestionsFromUserOverrideModel.title" = "Applying typing suggestions from half-life user override model"; "chkKeepReadingUponCompositionError.title" = "Allow backspace-editing miscomposed readings"; -"chkTogglingAlphanumericalModeWithLShift.title" = "Also toggle alphanumerical mode with Left-Shift"; "chkUseFixecCandidateOrderOnSelection.title" = "Always use fixed listing order in candidate window"; "DbW-eq-ZdB.title" = "Starlight"; "dIN-TZ-67g.title" = "Space to +cycle candidates, Shift+Space to +cycle pages"; @@ -63,7 +62,6 @@ "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; -"lblDevZoneCandidateFont.title" = "This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later."; "lblDevZoneIMKCandidate.title" = "IMK candidate window is plagued with issues like failed selection keys."; "lblDevZoneTitleDescription.title" = "Warning: This page is for testing future features. \nFeatures listed here may not work as expected."; "lblUpperCaseLetterKeyBehavior.title" = "Choose the behavior of Shift+Letter key with letter inputs."; @@ -81,7 +79,6 @@ "rVQ-Hx-cGi.title" = "Japanese"; "s7u-Fm-dVg.title" = "Cycling Pages"; "shc-Nu-UsM.title" = "Show page buttons in candidate list"; -"tglDevZoneCandidateFont.title" = "Use .langIdentifier to handle UI fonts in candidate window"; "tglDevZoneIMKCandidate.title" = "Use IMK Candidate Window instead (will reboot the IME)"; "TXr-FF-ehw.title" = "Traditional Chinese"; "ueU-Rz-a1C.title" = "Choose the behavior of (Shift+)Tab key in the candidate window."; diff --git a/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings b/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings index 160876a7866c5c7ab4cd82d211d24565b8d6cfc0..5b598da46a05e8a23d4649abf606f25f7afeb000 100644 --- a/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings @@ -45,7 +45,6 @@ "chkAutoCorrectReadingCombination.title" = "入力中で打ち間違った発音組み合わせを自動的に訂正する"; "chkFetchSuggestionsFromUserOverrideModel.title" = "入力中で臨時記憶モジュールからお薦めの候補を自動的に選ぶ"; "chkKeepReadingUponCompositionError.title" = "効かぬ音読みを BackSpace で再編集"; -"chkTogglingAlphanumericalModeWithLShift.title" = "左側の Shift キーでも英数入力モードの切り替え"; "chkUseFixecCandidateOrderOnSelection.title" = "候補文字を固定順番で陳列する"; "DbW-eq-ZdB.title" = "星光"; "dIN-TZ-67g.title" = "Shift+Space で次のページ、Space で次の候補文字を"; @@ -63,7 +62,6 @@ "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; -"lblDevZoneCandidateFont.title" = "これは Apple Bug Report #FB10978412 の臨時対策であり、macOS 12 からの macOS に効き、IMK 以外の候補陳列ウィンドウに作用する。Apple は macOS 11 からの macOS のために該当 Bug を修復すべきである。"; "lblDevZoneIMKCandidate.title" = "IMK 候補陳列ウィンドウで言選り用キーは現時点で利用不可、尚他故障あり。"; "lblDevZoneTitleDescription.title" = "警告:これからの新機能テストのために作ったページですから、\nここで陳列されている諸機能は予想通り動けるだと思わないでください。"; "lblUpperCaseLetterKeyBehavior.title" = "Shift+文字キーの行為をご指定ください。"; @@ -81,7 +79,6 @@ "rVQ-Hx-cGi.title" = "和語"; "s7u-Fm-dVg.title" = "ページ"; "shc-Nu-UsM.title" = "ページボタンを表示"; -"tglDevZoneCandidateFont.title" = "「.langIdentifier」を使って候補陳列ウィンドウのフォントを取り扱う"; "tglDevZoneIMKCandidate.title" = "IMK 候補陳列ウィンドウを起用(入力アプリは自動的に再起動)"; "TXr-FF-ehw.title" = "繁体中国語"; "ueU-Rz-a1C.title" = "入力候補陳列での (Shift+)Tab キーの輪番切替対象をご指定ください。"; diff --git a/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings b/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings index 8d0f18772c2212a7f177a8fd0dbf529daaa5c0fb..b388d46258e3ecaba32320b5ff3acfd56565966a 100644 --- a/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings @@ -45,7 +45,6 @@ "chkAutoCorrectReadingCombination.title" = "敲字时自动纠正读音组合"; "chkFetchSuggestionsFromUserOverrideModel.title" = "在敲字时自动套用来自半衰记忆模组的建议"; "chkKeepReadingUponCompositionError.title" = "允许对无效的读音使用 BackSpace 编辑"; -"chkTogglingAlphanumericalModeWithLShift.title" = "也允许使用左侧的 Shift 键盘切换英数输入模式"; "chkUseFixecCandidateOrderOnSelection.title" = "以固定顺序来陈列选字窗内的候选字"; "DbW-eq-ZdB.title" = "星光"; "dIN-TZ-67g.title" = "Shift+Space 换下一页,Space 换选下一个候选字。"; @@ -63,7 +62,6 @@ "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; -"lblDevZoneCandidateFont.title" = "该方法是 Apple Bug Report #FB10978412 的保守治疗方案,用来仅针对 macOS 12 开始的系统,且仅对非 IMK 选字窗起作用。Apple 应该对 macOS 11 开始的系统修复这个 Bug。"; "lblDevZoneIMKCandidate.title" = "IMK 选字窗目前暂时无法正常使用选字键,并具其它未知故障。"; "lblDevZoneTitleDescription.title" = "警告:该页面仅作未来功能测试所用。\n在此列出的功能并非处于完全可用之状态。"; "lblUpperCaseLetterKeyBehavior.title" = "指定 Shift+字母键 的行为。"; @@ -81,7 +79,6 @@ "rVQ-Hx-cGi.title" = "和语"; "s7u-Fm-dVg.title" = "轮替页面"; "shc-Nu-UsM.title" = "在选字窗内显示翻页按钮"; -"tglDevZoneCandidateFont.title" = "使用 .langIdentifier 来管理选字窗的预设介面字型"; "tglDevZoneIMKCandidate.title" = "启用 IMK 选字窗(会自动重启输入法)"; "TXr-FF-ehw.title" = "繁体中文"; "ueU-Rz-a1C.title" = "指定 (Shift+)Tab 热键在选字窗内的轮替操作对象。"; diff --git a/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings b/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings index 50c4cc90f720f7529ce5636f37b6fe65612bbe2b..f692eead418216d8de6528d5666a107e7ba20fd1 100644 --- a/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings @@ -45,7 +45,6 @@ "chkAutoCorrectReadingCombination.title" = "敲字時自動糾正讀音組合"; "chkFetchSuggestionsFromUserOverrideModel.title" = "在敲字時自動套用來自半衰記憶模組的建議"; "chkKeepReadingUponCompositionError.title" = "允許對無效的讀音使用 BackSpace 編輯"; -"chkTogglingAlphanumericalModeWithLShift.title" = "也允許使用左側的 Shift 鍵盤切換英數輸入模式"; "chkUseFixecCandidateOrderOnSelection.title" = "以固定順序來陳列選字窗內的候選字"; "DbW-eq-ZdB.title" = "星光"; "dIN-TZ-67g.title" = "Shift+Space 換下一頁,Space 換選下一個候選字"; @@ -63,7 +62,6 @@ "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; -"lblDevZoneCandidateFont.title" = "該方法是 Apple Bug Report #FB10978412 的保守治療方案,用來僅針對 macOS 12 開始的系統,且僅對非 IMK 選字窗起作用。Apple 應該對 macOS 11 開始的系統修復這個 Bug。"; "lblDevZoneIMKCandidate.title" = "IMK 選字窗目前暫時無法正常使用選字鍵,併具其它未知故障。"; "lblDevZoneTitleDescription.title" = "警告:該頁面僅作未來功能測試所用。\n在此列出的功能並非處於完全可用之狀態。"; "lblUpperCaseLetterKeyBehavior.title" = "指定 Shift+字母鍵 的行為。"; @@ -81,7 +79,6 @@ "rVQ-Hx-cGi.title" = "和語"; "s7u-Fm-dVg.title" = "輪替頁面"; "shc-Nu-UsM.title" = "在選字窗內顯示翻頁按鈕"; -"tglDevZoneCandidateFont.title" = "使用 .langIdentifier 來管理選字窗的預設介面字型"; "tglDevZoneIMKCandidate.title" = "啟用 IMK 選字窗(會自動重啟輸入法)"; "TXr-FF-ehw.title" = "繁體中文"; "ueU-Rz-a1C.title" = "指定 (Shift+)Tab 熱鍵在選字窗內的輪替操作對象。"; diff --git a/Update-Info.plist b/Update-Info.plist index ce7f29b21450e51616016fd6990a98375896ac94..1f74c117f9331e285ad78b1009801e3f31722068 100644 --- a/Update-Info.plist +++ b/Update-Info.plist @@ -3,9 +3,9 @@ CFBundleShortVersionString - 1.9.3 + 1.9.4 CFBundleVersion - 1993 + 1994 UpdateInfoEndpoint https://gitee.com/vchewing/vChewing-macOS/raw/main/Update-Info.plist UpdateInfoSite diff --git a/vChewing.pkgproj b/vChewing.pkgproj index 924ff57214619e4b03313700f467339fc2ee37d2..87e6e03e1ecff4e08ac3e5a87bb9eb1559478c1e 100644 --- a/vChewing.pkgproj +++ b/vChewing.pkgproj @@ -726,7 +726,7 @@ USE_HFS+_COMPRESSION VERSION - 1.9.3 + 1.9.4 TYPE 0 diff --git a/vChewing.xcodeproj/project.pbxproj b/vChewing.xcodeproj/project.pbxproj index d6f3af2b74e16b6930d5adf1c3f642170f911b61..5de31dcce29b4183bd907a76b80d77e7e277eccf 100644 --- a/vChewing.xcodeproj/project.pbxproj +++ b/vChewing.xcodeproj/project.pbxproj @@ -1421,7 +1421,7 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1993; + CURRENT_PROJECT_VERSION = 1994; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -1431,7 +1431,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.9.3; + MARKETING_VERSION = 1.9.4; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewingTests; @@ -1460,13 +1460,13 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1993; + CURRENT_PROJECT_VERSION = 1994; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.9.3; + MARKETING_VERSION = 1.9.4; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewingTests; @@ -1497,7 +1497,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1993; + CURRENT_PROJECT_VERSION = 1994; DEAD_CODE_STRIPPING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; @@ -1518,7 +1518,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.9.3; + MARKETING_VERSION = 1.9.4; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor; @@ -1547,7 +1547,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1993; + CURRENT_PROJECT_VERSION = 1994; DEAD_CODE_STRIPPING = YES; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1564,7 +1564,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.9.3; + MARKETING_VERSION = 1.9.4; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor; @@ -1678,7 +1678,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1993; + CURRENT_PROJECT_VERSION = 1994; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = ""; @@ -1706,7 +1706,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.9.3; + MARKETING_VERSION = 1.9.4; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1733,7 +1733,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1993; + CURRENT_PROJECT_VERSION = 1994; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = ""; @@ -1755,7 +1755,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.9.3; + MARKETING_VERSION = 1.9.4; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1777,7 +1777,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1993; + CURRENT_PROJECT_VERSION = 1994; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -1797,7 +1797,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.9.3; + MARKETING_VERSION = 1.9.4; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1819,7 +1819,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1993; + CURRENT_PROJECT_VERSION = 1994; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -1833,7 +1833,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.9.3; + MARKETING_VERSION = 1.9.4; PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = "";