--- nono/vm/keyboard.cpp 2026/04/29 17:05:43 1.1.1.16 +++ nono/vm/keyboard.cpp 2026/04/29 17:05:51 1.1.1.17 @@ -100,6 +100,7 @@ #include "keyboard.h" #include "config.h" +#include "mainapp.h" #include "scheduler.h" #include "syncer.h" #include "uimessage.h" @@ -141,7 +142,13 @@ Keyboard::~Keyboard() bool Keyboard::Init() { - syncer = GetSyncer(); + // LUNA ならスケジューラとの連携が必要。 + // キーリピートをソフトウェアで処理しないといけないため。 + if (gMainApp.Has(VMCap::LUNA)) { + syncer = GetSyncer(); + } + + uimessage = gMainApp.GetUIMessage(); scheduler->ConnectMessage(MessageID::KEY_INPUT, this, ToMessageCallback(&Keyboard::KeyInputMessage)); @@ -162,7 +169,7 @@ Keyboard::ResetHard(bool poweron) } // キー通知 - syncer->RequestKeyPressed(Any()); + SyncKeyPressed(Any()); } // 内部状態をリセット @@ -180,7 +187,7 @@ Keyboard::PowerOff() std::fill(pressed.begin(), pressed.end(), false); // キーが全部解放されたので通知 - syncer->RequestKeyPressed(false); + SyncKeyPressed(false); DoDisconnect(); } @@ -288,7 +295,7 @@ Keyboard::DoConnect() } // UI に通知する - UIMessage::Post(UIMessage::KEYBOARD); + uimessage->Post(UIMessage::KEYBOARD); } void @@ -302,7 +309,7 @@ Keyboard::DoDisconnect() MDDisconnect(); // UI に通知する - UIMessage::Post(UIMessage::KEYBOARD); + uimessage->Post(UIMessage::KEYBOARD); } // キーの押し下げ状態を設定する。 @@ -316,16 +323,26 @@ Keyboard::SetPressed(uint keycode, bool bool prev = Any(); pressed[keycode] = true; if (prev == false) { - syncer->RequestKeyPressed(true); + SyncKeyPressed(true); } } else { pressed[keycode] = false; if (Any() == false) { - syncer->RequestKeyPressed(false); + SyncKeyPressed(false); } } } +// LUNA なら、キーの押し下げ状態 (いずれかでも押し下げなら true) を +// syncer にも通知する。 +void +Keyboard::SyncKeyPressed(bool any_pressed) +{ + if (syncer) { + syncer->RequestKeyPressed(any_pressed); + } +} + // キー入力を1つ処理する。 // keystat が押下・開放されたキーの物理的な状態。 // キー入力を受け取らずに破棄した場合は false を返す。 @@ -390,7 +407,7 @@ Keyboard::KeyInputCommon(uint keystat) } else { arg = 0; } - UIMessage::Post(UIMessage::KEYBOARD, arg); + uimessage->Post(UIMessage::KEYBOARD, arg); // LUNA の LED キー消灯はキー開放を送信 if (ledflag == KC_FLAG_LED_BREAK) { @@ -441,7 +458,7 @@ Keyboard::GetKeyName(uint keycode) Keyboard::keyname { "(none)", // 00 "BREAK", // 01 - "COPY", // 02 + NULL, // 02 "romaji", // 03 "code", // 04 "kigou", // 05 @@ -459,7 +476,7 @@ Keyboard::keyname { "ESC", // 10 "BS", // 11 "enter", // 12 - "INS", // 13 + NULL, // 13 "space", // 14 "DEL", // 15 "XFER", // 16 @@ -473,8 +490,8 @@ Keyboard::keyname { "right", // 1e "down", // 1f - "ROLLUP", // 20 - "ROLLDOWN", // 21 + "INS", // 20 + "COPY", // 21 "1", // 22 "2", // 23 "3", // 24 @@ -490,8 +507,8 @@ Keyboard::keyname { "backslash", // 2e "", // 2f - "OPT1", // 30 - "OPT2", // 31 + "CUT", // 30 + "PASTE", // 31 "Q", // 32 "W", // 33 "E", // 34 @@ -507,7 +524,7 @@ Keyboard::keyname { "hira", // 3e "zenkaku", // 3f - "HOME", // 40 + NULL, // 40 "UNDO", // 41 "A", // 42 "S", // 43 @@ -521,8 +538,8 @@ Keyboard::keyname { "semicolon", // 4b "colon", // 4c "bracketright", // 4d - NULL, // 4e - NULL, // 4f + "OPT1", // 4e + "OPT2", // 4f "XF1", // 50 "XF2", // 51 @@ -541,7 +558,7 @@ Keyboard::keyname { "XF4", // 5e "XF5", // 5f - NULL, // 60 + "HOME", // 60 "PAD_plus", // 61 "PAD_minus", // 62 "PAD_7", // 63 @@ -558,8 +575,8 @@ Keyboard::keyname { "PAD_enter", // 6e "PAD_CLR", // 6f - NULL, // 70 - NULL, // 71 + "ROLLUP", // 70 + "ROLLDOWN", // 71 "F1", // 72 "F2", // 73 "F3", // 74