--- nono/wx/wxmainview.cpp 2026/04/29 17:05:27 1.1.1.15 +++ nono/wx/wxmainview.cpp 2026/04/29 17:05:57 1.1.1.20 @@ -9,9 +9,9 @@ // #include "wxmainview.h" +#include "wxmainframe.h" #include "wxuimessage.h" #include "config.h" -#include "event.h" #include "keyboard.h" #include "renderer.h" #include @@ -61,13 +61,23 @@ wxEND_EVENT_TABLE() WXMainView::WXMainView(wxWindow *parent) : inherited(parent) { - // デバイスを取得。Keyboard は NULL の可能性あり。 - keyboard = gMainApp.FindObject(OBJ_KEYBOARD); - renderer = GetRenderer(); + SetName("WXMainView"); + + // デバイスを取得。 + renderer = GetVideoRenderer(); + + // rich dumb + // -------- ------- + // NULL NULL キー入力機能なし + // NULL avail シリアル入力機能のみ + // avail avail キー入力機能あり (2つは同じポインタ) + dumbkbd = gMainApp.FindObject(OBJ_KEYBOARD); + if (dumbkbd) { + richkbd = dynamic_cast(dumbkbd); + } // マウスモード変更イベント - Connect(NONO_EVT_MOUSEMODE, - wxCommandEventHandler(WXMainView::OnMouseMode), NULL, this); + Bind(NONO_EVT_MOUSEMODE, &WXMainView::OnMouseMode, this); // VM からの通知を受け取る WXUIMessage::Connect(UIMessage::RENDER, this, @@ -76,8 +86,8 @@ WXMainView::WXMainView(wxWindow *parent) // 実画面 (ウィンドウの大きさ) DoResize(screen_scale); - // 更新間隔 - renderer->SetRefreshInterval(33_msec); + // 更新間隔 [msec] + renderer->SetRefreshInterval(33); // 最初に一度描画 Refresh(); @@ -97,7 +107,7 @@ WXMainView::~WXMainView() bool WXMainView::Init() { - if (keyboard) { + if (richkbd) { // キーボードの入力モードの初期値設定 const ConfigItem& item_input = gConfig->Find("hostkbd-input"); const std::string input_mode = item_input.AsString(); @@ -110,6 +120,9 @@ WXMainView::Init() item_input.Err(); return false; } + } else if (dumbkbd) { + // シリアルキーボードのみなら常に文字入力。 + SetCharInputMode(true); } return true; @@ -176,8 +189,8 @@ WXMainView::DoResize(double scale) renderer->ResizeView(viewwidth, viewheight); // ウィンドウサイズ変更 - SetClientSize(viewwidth, viewheight); - SetMinClientSize(wxSize(viewwidth, viewheight)); + SetSize(viewwidth, viewheight); + SetMinSize(wxSize(viewwidth, viewheight)); } } @@ -225,7 +238,7 @@ WXMainView::SetMouseMode(bool mode) // このウィンドウから外れないように移動を検出し続けるため、 // マウスカーソルをウィンドウ中央に移す。 // ウィンドウとメニューバーが分離してる wxOSX のために必要。 - MyWarpPointer(GetClientSize() / 2); + MyWarpPointer(GetSize() / 2); } else { // マウスモードを OFF にする DMPRINTF("SetMouseMode OFF\n"); @@ -235,12 +248,16 @@ WXMainView::SetMouseMode(bool mode) } // 分かりやすさのため、マウスカーソルを中央へ戻してから復帰 - wxSize pt = GetClientSize() / 2; + wxSize pt = GetSize() / 2; WarpPointer(pt.x, pt.y); // マウスカーソル ON ::wxSetCursor(wxNullCursor); } + + // マウスモードなら、タイトルにマウスモードの抜け方を表示したい。 + auto frame = dynamic_cast(GetParent()); + frame->SetMyTitle(mousemode); } // マウスカーソルをクライアント座標 (x, y) に移動 @@ -322,7 +339,7 @@ WXMainView::OnMouse(wxMouseEvent& event) // マウスカーソルを中心に戻す if (dx != 0 || dy != 0) { - MyWarpPointer(GetClientSize() / 2); + MyWarpPointer(GetSize() / 2); } } } @@ -340,8 +357,8 @@ WXMainView::OnMouse(wxMouseEvent& event) (mb ? 'M' : '-'), (rb ? 'R' : '-')); - if (keyboard) { - keyboard->MouseInput(dx, dy, rb, lb, mb); + if (richkbd) { + richkbd->MouseInput(dx, dy, rb, lb, mb); } } @@ -454,8 +471,8 @@ WXMainView::OnKeyDown(wxKeyEvent& event) DKPRINTF("KeyDown "); int keycode = GetKeyCode(event); - if (keyboard) { - keyboard->MakeKey(keycode); + if (richkbd) { + richkbd->MakeKey(keycode); } } @@ -469,8 +486,8 @@ WXMainView::OnKeyUp(wxKeyEvent& event) DKPRINTF("KeyUp "); int keycode = GetKeyCode(event); - if (keyboard) { - keyboard->BreakKey(keycode); + if (richkbd) { + richkbd->BreakKey(keycode); } } @@ -544,8 +561,8 @@ WXMainView::OnChar(wxKeyEvent& event) } ukey &= 0xff; - if (keyboard) { - keyboard->CharInput(ukey); + if (dumbkbd) { + dumbkbd->CharInput(ukey); } }