症状
ターミナル (iTerm2 で確認) で azooKey に切り替えて最初の 1 文字を打つと、その文字が二重に入力される。
b と打つ → bb と表示され、変換候補は b 1 文字分で進む
2 文字目以降は起きない
Alfred のバーや通常の text view (NSTextView 系) では起きない
環境
azooKey-Desktop main (7ed6b6d、v0.1.4-10) を手元でビルド
v0.1.4 (release) では起きない
v0.1.5-beta.1 でも起きない (同期 IPC のため)
macOS 26.5 / Apple Silicon
原因
b を 1 回押すと、次の順で 2 つの b が出る。
iTerm2 がキー入力を azooKey に渡す
azooKey は「このキーは自分が処理する」と答える。ただし feat: apply process separation #335 以降、かな漢字変換は別プロセス (ConverterServer) が行うようになっており、その結果「未確定文字列 b を表示せよ」が azooKey に返ってくるのは 30〜110ms 後
iTerm2 は 2 の答えを受け取った直後、「未確定文字列が置かれたか」で IME がキーを使ったかどうかを判断する。この時点ではまだ何も置かれていないので、IME はキーを使わなかったとみなし、生の b をシェルへ送る → 1 つ目の b
遅れて変換結果が届き、azooKey が未確定文字列 b を置く → 2 つ目の b (下線付き)
624.379 handle chars="b" -> handled=true ← 2
624.489 setMarkedText=b ← 4 (110ms 後)
2 文字目以降は、3 の時点で既に未確定文字列があるため、iTerm2 は IME が処理中と判断して生のキーを送らない。最初の 1 文字だけで起きるのはこのため。
v0.1.4 では変換が azooKey の中で行われ、2 の答えを返す前に未確定文字列を置いていたので発生しない。
通常の text view (NSTextView) では 3 の判断を macOS が行い、遅れて届く未確定文字列も正しく扱うため、現象は再現しない。
修正方針
2 の時点で、azooKey が「このキーは自分が処理する」と答える前に、押された文字 b をそのまま暫定の未確定文字列として保存する。
これで 3 の時点で iTerm2 は「未確定文字列がある」と判断し、生の b をシェルへ送らなくなる。
4 で変換結果が届いたら、暫定の b を本来の内容に置き換える (ローマ字入力なら b のまま、かな入力なら す のように)。
対象は、未確定文字列が無い状態で押された文字キーだけ。既に未確定文字列がある間 (2 文字目以降) や、Backspace・⌘ ショートカットでは何もしない。
症状
ターミナル (iTerm2 で確認) で azooKey に切り替えて最初の 1 文字を打つと、その文字が二重に入力される。
bと打つ →bbと表示され、変換候補はb1 文字分で進む環境
main(7ed6b6d、v0.1.4-10) を手元でビルドv0.1.5-beta.1でも起きない (同期 IPC のため)原因
bを 1 回押すと、次の順で 2 つのbが出る。bを表示せよ」が azooKey に返ってくるのは 30〜110ms 後bをシェルへ送る → 1 つ目のbbを置く → 2 つ目のb(下線付き)2 文字目以降は、3 の時点で既に未確定文字列があるため、iTerm2 は IME が処理中と判断して生のキーを送らない。最初の 1 文字だけで起きるのはこのため。
v0.1.4 では変換が azooKey の中で行われ、2 の答えを返す前に未確定文字列を置いていたので発生しない。
通常の text view (NSTextView) では 3 の判断を macOS が行い、遅れて届く未確定文字列も正しく扱うため、現象は再現しない。
修正方針
bをそのまま暫定の未確定文字列として保存する。bをシェルへ送らなくなる。bを本来の内容に置き換える (ローマ字入力ならbのまま、かな入力ならすのように)。対象は、未確定文字列が無い状態で押された文字キーだけ。既に未確定文字列がある間 (2 文字目以降) や、Backspace・⌘ ショートカットでは何もしない。