Skip to content

fix(rust-term,rust-app): kitty キーボードプロトコルの残欠陥を修正(第17波)#153

Merged
sasagar merged 1 commit into
devfrom
feature/kitty-encoding-fixes
Jul 18, 2026
Merged

fix(rust-term,rust-app): kitty キーボードプロトコルの残欠陥を修正(第17波)#153
sasagar merged 1 commit into
devfrom
feature/kitty-encoding-fixes

Conversation

@sasagar

@sasagar sasagar commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Summary

第16波のコードレビューで CONFIRMED になった、kitty キーボードプロトコル(仕様)実装の残欠陥をまとめて修正。

  • keys.rs: 修飾つき矢印キー — Shift/Ctrl/Alt+矢印が全モードで無修飾と同一バイト(\x1b[A 等)だった問題を修正。CSI 1;<m><letter> を disambiguate の有無に関係なく送信(legacy xterm の標準挙動であり kitty 固有ではないため)。
  • keys.rs: disambiguate 時の Esc — 仕様上 Esc は disambiguate 有効時に例外なく CSI 27uCSI 27;<m>u を要求されるが、従来コードは Enter/Tab/Backspace と同列に「out of scope」として legacy 0x1b のまま誤って除外していた(コメントの仕様誤読)。修正し、コメントも仕様原文に合わせて書き直した。
  • keys.rs: disambiguate 時の Ctrl+<letter>CSI <codepoint>;<m>u(codepoint は小文字の Unicode 値、例 ctrl+c → CSI 99;5u)を送るよう修正。Ctrl+Alt の複合修飾も modifier ビットに反映。disambiguate 無効時は従来の C0 のまま非回帰。
  • 両バックエンドの kitty_disambiguate() — kitty 仕様が明記する「flag 8(report all keys)は flag 1(disambiguate)を含意する」を反映し、intersects に変更。
  • alacritty_terminal 0.26.0 のベンダリング — 上流の push_keyboard_modeterm/mod.rs)が、キーボードモードスタックが上限(4096)に達した際のトリム対象を title_stack.remove(0)(コピペミス。正しくは keyboard_mode_stack.remove(0))としているバグを発見。title_stack は空のままなので Vec::remove(0) が out-of-bounds panic を起こし、kitty_keyboard: true にした本リポジトリで到達可能になっていた(panic はワーカースレッドを巻き込んで unwind し、ペインが恒久フリーズする)。1行のみ修正してベンダリング(rust/vendor/alacritty_terminal/、W14 の libghostty-vt-sys と同じ前例に倣う)。上流への issue 報告は別途判断のため今回は行っていない。
  • session.rs: TERM_PROGRAM_VERSION — 実 Ghostty が常に TERM_PROGRAM と対で設定することを踏まえ追加(値は libghostty-vt-sys のピン留めコミット・CI/開発手順が参照する vancluever フォーク双方の build.zig.zon から確認した 1.3.2-dev)。呼び出し元 env による上書き(last-write-wins)を意図されたエスケープハッチとして明文化し、テストで固定。

Test plan

  • cargo fmt --check
  • cargo clippy --workspace --all-targets -- -D warnings
  • cargo test --workspace
  • cargo test -p labolabo-app(keys.rs のユニットテスト含む)
  • cargo test -p labolabo-term --features backend-ghostty-vt(実 Zig/Ghostty ソースでビルド・実行)
  • ベンダリング修正の regression test(keyboard_mode_stack_survives_pushes_past_max_depth)が、パッチ適用前は実際にタイムアウトで red、適用後に green になることを確認(red-before-green 検証済み)
  • 独立検証エージェントによるレビューで全5項目 VERIFIED(矢印キー・Esc・Ctrl+letter の敵対的エッジケーステスト、ベンダー差分の一致確認、TERM_PROGRAM_VERSION の内部整合性確認を含む)

未検証点:

  • backend-ghostty-vtkitty_disambiguate() flag 8 対応はコード上 alacritty 側と対称的で spec 引用も同一だが、独立検証エージェント自身は Zig ツールチェイン未使用のためコンパイル未検証(自分自身では実際に Zig でビルドし全32テスト green を確認済み)。

- 修飾つき矢印キーが全モードで無修飾と同一バイトだった問題を修正
  (CSI 1;<m><letter> を disambiguate の有無に関係なく送信)
- disambiguate 有効時、Esc が CSI 27u/27;<m>u を送るよう修正
  (従来は legacy 0x1b のまま誤って除外扱いされていた)
- disambiguate 有効時、Ctrl+<letter>(Ctrl+Alt 含む)が
  CSI <codepoint>;<m>u を送るよう修正(従来は C0 のまま)
- 両バックエンドの kitty_disambiguate() を REPORT_ALL フラグ単独でも
  true を返すよう修正(kitty 仕様: flag 8 は flag 1 を含意する)
- alacritty_terminal 0.26.0 をベンダリングし、push_keyboard_mode の
  コピペバグ(title_stack.remove(0) の誤呼び出しによる
  panic)を1行修正。kitty_keyboard:true化で到達可能になっていた
- TERM_PROGRAM_VERSION を TERM_PROGRAM と対で設定し、呼び出し元 env
  による上書きを意図されたエスケープハッチとして明文化・テスト固定
@sasagar
sasagar marked this pull request as ready for review July 18, 2026 02:07
@sasagar
sasagar merged commit 973e979 into dev Jul 18, 2026
11 checks passed
@sasagar
sasagar deleted the feature/kitty-encoding-fixes branch July 18, 2026 02:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant