--- nono/wx/wxmainframe.cpp 2026/04/29 17:04:59 1.1.1.11 +++ nono/wx/wxmainframe.cpp 2026/04/29 17:05:04 1.1.1.12 @@ -33,9 +33,13 @@ wxBEGIN_EVENT_TABLE(WXMainFrame, inherit EVT_CLOSE(WXMainFrame::OnClose) EVT_MENU(wxID_EXIT, WXMainFrame::OnExit) + EVT_MENU(ID_RESTART_VM, WXMainFrame::OnRestartVM) EVT_MENU(ID_FULL_SPEED, WXMainFrame::OnFullSpeed) EVT_UPDATE_UI(ID_FULL_SPEED, WXMainFrame::OnFullSpeedUI) - EVT_MENU(ID_RESTART_VM, WXMainFrame::OnRestartVM) + EVT_MENU_RANGE(ID_INPUT_START + 1, ID_INPUT_END - 1, + WXMainFrame::OnMenuInput) + EVT_UPDATE_UI_RANGE(ID_INPUT_START + 1, ID_INPUT_END -1, + WXMainFrame::OnMenuInputUI) 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, @@ -77,17 +81,24 @@ WXMainFrame::WXMainFrame(wxWindow *paren vmtype_t vmtype; vmtype = gMainApp.GetVMType(); - // とりあえずメニュー - // XXX すぐにメニューファクトリーになる + // メニュー wxMenuBar *menubar = new wxMenuBar(); + // メニュー > ファイル wxMenu *menuFile = new wxMenu(); - // XXX とりあえず適当なところにおいとく - menuFile->Append(ID_FULL_SPEED, _("Full &Speed Mode"), "", wxITEM_CHECK); - menuFile->AppendSeparator(); menuFile->Append(ID_RESTART_VM, _("&Restart VM"), ""); menuFile->Append(wxID_EXIT, _("E&xit")); menubar->Append(menuFile, _("&File")); + // メニュー > 設定 + wxMenu *menuSet = new wxMenu(); + menuSet->Append(ID_FULL_SPEED, _("Full &Speed Mode"), "", wxITEM_CHECK); + wxMenu *menuSetInput = new wxMenu(); + menuSetInput->AppendRadioItem(ID_INPUT_CHAR, _("By &Character")); + menuSetInput->AppendRadioItem(ID_INPUT_JP, _("&JP Keyboard")); + menuSet->AppendSubMenu(menuSetInput, _("&Key Input")); + menubar->Append(menuSet, _("&Setting")); + + // メニュー > 表示 wxMenu *menuDisplay = new wxMenu(); wxMenu *menuViewScale = new wxMenu(); menuViewScale->Append(ID_SCALE_1_00, _("x1.&0"), "", wxITEM_CHECK); @@ -107,6 +118,7 @@ WXMainFrame::WXMainFrame(wxWindow *paren wxITEM_CHECK); menubar->Append(menuDisplay, _("&View")); + // メニュー > デバイス wxMenu *menuDevice = new wxMenu(); CreateRemovableMenu(menuDevice); menuDevice->Append(ID_SUBWIN_SOFTKEY, _("Software &Keyboard"), @@ -136,6 +148,7 @@ WXMainFrame::WXMainFrame(wxWindow *paren } \ } while (0) + // メニュー > モニター wxMenu *menuMonitor = new wxMenu(); AppendIf(menuMonitor, ID_MONITOR_SCHEDULER, _("&Scheduler")); AppendIf(menuMonitor, ID_SUBWIN_LOG, _("&Log")); @@ -192,6 +205,7 @@ WXMainFrame::WXMainFrame(wxWindow *paren menubar->Append(menuMonitor, _("&Monitor")); + // メニュー > ヘルプ #if defined(__WXOSX__) // OSX では wxID_ABOUT はリンゴメニューに入れるしきたりになっている。 // Append() すると Quit より下に来てしまうので、Prepend() で上に追加。 @@ -343,6 +357,18 @@ WXMainFrame::CreateSCSIRemovableMenu(uin } } +// (設定反映などの) 初期化。 +// 成功すれば true、失敗すれば false を返す。 +bool +WXMainFrame::Init() +{ + if (!gMainView->Init()) { + return false; + } + + return true; +} + // ウィンドウ作成イベント (を実現するためここではアイドルイベントを使う) // // 初期化(っぽい)もののうちコンストラクタでは早すぎるものは、コンストラクタ @@ -406,6 +432,21 @@ WXMainFrame::OnClose(wxCloseEvent& event event.Skip(); } +// メニューの「Restart VM」イベント +void +WXMainFrame::OnRestartVM(wxCommandEvent& event) +{ + gScheduler->RequestRestartVM(); +} + +// メニューの「終了」イベント +void +WXMainFrame::OnExit(wxCommandEvent& event) +{ + // ウィンドウを閉じる + Close(); +} + // メニューの「高速モード」イベント void WXMainFrame::OnFullSpeed(wxCommandEvent& event) @@ -427,19 +468,26 @@ WXMainFrame::OnFullSpeedUI(wxUpdateUIEve event.Check(is_fullspeed); } -// メニューの「Restart VM」イベント +// メニューの「設定 > 入力 > *」の共通イベント void -WXMainFrame::OnRestartVM(wxCommandEvent& event) +WXMainFrame::OnMenuInput(wxCommandEvent& event) { - gScheduler->RequestRestartVM(); + bool char_mode = (event.GetId() == ID_INPUT_CHAR); + + gMainView->SetCharInputMode(char_mode); } -// メニューの「終了」イベント +// メニューの「設定 > 入力 > *」の共通 UI void -WXMainFrame::OnExit(wxCommandEvent& event) +WXMainFrame::OnMenuInputUI(wxUpdateUIEvent& event) { - // ウィンドウを閉じる - Close(); + bool char_mode = gMainView->GetCharInputMode(); + + if (char_mode) { + event.Check(event.GetId() == ID_INPUT_CHAR); + } else { + event.Check(event.GetId() == ID_INPUT_JP); + } } // メニューの「表示 > スケール > *」の共通イベント