--- nono/wx/wxmainframe.cpp 2026/04/29 17:04:51 1.1.1.8 +++ nono/wx/wxmainframe.cpp 2026/04/29 17:04:53 1.1.1.9 @@ -13,6 +13,7 @@ #include "wxmonitor.h" #include "wxmpumonitor.h" #include "wxsoftkey.h" +#include "wxstatuspanel.h" #include "wxtextpanel.h" #include "wxversion.h" #include "wxvideomonitor.h" @@ -37,9 +38,6 @@ #include "spc.h" #include "vm.h" -static void wxmainframe_poweroff_callback(); -static void wxmainframe_halt_callback(void *); - WXMainFrame *gMainFrame; wxBEGIN_EVENT_TABLE(WXMainFrame, inherited) @@ -49,7 +47,7 @@ wxBEGIN_EVENT_TABLE(WXMainFrame, inherit EVT_MENU(ID_FULL_SPEED, WXMainFrame::OnFullSpeed) EVT_UPDATE_UI(ID_FULL_SPEED, WXMainFrame::OnFullSpeedUI) - EVT_MENU(ID_RESET_VM, WXMainFrame::OnResetVM) + EVT_MENU(ID_RESTART_VM, WXMainFrame::OnRestartVM) EVT_MENU_RANGE(ID_SCALE_START + 1, ID_SCALE_END - 1, WXMainFrame::OnMenuScale) EVT_UPDATE_UI_RANGE(ID_SCALE_START + 1, ID_SCALE_END - 1, @@ -62,8 +60,11 @@ wxBEGIN_EVENT_TABLE(WXMainFrame, inherit WXMainFrame::OnMenuMonRate) EVT_UPDATE_UI_RANGE(ID_MONRATE_START + 1, ID_MONRATE_END - 1, WXMainFrame::OnMenuMonRateUI) + EVT_MENU(ID_SHOW_STATPANEL, WXMainFrame::OnShowStatusPanel) + EVT_UPDATE_UI(ID_SHOW_STATPANEL, WXMainFrame::OnShowStatusPanelUI) EVT_MENU(ID_MOUSEMODE, WXMainFrame::OnMouseMode) EVT_UPDATE_UI(ID_MOUSEMODE, WXMainFrame::OnMouseModeUI) + EVT_MENU(ID_RESET_BUTTON, WXMainFrame::OnResetButton) EVT_MENU_RANGE(WinID_Start, WinID_MAX - 1, WXMainFrame::OnWindow) EVT_UPDATE_UI_RANGE(WinID_Start, WinID_MAX - 1, WXMainFrame::OnWindowUI) EVT_MENU(wxID_ABOUT, WXMainFrame::OnAbout) @@ -72,7 +73,7 @@ wxBEGIN_EVENT_TABLE(WXMainFrame, inherit wxEND_EVENT_TABLE() WXMainFrame::WXMainFrame(wxWindow *parent) - : wxFrame(parent, wxID_ANY, "nono", wxDefaultPosition, wxDefaultSize, + : inherited(parent, wxID_ANY, "nono", wxDEFAULT_FRAME_STYLE & ~wxMAXIMIZE_BOX & ~wxRESIZE_BORDER) { vmtype_t vmtype; @@ -85,7 +86,8 @@ WXMainFrame::WXMainFrame(wxWindow *paren wxMenu *menuFile = new wxMenu(); // XXX とりあえず適当なところにおいとく menuFile->Append(ID_FULL_SPEED, _("Full &Speed Mode"), "", wxITEM_CHECK); - menuFile->Append(ID_RESET_VM, _("&Reset VM"), ""); + menuFile->AppendSeparator(); + menuFile->Append(ID_RESTART_VM, _("&Restart VM"), ""); menuFile->Append(wxID_EXIT, _("E&xit")); menubar->Append(menuFile, _("&File")); @@ -104,6 +106,8 @@ WXMainFrame::WXMainFrame(wxWindow *paren menuMonRate->AppendRadioItem(ID_MONRATE_5, _("Middle (&5Hz)")); menuMonRate->AppendRadioItem(ID_MONRATE_1, _("Low (&1Hz)")); menuDisplay->AppendSubMenu(menuMonRate, _("&Monitor Speed")); + menuDisplay->Append(ID_SHOW_STATPANEL, _("Show Status &Panel"), "", + wxITEM_CHECK); menubar->Append(menuDisplay, _("&View")); wxMenu *menuDevice = new wxMenu(); @@ -115,6 +119,8 @@ WXMainFrame::WXMainFrame(wxWindow *paren menuDevice->Append(WinID_LCD, _("Front &LCD"), "", wxITEM_CHECK); } + menuDevice->AppendSeparator(); + menuDevice->Append(ID_RESET_BUTTON, _("Push &Reset button")); menubar->Append(menuDevice, _("&Device")); // 機種によってモニタウィンドウを追加する @@ -213,18 +219,29 @@ WXMainFrame::WXMainFrame(wxWindow *paren wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL); + gStatusPanel = new WXStatusPanel(this); + vbox->Add(gStatusPanel, 0, wxEXPAND); + gMainView = new WXMainView(this); vbox->Add(gMainView, 1, wxEXPAND | wxFIXED_MINSIZE); + // SHOW イベントを最初にも一度起こしたいため + // ステータスパネルを一旦非表示にする (これで SHOW(false) イベントが飛ぶ) + gStatusPanel->Hide(); + const ConfigItem& item_show = gConfig->Find("show-statuspanel"); + if (item_show.AsInt() != 0) { + // 必要なら改めて表示 (これで SHOW(true) イベントが飛ぶ) + gStatusPanel->Show(); + } + SetSizer(vbox); - Layout(); Fit(); // モニタの更新頻度は初期値だけ設定から読んで、あとはここで管理する。 // 不正値ならデフォルトの 15Hz にしておくか - const ConfigItem& item = gConfig->Find("monitor-rate"); - monitor_rate = item.AsInt(); + const ConfigItem& item_rate = gConfig->Find("monitor-rate"); + monitor_rate = item_rate.AsInt(); if (monitor_rate < 1 || monitor_rate > 60) { monitor_rate = 15; } @@ -254,13 +271,7 @@ WXMainFrame::OnCreate(wxCommandEvent& ev } } - // VM にコールバックを登録 - gVM->SetPowerOffCallback(wxmainframe_poweroff_callback); - if (gMPU680x0) { - gMPU680x0->SetHaltCallback(wxmainframe_halt_callback, this); - } - - // VM 実行開始 + // 電源投入 gVM->PowerButton(); } @@ -268,6 +279,9 @@ WXMainFrame::OnCreate(wxCommandEvent& ev void WXMainFrame::OnClose(wxCloseEvent& event) { + // ステータスパネルの更新を停止 + gStatusPanel->Close(); + // サブウィンドウを全部閉じる for (int i = 0; i < WinID_MAX; i++) { if ((bool)windows[i]) { @@ -304,11 +318,11 @@ WXMainFrame::OnFullSpeedUI(wxUpdateUIEve event.Check(is_fullspeed); } -// メニューの「Reset VM」イベント +// メニューの「Restart VM」イベント void -WXMainFrame::OnResetVM(wxCommandEvent& event) +WXMainFrame::OnRestartVM(wxCommandEvent& event) { - gScheduler->RequestResetHard(); + gScheduler->RequestRestartVM(); } // メニューの「終了」イベント @@ -340,7 +354,6 @@ WXMainFrame::OnMenuScale(wxCommandEvent& gMainView->DoResize(scale); // 再レイアウト - Layout(); Fit(); } @@ -391,6 +404,12 @@ WXMainFrame::OnMenuFontSize(wxCommandEve subwin->SetFontSize(fontid); } } + + // ステータスパネルに通知 + gStatusPanel->SetFontSize(fontid); + + // ステータスパネルの大きさが変わるので再レイアウト + Fit(); } } @@ -445,6 +464,26 @@ WXMainFrame::OnMenuMonRateUI(wxUpdateUIE event.Check(monitor_rate == event_rate); } +// メニューの「表示 > ステータスパネルを表示」 +void +WXMainFrame::OnShowStatusPanel(wxCommandEvent& event) +{ + // enable ならチェックを付けようとして呼ばれた + bool enable = event.IsChecked(); + + gStatusPanel->Show(enable); + + // 再レイアウト + Fit(); +} + +// メニューの「表示 > ステータスパネルを表示」UI +void +WXMainFrame::OnShowStatusPanelUI(wxUpdateUIEvent& event) +{ + event.Check(gStatusPanel->IsShown()); +} + // メニューの「デバイス > マウスモード」 void WXMainFrame::OnMouseMode(wxCommandEvent& event) @@ -469,6 +508,14 @@ WXMainFrame::OnMouseModeUI(wxUpdateUIEve event.Check(gMainView->GetMouseMode()); } +// メニューの「デバイス > Push Reset Button」イベント +// こっちは本体リセットボタンによるリセット +void +WXMainFrame::OnResetButton(wxCommandEvent& event) +{ + gScheduler->RequestResetHard(); +} + // メニューのウィンドウ ID 共通イベント // チェックが入る方なら、ウィンドウを作成して表示。 // チェックが消える方なら、ウィンドウを削除。 @@ -592,11 +639,8 @@ WXMainFrame::DoWindow(int id, bool enabl windows[id].reset(new WXLunaBitmapWindow(this, id, _("Bitmap #0"))); break; case WinID_SOFTKEY: - if (gMainApp.GetVMType() == VMTYPE_X68030) { - windows[id].reset(new WXX68kSoftKeyWindow(this, id)); - } else { - windows[id].reset(new WXLunaSoftKeyWindow(this, id)); - } + windows[id].reset(new WXSoftKeyWindow(this, id, + gMainApp.GetVMType())); break; case WinID_LCD: windows[id].reset(new WXLCDWindow(this, id));