--- nono/wx/wxsoftkey.cpp 2026/04/29 17:04:53 1.1.1.6 +++ nono/wx/wxsoftkey.cpp 2026/04/29 17:04:59 1.1.1.8 @@ -8,6 +8,7 @@ #include "wxcolor.h" #include "wxmainview.h" #include "wxtextscreen.h" +#include "wxuimessage.h" #include "sram.h" // @@ -28,8 +29,6 @@ wxBEGIN_EVENT_TABLE(WXSoftKeyPanel, inhe EVT_LEFT_DCLICK(WXSoftKeyPanel::OnLeftDClick) EVT_RIGHT_DOWN(WXSoftKeyPanel::OnRightDown) EVT_PAINT(WXSoftKeyPanel::OnPaint) - EVT_SIZE(WXSoftKeyPanel::OnSize) - EVT_TIMER(wxID_ANY, WXSoftKeyPanel::OnTimer) wxEND_EVENT_TABLE() // コンストラクタ @@ -47,20 +46,24 @@ WXSoftKeyPanel::WXSoftKeyPanel(wxWindow std::fill(last_pressed.begin(), last_pressed.end(), true); last_modifier = (Modifier)-1; + DoSize(); + // このパネルへのキー入力はメインビューへのキー入力と同じ。 Connect(wxEVT_KEY_UP, wxKeyEventHandler(WXMainView::OnKeyUp), NULL, gMainView); Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(WXMainView::OnKeyDown), NULL, gMainView); - // 更新間隔は適当 - timer.SetOwner(this); - timer.Start(100); + // VM からの通知を受け取る + WXUIMessage::Connect(UIMessage::KEYBOARD, this, + wxCommandEventHandler(WXSoftKeyPanel::OnKeyChanged)); } // デストラクタ WXSoftKeyPanel::~WXSoftKeyPanel() { + WXUIMessage::Disconnect(UIMessage::KEYBOARD, + wxCommandEventHandler(WXSoftKeyPanel::OnKeyChanged)); } // フォントサイズ変更 (外部インタフェース) @@ -130,18 +133,6 @@ WXSoftKeyPanel::DoSize() wxSize size(u_width * unit, u_height * unit); SetClientSize(size); SetMinClientSize(size); -} - -// サイズ変更イベント -void -WXSoftKeyPanel::OnSize(wxSizeEvent& event) -{ - // Mac ではウィンドウ作成時に 0 以下の値が来ることがある - // GTK では 1 で来ることがある - const wxSize& size = event.GetSize(); - if (size.x <= 1 || size.y <= 1) { - return; - } // ビットマップ作成 bitmap.Create(size.x, size.y); @@ -150,9 +141,9 @@ WXSoftKeyPanel::OnSize(wxSizeEvent& even Refresh(); } -// タイマーイベント +// キー状態変更イベント (UIMessage) void -WXSoftKeyPanel::OnTimer(wxTimerEvent& event) +WXSoftKeyPanel::OnKeyChanged(wxCommandEvent& event) { // 更新があれば再描画を指示 const std::vector& pressed = gKeyboard->GetPressed(); @@ -564,8 +555,6 @@ WXLunaSoftKeyPanel::WXLunaSoftKeyPanel(w .LED = { UD_RED }, }; } - - DoSize(); } // デストラクタ @@ -752,8 +741,6 @@ WXX68kSoftKeyPanel::WXX68kSoftKeyPanel(w .Border = *wxBLACK, .LED = { UD_RED, UD_YELLOW_GREEN }, }; - - DoSize(); } // デストラクタ @@ -803,7 +790,7 @@ WXX68kSoftKeyPanel::DrawLED(wxDC& dc, co WXX68kSoftKeyPanel::keydata { // +- 0以上なら LED 番号 // X Y W H C L KeyCode 通常 SHIFT - { 2, L0, 10, H, 0,-1, KC_BREAK, { "BRK" } }, + { 2, L0, 10, H, 0,-1, KC_BREAK, { "\x4\x5\x6\x7" } }, { 15, L0, 10, H, 0,-1, KC_COPY, { "COPY" } }, { 29, LF, 12, 6, 0,-1, KC_F1, { "F1" } }, { 41, LF, 12, 6, 0,-1, KC_F2, { "F2" } }, @@ -920,7 +907,7 @@ WXX68kSoftKeyPanel::keydata { { 193, L4, 10, H, 0,-1, KC_PAD_1, { "1" } }, { 203, L4, 10, H, 0,-1, KC_PAD_2, { "2" } }, { 213, L4, 10, H, 0,-1, KC_PAD_3, { "3" } }, - { 223, L4, 10, HT,0,-1, KC_PAD_enter, { "ENT" } }, + { 223, L4, 10, HT,0,-1, KC_PAD_enter, { "\xb\xc\xd\xe" } }, { 193, L5, 10, H, 0,-1, KC_PAD_0, { "0" } }, { 203, L5, 10, H, 0,-1, KC_PAD_comma, { "," } }, { 213, L5, 10, H, 0,-1, KC_PAD_decimal, { "." } }, @@ -935,16 +922,20 @@ WXX68kSoftKeyPanel::keydata { // // コンストラクタ -WXSoftKeyWindow::WXSoftKeyWindow(wxWindow *parent, wxWindowID id, - vmtype_t vmtype) - : inherited(parent, id, _("Software Keyboard")) +WXSoftKeyWindow::WXSoftKeyWindow(wxWindow *parent, vmtype_t vmtype) + : inherited(parent, wxID_ANY, _("Software Keyboard")) { + wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL); + if (vmtype == VMTYPE_X68030) { panel = new WXX68kSoftKeyPanel(this); } else { panel = new WXLunaSoftKeyPanel(this); } + topsizer->Add(panel, 0, wxEXPAND); + + SetSizer(topsizer); // 大きさをそれに固定 Fit(); }