# IDE キーボード入力（2026-08-22）

## 入力経路

実行画面の canvas にフォーカスがある間だけ `keydown` / `keyup` を受け、
`KeyboardEvent.code` を優先し、空または未知なら `KeyboardEvent.key` から解決する。
`LibretroHost.setKey()`、px68k-libretro、X68000 のキーボード割り込み、
`x68_key_down()` の順で届く。blur・ページ非表示・エミュレータ停止時には全キーを解放する。

## ホストから直接届かない X68000 キー

X68000 配列のうち、現在の `CODE_TO_RETROK` に対応する DOM
`KeyboardEvent.code` が無いものは次の **10キー**。今回は代替UI・代替割当を作っていない。

- ローマ字、コード入力、ひらがな、全角、COPY
- XF1、XF2、XF3、XF4、XF5

OPT.1/OPT.2 は左右Alt、記号入力はPrintScreen、登録はScrollLock、HELPはF11、
BREAKはPause、かなはKanaModeを対応先としている。ただし、KanaMode等を物理的に持たない
ホストキーボードではそのキーから入力できない。

## 末端検証

```sh
node verify/verify_ide_keyboard.mts
```

`ide/samples/keyboard-input.c` を利用者ターゲットとして実ビルドし、LEFT / UP / RIGHT /
DOWN / SPACE / ENTER / ESC / A / 1 の各押下でゲストのテキスト画面に異なる語が出ること、
解放で `[RELEASE]` が出ることを確認する。違うキーを送る陽性対照も同じ画面条件で失敗させる。

## 短い押下の実測

- keydown と keyup の間に `retro_run()` が0回: ゲストは検出しなかった。
- 間に1フレーム: `[A]` とその後の `[RELEASE]` を検出した。
- keyupしない場合: 少なくとも120フレーム、押下状態を維持した。

現在のAPIは「今押されているか」を返すレベル入力であり、実利用の物理的な打鍵は通常1フレームを
超える。ホストで一律ラッチすると、ゲームで離した時刻が遅れて操作感や同時押しを変えるため、
現時点では入れない方がよい。短押下のイベントが必要なら、将来 `x68_key_pressed()` のような
エッジ入力APIをレベル入力と分けて追加するのが安全である。
