--- nono/vm/keyboard.cpp 2026/04/29 17:04:52 1.1.1.5 +++ nono/vm/keyboard.cpp 2026/04/29 17:04:58 1.1.1.7 @@ -69,18 +69,16 @@ #include "keyboard.h" #include "scheduler.h" +#include "uimessage.h" std::unique_ptr gKeyboard; // コンストラクタ Keyboard::Keyboard() + : inherited("Keyboard") { - logname = "keyboard"; - devname = "Keyboard"; - pressed.resize(KC_max); - keyinput_event.dev = this; keyinput_event.func = (DeviceCallback_t)&Keyboard::KeyInputCallback; keyinput_event.time = 0; keyinput_event.SetName("Keyboard Input"); @@ -148,47 +146,35 @@ Keyboard::KeyInputCallback(Event& ev) } // キー入力を1つ処理する -void -Keyboard::KeyInput(uint keystat) +// キーを送信したら true を返す +bool +Keyboard::KeyInputCommon(uint keystat) { uint keycode = KC_CODE(keystat); bool ismake = KC_IS_MAKE(keystat); - assert(keycode < KC_max); - - // キーのプリプロセス - keystat = PreprocessKey(keystat); - keycode = KC_CODE(keystat); - if (keycode == KC_none) { - return; - } - // 対応する機種別キーコードがなければ無視。 // (ここでは調べるだけでまだ変換はしない) if (KeyToMDKey(keycode) == 0) { - return; + return false; } // このキーの状態が変化しないのなら何もしない。 - // X680x0 のキーリピートは X680x0Keyboard 側で処理する。 - // LUNA のキーボードにはリピートがないので、ここで何もしないだけでいい。 if (IsPressed(keycode) == ismake) { - return; - } - - // MD 固有の処理(?) - if (ProcessKey(keystat) == false) { - return; + return false; } // 処理することが確定したのでログ // (離すほうは押すほうよりログレベルを1つ上げてある) if (ismake) { - putlog(1, "MakeKey %d(%s)", keycode, GetName(keycode).c_str()); + putlog(1, "MakeKey %d(%s)", keycode, GetKeyName(keycode).c_str()); } else { - putlog(2, "BreakKey %d(%s)", keycode, GetName(keycode).c_str()); + putlog(2, "BreakKey %d(%s)", keycode, GetKeyName(keycode).c_str()); } + // UI に状態変更を通知 + UIMessage::Post(UIMessage::KEYBOARD); + // キーが押されてる間は VM の高速実行を抑制する // すべてのキーが離されたら高速モードを許可する pressed[keycode] = ismake; @@ -207,11 +193,12 @@ Keyboard::KeyInput(uint keystat) // 機種依存のキー送信処理 SendStart(); + return true; } // キー名を返す (主にデバッグ用) const std::string -Keyboard::GetName(uint keycode) +Keyboard::GetKeyName(uint keycode) { if (keycode >= keyname.size()) { return string_format("(keycode=0x%x, out of range)", keycode);