Ctrl+JでSwiftyGyaimがすぐABCに戻る調査
現象
Ctrl+Jで入力ソースをSwiftyGyaimへ切り替えた直後、偶発的に英字入力(ABC)へ戻ることがある。
直近でも再現したためログを確認した。
確認したログ
~/.gyaim/gyaim.log
15:51:44 IME deactivated: committing preedit (converting=false, candidates=0)
15:51:44 IME activated (pasteboardCC=1591, lastConsumedCC=1591)
macOS Unified Log(InputMethodKit)
15:50:29.004 Activate Server
15:50:29.107 Deactivate Server // 103ms後
15:50:30.213 Activate Server
15:50:30.338 Deactivate Server // 125ms後
15:50:35.558 Activate Server
15:50:36.081 Deactivate Server // 523ms後
観察
SwiftyGyaimプロセスのクラッシュや例外ではない。
SwiftyGyaim側から英字入力へ戻しているログはない。
deactivateServer(_:) がmacOS/InputMethodKit側から呼ばれている。
deactivation時は converting=false, candidates=0 のケースが多く、未確定文字の確定処理が原因ではなさそう。
TextInputMenuAgentも短時間で入力メニュー表示を更新している。
環境設定
macOSの入力ソース切替ショートカットに Ctrl+J が割り当てられている。
defaults export com.apple.symbolichotkeys -
AppleSymbolicHotKeys 60:
parameters = 106, 38, 262144
106='j', keyCode 38=J, 262144=Ctrl
現時点の仮説
Ctrl+Jの入力ソース切替がmacOS/TextInputMenuAgent側で短時間に2回発火、または入力ソース履歴の切替が揺れている。
結果として ABC → SwiftyGyaim → ABC のように戻っている可能性が高い。
SwiftyGyaimの変換処理や候補ウィンドウ起因ではなく、入力ソースライフサイクルイベントとして deactivate が来ている。
追加した診断ログ
activateServer/deactivateServerに以下を追加した。
seq: controller内のactivation sequence
elapsedSinceActivate: activateからdeactivateまでの経過ms
level=short-cycle: activateから1秒未満のdeactivateを明示
sender/currentClientの型とbundleIdentifier
次の確認
PR 51を入れたビルドで再発させる。
~/.gyaim/gyaim.log で level=short-cycle の行を確認する。
sender/currentClientのbundleIdentifierが、戻る直前/直後で同じクライアントか別クライアントかを見る。
Ctrl+J以外のショートカットでも再現するか比較する。
検証
xcodegen generate
xcodebuild -project Gyaim.xcodeproj -scheme Gyaim -configuration Debug -derivedDataPath .build build は成功。
./Scripts/run-unit-tests.sh は180秒でtimeout。長いWordSearch eviction test実行中で、それ以前のテストは通過していた。