--- nono/wx/wxmainframe.h 2026/04/29 17:04:30 1.1.1.2 +++ nono/wx/wxmainframe.h 2026/04/29 17:05:04 1.1.1.11 @@ -1,48 +1,56 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #pragma once +#include "wxnono.h" +#include "monitor.h" +#include "vm.h" #include enum { // ID は 0 から (wxID_LOWEST = 5000 未満まで) 使えるっぽい。 // メニュー ID はメニュー ID 内で一意という制約があるだけ。 - // メニュー ID のうちウィンドウのオープン状態を維持する必要がある - // ものはリスト(なり配列なり)で管理したいが、ID が 0 から使えるのなら - // 0 から割り当てて配列で管理してしまうのが手っ取り早い。 + // メニュー ID のうちウィンドウのオープン状態を維持する必要があるものは + // (ID が 0 から使えるのなら) 0 から割り当てて配列で管理してしまうのが + // 手っ取り早い。 // ウィンドウに割り当てるウィンドウ ID とメニューイベントで飛んでくる - // メニュー ID は互いに干渉しないはずなので、同じ値を使ってメニューと + // メニュー ID は互いに干渉しないはずなので、同じ値を使うことでメニューと // ウィンドウの紐付けをする。 + // + // ウィンドウ(サブウィンドウ)は細かくは以下のように4つに分類できるが、 + // 処理上区別が必要なのは A. (デバッガの show コマンドとも共用できる + // サブウィンドウ) とそれ以外のサブウィンドウだけ。 + // + // -----------+------------+---- + // モニター | テキスト | A. 単純なテキストモニタウィンドウ + // ウィンドウ | モニター | (SPC, MFP などのデバイスのモニター) + // | ウィンドウ +---- + // | | B. それ以外のテキストモニターウィンドウ + // | | (ログ、メモリのように表示位置があるもの、 + // | | CMMU のように構造があるもの) + // +------------+---- + // | それ以外の | C. ビデオモニターウィンドウなど + // | モニター | (ビットマッププレーン、TVRAM など) + // | ウィンドウ | + // -----------+------------+---- + // それ以外のウィンドウ | D. ソフトウェアキーボードウィンドウなど + // ------------------------+---- + + ID_SUBWIN_END_DUMMY = ID_SUBWIN_END, + + // ここから (ウィンドウでない)メニュー ID + ID_RESTART_VM, + ID_FULL_SPEED, + + ID_INPUT_START, + ID_INPUT_CHAR, + ID_INPUT_JP, + ID_INPUT_END, - // ウィンドウ ID (メニュー ID としても使う) - // wxmainframe.cpp 末尾の monitor_names[] と一致させること - WinID_Start = 0, - WinID_MONITOR_LOG = WinID_Start, - WinID_MONITOR_SCHEDULER, - WinID_MONITOR_MPUREG, - WinID_MONITOR_MPUATC, - WinID_MONITOR_MPUBRHIST, - WinID_MONITOR_MEMDUMP, - WinID_MONITOR_MFP, - WinID_MONITOR_SPC, - WinID_MONITOR_RTC, - WinID_MONITOR_SIO, - WinID_MONITOR_LUNAKEYBOARD, - WinID_MONITOR_LCD, - WinID_MONITOR_LANCE, - WinID_MONITOR_BITMAP, - WinID_MONITOR_BITMAP0, - WinID_MONITOR_NETDRIVER, - WinID_SOFTKEY, - - // ウィンドウ ID ここまで。 - WinID_MAX, - - // ここからそれ以外の ID - ID_FULL_SPEED = WinID_MAX, ID_SCALE_START, ID_SCALE_1_00, ID_SCALE_0_75, @@ -52,54 +60,118 @@ enum { ID_FONTSIZE_START, // START 以降は fontsize_t と同じ順に並べること ID_FONTSIZE_12, ID_FONTSIZE_16, - ID_FONTSIZE_24, ID_FONTSIZE_END, + ID_MONRATE_START, + ID_MONRATE_20, + ID_MONRATE_5, + ID_MONRATE_1, + ID_MONRATE_END, + + ID_SHOW_STATPANEL, + + // CD/MO (リムーバブルデバイス) + ID_CD_INSERT_0, + ID_CD_INSERT_1, + ID_CD_INSERT_2, + ID_CD_INSERT_3, + ID_CD_INSERT_4, + ID_CD_INSERT_5, + ID_CD_INSERT_6, + ID_CD_INSERT_7, + ID_CD_EJECT_0, + ID_CD_EJECT_1, + ID_CD_EJECT_2, + ID_CD_EJECT_3, + ID_CD_EJECT_4, + ID_CD_EJECT_5, + ID_CD_EJECT_6, + ID_CD_EJECT_7, + ID_CD_FORCE_0, + ID_CD_FORCE_1, + ID_CD_FORCE_2, + ID_CD_FORCE_3, + ID_CD_FORCE_4, + ID_CD_FORCE_5, + ID_CD_FORCE_6, + ID_CD_FORCE_7, + ID_MOUSEMODE, + ID_RESET_BUTTON, }; +#define ID_CD_INSERT(id) (ID_CD_INSERT_0 + (id)) +#define ID_CD_EJECT(id) (ID_CD_EJECT_0 + (id)) +#define ID_CD_FORCE(id) (ID_CD_FORCE_0 + (id)) -class WXMainFrame - : public wxFrame +class WXMainFrame : public wxFrame { - typedef wxFrame inherited; + using inherited = wxFrame; public: WXMainFrame(wxWindow *); - virtual ~WXMainFrame(); + virtual ~WXMainFrame() override; + + // (設定反映などの) 初期化 + bool Init(); // ウィンドウをリストから削除する。 // ウィンドウをクローズする際に呼び出すこと。 - void DeleteWindow(wxWindowID id); + void DeleteWindow(wxWindow *); - // VM からの電源オフコールバック - void PowerOffCallback(); + // 起動時にオープンするサブウィンドウの一覧 + static std::array subwindow_start; - // モニタウィンドウ識別名一覧 - // (引数 -M で指定されるやつ) - static const char *monitor_names[WinID_MAX]; + // モニタウィンドウの更新頻度取得 + int GetMonitorRate() const { return monitor_rate; } - // 起動時にオープンするモニタウィンドウの一覧 - static std::array monitor_start; + // SCSI リムーバブルデバイス用のメニューを作成して返す + wxMenu *CreateSCSIRemovableMenu(uint id) const; + + // CD を挿入する + void InsertCD(int id, const std::string& path); + // CD をイジェクトする + void EjectCD(int id, bool force); private: - void OnCreate(wxCommandEvent& event); + void OnIdle(wxIdleEvent& event); + void OnClose(wxCloseEvent& event); + void OnActivate(wxActivateEvent& event); + + void OnRestartVM(wxCommandEvent& event); + void OnExit(wxCommandEvent&); void OnFullSpeed(wxCommandEvent& event); void OnFullSpeedUI(wxUpdateUIEvent& event); - - void OnExit(wxCommandEvent&); + void OnMenuInput(wxCommandEvent& event); + void OnMenuInputUI(wxUpdateUIEvent& event); void OnMenuScale(wxCommandEvent& event); void OnMenuScaleUI(wxUpdateUIEvent& event); void OnMenuFontSize(wxCommandEvent& event); void OnMenuFontSizeUI(wxUpdateUIEvent& event); - + void OnMenuMonRate(wxCommandEvent& event); + void OnMenuMonRateUI(wxUpdateUIEvent& event); + void OnShowStatusPanel(wxCommandEvent& event); + void OnShowStatusPanelUI(wxUpdateUIEvent& event); + + void OnCDInsert(wxCommandEvent& event); + void OnCDInsertUI(wxUpdateUIEvent& event); + void OnCDEject(wxCommandEvent& event); + void OnCDEjectUI(wxUpdateUIEvent& event); + void OnCDForce(wxCommandEvent& event); + void OnCDForceUI(wxUpdateUIEvent& event); void OnMouseMode(wxCommandEvent& event); void OnMouseModeUI(wxUpdateUIEvent& event); + void OnResetButton(wxCommandEvent& event); void OnWindow(wxCommandEvent&); void DoWindow(int id, bool enable); void OnWindowUI(wxUpdateUIEvent&); + void OnAbout(wxCommandEvent&); + + // リムーバブルデバイス用のメニューを作成して追加する + void CreateRemovableMenu(wxMenu *); + // ウィンドウをリストに追加する。 void AddWindow(int id, wxWindow *); @@ -107,7 +179,24 @@ class WXMainFrame bool IsExistWindow(int id); // サブウィンドウリスト - wxWindow *windows[WinID_MAX] {}; + std::unique_ptr windows[ID_SUBWIN_MAX] {}; + + // モニタの更新頻度(これが実行中の一次情報) + int monitor_rate {}; + // モニタ更新頻度 ID -> 数値変換 + static const int IDtoMonRate[]; + + // メニュー操作用の SCSI デバイス + // (ホストアダプタが増えた時のことは考えていない) + std::array scsidev {}; + + // ファイルダイアログを表示する際のカレントディレクトリ + std::string current_dir {}; + + // ダブルバスフォールト・イベント + void OnHaltNotify(wxCommandEvent& event); + // メディア挿入失敗通知 + void OnInsertCDFailed(wxCommandEvent& event); wxDECLARE_EVENT_TABLE(); };