--- nono/wx/wxmainframe.h 2026/04/29 17:04:56 1.1.1.9 +++ nono/wx/wxmainframe.h 2026/04/29 17:05:12 1.1.1.13 @@ -4,6 +4,10 @@ // Licensed under nono-license.txt // +// +// メインウィンドウ +// + #pragma once #include "wxnono.h" @@ -11,61 +15,7 @@ #include "vm.h" #include -enum { - // ID は 0 から (wxID_LOWEST = 5000 未満まで) 使えるっぽい。 - // メニュー ID はメニュー ID 内で一意という制約があるだけ。 - // メニュー ID のうちウィンドウのオープン状態を維持する必要があるものは - // (ID が 0 から使えるのなら) 0 から割り当てて配列で管理してしまうのが - // 手っ取り早い。 - // ウィンドウに割り当てるウィンドウ ID とメニューイベントで飛んでくる - // メニュー ID は互いに干渉しないはずなので、同じ値を使うことでメニューと - // ウィンドウの紐付けをする。 - // - // ウィンドウ(サブウィンドウ)は細かくは以下のように4つに分類できるが、 - // 処理上区別が必要なのは A. (デバッガの show コマンドとも共用できる - // サブウィンドウ) とそれ以外のサブウィンドウだけ。 - // - // -----------+------------+---- - // モニター | テキスト | A. 単純なテキストモニタウィンドウ - // ウィンドウ | モニター | (SPC, MFP などのデバイスのモニター) - // | ウィンドウ +---- - // | | B. それ以外のテキストモニターウィンドウ - // | | (ログ、メモリのように表示位置があるもの、 - // | | CMMU のように構造があるもの) - // +------------+---- - // | それ以外の | C. ビデオモニターウィンドウなど - // | モニター | (ビットマッププレーン、TVRAM など) - // | ウィンドウ | - // -----------+------------+---- - // それ以外のウィンドウ | D. ソフトウェアキーボードウィンドウなど - // ------------------------+---- - - ID_SUBWIN_END_DUMMY = ID_SUBWIN_END, - - // ここから (ウィンドウでない)メニュー ID - ID_FULL_SPEED, - ID_RESTART_VM, - ID_SCALE_START, - ID_SCALE_1_00, - ID_SCALE_0_75, - ID_SCALE_0_50, - ID_SCALE_END, - - ID_FONTSIZE_START, // START 以降は fontsize_t と同じ順に並べること - ID_FONTSIZE_12, - ID_FONTSIZE_16, - ID_FONTSIZE_END, - - ID_MONRATE_START, - ID_MONRATE_20, - ID_MONRATE_5, - ID_MONRATE_1, - ID_MONRATE_END, - - ID_SHOW_STATPANEL, - ID_MOUSEMODE, - ID_RESET_BUTTON, -}; +class FDDDevice; class WXMainFrame : public wxFrame { @@ -74,33 +24,48 @@ class WXMainFrame : public wxFrame WXMainFrame(wxWindow *); virtual ~WXMainFrame() override; + // (設定反映などの) 初期化 + bool Init(); + + bool Layout() override; + // ウィンドウをリストから削除する。 // ウィンドウをクローズする際に呼び出すこと。 void DeleteWindow(wxWindow *); - // VM からの電源オフコールバック - void PowerOffCallback(); - - // VM からのダブルバスフォールト・コールバック - void HaltCallback(); - // 起動時にオープンするサブウィンドウの一覧 static std::array subwindow_start; // モニタウィンドウの更新頻度取得 int GetMonitorRate() const { return monitor_rate; } + // SCSI リムーバブルデバイス、FD 用のメニューを作成して返す + wxMenu *CreateSCSIRemovableMenu(uint id) const; + wxMenu *CreateFDMenu(int unit) const; + + // FD を挿入する + void InsertFD(int unit, const std::string& path); + // FD をイジェクトする + void EjectFD(int unit, bool force); + + // CD を挿入する + void InsertCD(int id, const std::string& path); + // CD をイジェクトする + void EjectCD(int id, bool force); + private: - void OnPaint(wxPaintEvent& event); + void OnIdle(wxIdleEvent& event); void OnClose(wxCloseEvent& event); void OnActivate(wxActivateEvent& event); - void OnFullSpeed(wxCommandEvent& event); - void OnFullSpeedUI(wxUpdateUIEvent& event); void OnRestartVM(wxCommandEvent& event); - void OnExit(wxCommandEvent&); + void OnFullSpeed(wxCommandEvent& event); + void OnFullSpeedUI(wxUpdateUIEvent& event); + void OnMenuInput(wxCommandEvent& event); + void OnMenuInputUI(wxUpdateUIEvent& event); + void OnMenuScale(wxCommandEvent& event); void OnMenuScaleUI(wxUpdateUIEvent& event); void OnMenuFontSize(wxCommandEvent& event); @@ -110,9 +75,26 @@ class WXMainFrame : public wxFrame void OnShowStatusPanel(wxCommandEvent& event); void OnShowStatusPanelUI(wxUpdateUIEvent& event); + void OnFDInsert(wxCommandEvent& event); + void OnFDInsertUI(wxUpdateUIEvent& event); + void OnFDEject(wxCommandEvent& event); + void OnFDEjectUI(wxUpdateUIEvent& event); + void OnFDForce(wxCommandEvent& event); + void OnFDForceUI(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 OnPowerButton(wxCommandEvent& event); + void OnPowerButtonUI(wxUpdateUIEvent& event); void OnResetButton(wxCommandEvent& event); + void OnNMIButton(wxCommandEvent& event); + void OnKeyboardConnect(wxCommandEvent& event); + void OnKeyboardConnectUI(wxUpdateUIEvent& event); void OnWindow(wxCommandEvent&); void DoWindow(int id, bool enable); @@ -120,6 +102,9 @@ class WXMainFrame : public wxFrame void OnAbout(wxCommandEvent&); + // リムーバブルデバイス用のメニューを作成して追加する + void CreateRemovableMenu(wxMenu *); + // ウィンドウをリストに追加する。 void AddWindow(int id, wxWindow *); @@ -134,14 +119,23 @@ class WXMainFrame : public wxFrame // モニタ更新頻度 ID -> 数値変換 static const int IDtoMonRate[]; + // メニュー操作用の SCSI デバイス + // (ホストアダプタが増えた時のことは考えていない) + std::array scsidev {}; + + // メニュー操作用の FDD デバイス + // (6台構成のことは考えていない) + std::array fdd_array {}; + + // ファイルダイアログを表示する際のカレントディレクトリ + std::string current_dir {}; + // ダブルバスフォールト・イベント void OnHaltNotify(wxCommandEvent& event); + // メディア挿入失敗通知 + void OnInsertFailed(wxCommandEvent& event); wxDECLARE_EVENT_TABLE(); }; extern WXMainFrame *gMainFrame; - -// コールバック関数 -extern void wxmainframe_poweroff_callback(); -extern void wxmainframe_halt_callback(void *);