Skip to content

bug: 変換中(marked text表示中)の前方削除(fn+Delete)がアプリに素通しされ、表示と内部状態がズレることがある #355

Description

@tomippe

現象

変換中に fn+Delete(フルキーボードのDelキー、keyCode 0x75)を押すと、イベントがIMEで処理されずアプリに素通しされます。

  • keyCode 0x75 は UserAction.getUserAction.unknown になり(サポート外として明示的に無効化されているグループ)、composing 状態の .unknown(.fallthrough, .fallthrough) のため、アプリにイベントが渡ります
  • marked text 表示中にアプリ側が前方削除を実行するため、アプリによっては変換中テキストの表示が壊れ、IME内部の ComposingText と画面表示が不整合になります(bug: Discordでのキー入力中(composing)にOption+Deleteを入力すると全てが削除されたように見えるが、別の文字を入力すると復活する #213 の Option+Delete と同系統の「表示と内部状態の不整合」です)
  • ズレた後は、見かけ上文字が消えているのに変換中状態が続く、その後の入力が不自然になる、などの動作になります

macOS標準の日本語入力やGoogle日本語入力は、変換中のDelをIME側で処理(または消費)します。

修正例(0.1.4ベースの自分用ビルドで動作確認済み)

  1. keyCode 0x75 を新設の UserAction.deleteForward として扱う
  2. composing 中: ComposingText.deleteForwardFromCursorPosition(count:) でカーソル右側の文字を削除。すべて消えたら none に遷移(backspace と同じ basedOnBackspace コールバックを使用)
  3. selecting / previewing 中: consume(アプリに流さない)
  4. 非変換中(none): 従来どおり fallthrough(アプリの通常の前方削除として機能)

なお #349 のカーソル編集を導入すると「文中にカーソルを置いてDelで右側を消す」が現実的な操作になるため、この素通し問題が顕在化しやすくなります。カーソル編集とセットでの対応をおすすめします。

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