Skip to content

bug: ターミナルで最初の1文字が二重に入力される(ConverterServer 非同期化以降) #357

Description

@shiina-archelon

症状

ターミナル (iTerm2 で確認) で azooKey に切り替えて最初の 1 文字を打つと、その文字が二重に入力される。

Image
  • 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 が出る。

  1. iTerm2 がキー入力を azooKey に渡す
  2. azooKey は「このキーは自分が処理する」と答える。ただし feat: apply process separation #335 以降、かな漢字変換は別プロセス (ConverterServer) が行うようになっており、その結果「未確定文字列 b を表示せよ」が azooKey に返ってくるのは 30〜110ms 後
  3. iTerm2 は 2 の答えを受け取った直後、「未確定文字列が置かれたか」で IME がキーを使ったかどうかを判断する。この時点ではまだ何も置かれていないので、IME はキーを使わなかったとみなし、生の b をシェルへ送る → 1 つ目の b
  4. 遅れて変換結果が届き、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・⌘ ショートカットでは何もしない。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions