--- nono/wx/wxapp.cpp 2026/04/29 17:04:42 1.1.1.5 +++ nono/wx/wxapp.cpp 2026/04/29 17:04:53 1.1.1.7 @@ -11,7 +11,7 @@ #include "mainapp.h" #include "mpu680x0.h" #include "mpu88xx0.h" -#include "vm.h" +#include "scheduler.h" #include // イベントタイプの定義 @@ -21,8 +21,10 @@ wxDEFINE_EVENT(WXW_EVT_HALT_NOTIFY, wxCo class WXApp : public wxApp { + using inherited = wxApp; public: bool OnInit(); + int OnRun() override; private: bool ParseMonitors(const wxString& str); int SearchMonitorName(const char *name); @@ -43,12 +45,17 @@ IMPLEMENT_APP(WXApp) bool WXApp::OnInit() { + return true; +} + +int +WXApp::OnRun() +{ int rv; - rv = gMainApp.Init(false, argc, argv); + rv = gMainApp.Init1(false, argc, argv); if (rv != MainApp::PASS) { - // XXX 終了コード無視 - return false; + return rv; } // 環境変数 $NONO_BUILD_HOME が定義されていればカタログ検索パスに @@ -76,7 +83,7 @@ WXApp::OnInit() break; default: warnx("invalid fontsize: %d", gMainApp.fontsize); - return false; + return EXIT_FAILURE; } WXTextPanel::global_fontid = fontid; @@ -86,23 +93,30 @@ WXApp::OnInit() // -M 起動時に表示するモニタ if (!gMainApp.monitor_opt.empty()) { if (!ParseMonitors(gMainApp.monitor_opt)) { - return false; + return EXIT_FAILURE; } } // -s screen scale WXMainView::screen_scale = gMainApp.screen_scale; - // 引数処理が終わったので VM 開始。 - if (!gMainApp.Start()) { - return false; + // 引数処理が終わったので、スレッド作成を伴う初期化。 + if (!gMainApp.Init2()) { + return EXIT_FAILURE; + } + + // VM にコールバックを登録 + gScheduler->SetPowerOffCallback(wxmainframe_poweroff_callback); + if (gMPU680x0) { + gMPU680x0->SetHaltCallback(wxmainframe_halt_callback, this); } // メインウィンドウ gMainFrame = new WXMainFrame(NULL); gMainFrame->Show(true); SetTopWindow(gMainFrame); - return true; + + return inherited::OnRun(); } // -M オプションの解析。書式は