--- nono/vm/lunakbd.h 2026/04/29 17:04:29 1.1.1.2 +++ nono/vm/lunakbd.h 2026/04/29 17:04:59 1.1.1.9 @@ -1,71 +1,70 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #pragma once #include "keyboard.h" +#include "monitor.h" #include "scheduler.h" +#include class LunaKeyboard : public Keyboard { - typedef Keyboard inherited; + using inherited = Keyboard; public: LunaKeyboard(); - virtual ~LunaKeyboard(); + virtual ~LunaKeyboard() override; - virtual void ResetHard(); + bool PowerOn() override; + void ResetHard() override; - virtual bool MonitorUpdate(); + // シフト状態なら true を返す + bool IsShift() const override; - // キーを押した - virtual void MakeKey(uint); - // キーを離した - virtual void BreakKey(uint); // マウス入力 - virtual void MouseInput(int x, int y, bool rb, bool lb, bool mb); + void MouseInput(int x, int y, bool rb, bool lb, bool mb) override; + + // マウスデータを VM に送信する MD 処理 + void MouseSendStart() override; + + // ホストからの制御コマンド + void Command(uint32 data) override; private: - // キーイベントを空きスロットに登録 - void SetKeyEvent(uint code); + // MD キーコードに変換 + uint KeyToMDKey(uint keycode) const override; - // キーボードコールバック - void KeyboardCallback(int arg); + // キーを1つ処理する + void KeyInput(uint keystat) override; - // 共通キーコードから LUNA キーコードへの変換 - uint keycode2lunakey(uint); + // キーイベントを起こせる空きスロットを計算して、イベントを開始 + void SendStart() override; - // イベント - Event key_event {}; - Event mouse_event[3] {}; + // キーボードコールバック + void KeyboardCallback(Event& ev); - // キー送信中なら true - bool key_sending = false; + // 共通キーコードから LED 番号を取得。 + // 0: かな + // 1: CAPS + int Keycode2LED(uint keycode) const; - // マウス状態 - int mouse_x; // 前回送信から現在までの積算値 - int mouse_y; - bool mouse_r, prev_r; // 現在値と前回送信時の値 - bool mouse_l, prev_l; - bool mouse_m, prev_m; + DECLARE_MONITOR_CALLBACK(MonitorUpdate); - // マウスコールバック - void MouseSamplingCallback(int arg); - void MouseCallback(int arg); + // イベント + Event key_event { this }; + std::array mouse_event {}; - // 変換テーブル - static const uint keycode2lunakey_table[128]; + // マウスコールバック + void MouseSamplingCallback(Event& ev); + void MouseCallback(Event& ev); - // キー名テーブル - static const char * const keyname[128]; + Monitor monitor { this }; - // キーリピート用のテーブル。 - // LUNA のキーボードはキーを押し続けてもキーボードはオートリピート - // しないが、wxWidgets はキーを押し続けると KEY_DOWN イベントが連続 - // して飛んでくる。そのためすでに押されているキーについて再び - // KEY_DOWN が来てもこれを本体に送らないようにする。 - uint8 reptable[128] {}; + // 変換テーブル + static const uint keycode2lunakey_table[0x80]; // LUNA キーコード static const uint NoKey = 0;