[研發日誌] 威注音輸入法的「去 Zonble 化」日記(二)

前言

一直以來,有相當數量的威注音輸入法的支持者們「希望威注音能盡量減少對上游程式內容的使用」。但最終使得身為主程式的本人下定決心這樣做的,則是出於別的原因。本文主要聊技術,就不多扯這些背後的原因了。

這是第二篇「去 Zonble 化」日記,主要講威注音 2.7.0 版至 2.8.0 版當中對上游 Zonble 的特定組件的汰換與重寫。

P.S.: 本文當中提到的 SessionCtl 是威注音輸入法對 IMKInputController 的實作型別、CtlCandidateIMK 是 IMKCandidates 的實作型別。KeyHandler 則是按鍵調度模組、已經被筆者在 2022 年四月用 Swift 重寫。

先聊一下 2.7.0

威注音專案在 2.6.2 SP3 版之後經歷過一次大重組,所有的零件都盡量拆包成 Swift Package,藉此提升專案的建置速度,便於今後的開發維護。現在來看,這是非常正確的決定。唯一的代價就是不得不犧牲對 macOS 10.11.5 和 10.12 的支援,因為 Xcode 14 不支援對這兩個系統的 Swift Package 建置。

新版通知飄窗(自威注音 2.7.5 引入)

新版通知飄窗

小麥注音的通知飄窗與奇摩輸入法的通知飄窗都是同一人所寫,但他顯然沒明白 Swift 有自己的特性可以用來取代 NSTimer 等 ObjC 才會更廣泛用到的東西。威注音這次的新版通知飄窗擁有如下新特性:

  1. 新通知始終顯示在螢幕右上角、且舊通知會自動變淡+位置下移。原因:使用了更好的飄窗通知副本管理方法。
  2. 飄窗文本排版及動畫動畫效果受到了 Call of Duty: MWII 2022 的影響,但也兼顧了 Cocoa 應用的顯示風格、使之不太出戲。
  3. 對 DispatchQueue Async 的相容。之前上游的通知飄窗在 DispatchQueue Async 內呼叫時會讓輸入法直接崩潰掉。

全新的田所選字窗(自威注音 2.8.0 引入)

威注音自 2.8.0 版起,對 macOS 11 及之前的系統,僅提供 IMK 選字窗可用。本來威注音是不用再另起爐灶的。然而,IMK 選字窗在未來可能會因為改了某個內部 API 而導致新的故障出現,所以必須得有一個非 IMK 的選字窗作為備選。

迄 2.7.0 版為止,這個備選的選字窗都是自上游繼承過來的 Voltaire-Swift 選字窗修改來的。但這套選字窗想改成類似 macOS 內建輸入法那種捲動矩陣佈局的話,只用 Cocoa 技術實現的話,技術難度太大。

幸好,SwiftUI 讓事情變得簡單了一些。雖然很多要用到的 SwiftUI API 要求至少 macOS 12 才可以用得上。田所選字窗的工作原理與筆者在上一篇「去 Zonble 化」日記當中提到的 IMEState 差不多:有一個專門處理資料變化的型別,且與負責介面顯示的型別徹底分離。這樣一來,負責介面顯示的型別(其實是 SwiftUI 結構)在程式維護方面就會輕鬆不少。

一開始的田所選字窗是有做得跟 macOS 內建的選字窗幾乎雷同的。但是,SwiftUI 的繪製效能並不好,使得選字窗的操作流暢度欠佳、嚴重影響了ㄅ半輸入模式的體驗。於是,田所選字窗的滑鼠滾動檢視特性就被移除了、且僅顯示三列矩陣。

田所選字窗

EOF.

你可能感兴趣的:([研發日誌] 威注音輸入法的「去 Zonble 化」日記(二))