--- nono/vm/keyboard.h 2026/04/29 17:04:52 1.1.1.6 +++ nono/vm/keyboard.h 2026/04/29 17:05:03 1.1.1.9 @@ -25,6 +25,8 @@ class Keyboard : public Device void MakeKey(uint keycode); // キーを離した (外部から呼ばれる) void BreakKey(uint keycode); + // 文字入力によるキーエミュレーション (外部から呼ばれる) + void CharInput(uint charcode); // マウス入力 // x, y は X, Y の前回からの移動量。 @@ -34,6 +36,9 @@ class Keyboard : public Device // rb, lb, mb はボタンの状態。true なら押下中。 virtual void MouseInput(int x, int y, bool rb, bool lb, bool mb) = 0; + // マウスデータを VM に送信する MD 処理 + virtual void MouseSendStart() = 0; + // ホストからの制御コマンド virtual void Command(uint32 data) = 0; @@ -55,7 +60,7 @@ class Keyboard : public Device virtual bool IsShift() const = 0; // キー名を返す (主にデバッグ表示用) - static const std::string GetName(uint code); + static const std::string GetKeyName(uint code); protected: // キーコードには、 @@ -70,14 +75,11 @@ class Keyboard : public Device // 共通キーコードを機種別のキーコードに変換する virtual uint KeyToMDKey(uint keycode) const = 0; - // 入力されたキーを前処理し、フィルタする。 - // デフォルトは何もせず通過。 - virtual uint PreprocessKey(uint keystat) { return keystat; } - - // キーを押した/離した時の MD 固有処理。 - // 処理を継続するなら true、このキーの処理をここでやめるなら false。 - // デフォルトは何もせず通過。 - virtual bool ProcessKey(uint keystat) { return true; } + // キーを1つ処理する + virtual void KeyInput(uint keystat) = 0; + + // キーを処理する (共通部分) + bool KeyInputCommon(uint keystat); // キーを VM に送信する MD 処理 virtual void SendStart() = 0; @@ -105,14 +107,24 @@ class Keyboard : public Device // 含めたコードはすべて派生クラス側で用意すること。 std::vector led {}; + // マウス状態 + int mouse_x {}; // 前回送信から現在までの積算値 + int mouse_y {}; + bool mouse_r {}; // 現在値 + bool mouse_l {}; + bool mouse_m {}; + bool prev_r {}; // 前回送信時の値 + bool prev_l {}; + bool prev_m {}; + private: // キー入力を VM スレッドで処理するためのイベント void KeyInputCallback(Event& ev); - void KeyInput(uint keystat); - Event keyinput_event {}; + Event keyinput_event { this }; std::mutex mtx {}; static std::vector keyname; + static std::vector char_key; }; extern std::unique_ptr gKeyboard; @@ -128,11 +140,17 @@ extern std::unique_ptr gKeyboa #define KC_IS_MAKE(x) (((x) & KC_FLAG_BREAK) == 0) #define KC_IS_BREAK(x) (((x) & KC_FLAG_BREAK) != 0) -// keystat からフラグだけ取り出す -#define KC_FLAG(x) ((x) & 0x8000) +// char 入力モードでの押下ならキーコードを UI に通知する必要があるため、 +// inputqueue 内でこの情報を保持するためのフラグ。 +#define KC_FLAG_POST (0x4000) +#define KC_IS_POST(x) (((x) & KC_FLAG_POST) != 0) + +// 文字入力エミュレーション時に同時押しするキーのためのモディファイヤフラグ。 +#define KM_SHIFT (0x0100) +#define KM_CTRL (0x0200) // keystat からキーコードだけ取り出す -#define KC_CODE(x) ((x) & 0x7fff) +#define KC_CODE(x) ((x) & 0x00ff) #define KC_none (0) @@ -267,3 +285,21 @@ extern std::unique_ptr gKeyboa #define KC_SHIFT (0x85) // [X68k] SHIFT (左右の区別なし) #define KC_max (0x86) + +// 文字入力モードの拡張部分 +#define CC_NUL (0x80) // NUL (Ctrl + @) +#define CC_F1 (0x81) +#define CC_F2 (0x82) +#define CC_F3 (0x83) +#define CC_F4 (0x84) +#define CC_F5 (0x85) +#define CC_F6 (0x86) +#define CC_F7 (0x87) +#define CC_F8 (0x88) +#define CC_F9 (0x89) +#define CC_F10 (0x8a) + +#define CC_up (0x8c) +#define CC_left (0x8d) +#define CC_right (0x8e) +#define CC_down (0x8f)