Annotation of nono/wx/wxmainframe.cpp, revision 1.1

1.1     ! root        1: //
        !             2: // nono
        !             3: // Copyright (C) 2018 [email protected]
        !             4: //
        !             5: 
        !             6: #include "vm.h"
        !             7: #include "bitmap.h"
        !             8: #include "bt454.h"
        !             9: #include "lance.h"
        !            10: #include "lcd.h"
        !            11: #include "mfp.h"
        !            12: #include "mpu.h"
        !            13: #include "netdriver.h"
        !            14: #include "rtc.h"
        !            15: #include "scheduler.h"
        !            16: #include "sio.h"
        !            17: #include "spc.h"
        !            18: #include "wxheader.h"
        !            19: #include "wxdumpmonitor.h"
        !            20: #include "wxlogmonitor.h"
        !            21: #include "wxmainframe.h"
        !            22: #include "wxmainview.h"
        !            23: #include "wxmonitor.h"
        !            24: #include "wxsoftkey.h"
        !            25: #include "wxtextpanel.h"
        !            26: #include "wxvideomonitor.h"
        !            27: 
        !            28: static void wxmainframe_poweroff_callback();
        !            29: 
        !            30: WXMainFrame *gMainFrame;
        !            31: 
        !            32: wxBEGIN_EVENT_TABLE(WXMainFrame, inherited)
        !            33:        EVT_CREATE(WXMainFrame::OnCreate)
        !            34:        EVT_MENU(wxID_EXIT, WXMainFrame::OnExit)
        !            35: 
        !            36:        EVT_MENU(ID_FULL_SPEED, WXMainFrame::OnFullSpeed)
        !            37:        EVT_UPDATE_UI(ID_FULL_SPEED, WXMainFrame::OnFullSpeedUI)
        !            38:        EVT_MENU_RANGE(ID_SCALE_START + 1, ID_SCALE_END - 1,
        !            39:                WXMainFrame::OnMenuScale)
        !            40:        EVT_UPDATE_UI_RANGE(ID_SCALE_START + 1, ID_SCALE_END - 1,
        !            41:                WXMainFrame::OnMenuScaleUI)
        !            42:        EVT_MENU_RANGE(ID_FONTSIZE_START + 1, ID_FONTSIZE_END - 1,
        !            43:                WXMainFrame::OnMenuFontSize)
        !            44:        EVT_UPDATE_UI_RANGE(ID_FONTSIZE_START + 1, ID_FONTSIZE_END - 1,
        !            45:                WXMainFrame::OnMenuFontSizeUI)
        !            46:        EVT_MENU_RANGE(WinID_Start, WinID_MAX - 1, WXMainFrame::OnWindow)
        !            47:        EVT_UPDATE_UI_RANGE(WinID_Start, WinID_MAX - 1, WXMainFrame::OnWindowUI)
        !            48: wxEND_EVENT_TABLE()
        !            49: 
        !            50: WXMainFrame::WXMainFrame(wxWindow *parent)
        !            51:        : wxFrame(parent, wxID_ANY, "mm")
        !            52: {
        !            53:        int vmtype;
        !            54: 
        !            55:        vmtype = gVM->GetType();
        !            56: 
        !            57:        // とりあえずメニュー
        !            58:        // XXX すぐにメニューファクトリーになる
        !            59:        wxMenuBar *menubar = new wxMenuBar();
        !            60:        wxMenu *menuFile = new wxMenu();
        !            61:        // XXX とりあえず適当なところにおいとく
        !            62:        menuFile->Append(ID_FULL_SPEED, wxT("高速モード"), wxT("高速モード"),
        !            63:                wxITEM_CHECK);
        !            64:        menuFile->Append(wxID_EXIT, wxT("終了"));
        !            65:        menubar->Append(menuFile, wxT("ファイル"));
        !            66: 
        !            67:        wxMenu *menuDisplay = new wxMenu();
        !            68:        wxMenu *menuViewScale = new wxMenu();
        !            69:        menuViewScale->AppendRadioItem(ID_SCALE_1_00, wxT("x1.0"),  wxT("x1.0"));
        !            70:        menuViewScale->AppendRadioItem(ID_SCALE_0_75, wxT("x0.75"), wxT("x0.75"));
        !            71:        menuViewScale->AppendRadioItem(ID_SCALE_0_50, wxT("x0.5"),  wxT("x0.5"));
        !            72:        menuDisplay->AppendSubMenu(menuViewScale, wxT("スケール"), wxT("スケール"));
        !            73:        wxMenu *menuFontSize = new wxMenu();
        !            74:        menuFontSize->AppendRadioItem(ID_FONTSIZE_12, wxT("12"), wxT("12"));
        !            75:        menuFontSize->AppendRadioItem(ID_FONTSIZE_16, wxT("16"), wxT("16"));
        !            76:        menuFontSize->AppendRadioItem(ID_FONTSIZE_24, wxT("24"), wxT("24"));
        !            77:        menuDisplay->AppendSubMenu(menuFontSize, wxT("フォントサイズ"),
        !            78:                wxT("フォントサイズ"));
        !            79:        menubar->Append(menuDisplay, wxT("表示"));
        !            80: 
        !            81:        wxMenu *menuDevice = new wxMenu();
        !            82:        menuDevice->Append(WinID_SOFTKEY, wxT("ソフトウェアキーボード"),
        !            83:                wxT("ソフトウェアキーボード"), wxITEM_CHECK);
        !            84:        menubar->Append(menuDevice, wxT("デバイス"));
        !            85: 
        !            86:        wxMenu *menuMonitor = new wxMenu();
        !            87:        menuMonitor->Append(WinID_MONITOR_SCHEDULER, wxT("スケジューラ"),
        !            88:                wxT("スケジューラ"), wxITEM_CHECK);
        !            89:        menuMonitor->Append(WinID_MONITOR_LOG, wxT("ログ"), wxT("ログ"),
        !            90:                wxITEM_CHECK);
        !            91:        menuMonitor->Append(WinID_MONITOR_MPUREG, wxT("MPU レジスタ"),
        !            92:                wxT("MPU レジスタ"), wxITEM_CHECK);
        !            93:        menuMonitor->Append(WinID_MONITOR_MPUATC, wxT("MPU(ATC)"), wxT("MPU(ATC)"),
        !            94:                wxITEM_CHECK);
        !            95:        menuMonitor->Append(WinID_MONITOR_MPUBRHIST, wxT("MPU(ブランチ履歴)"),
        !            96:                wxT("MPU(ブランチ履歴)"), wxITEM_CHECK);
        !            97:        menuMonitor->Append(WinID_MONITOR_MEMDUMP, wxT("メモリダンプ"),
        !            98:                wxT("メモリダンプ"), wxITEM_CHECK);
        !            99:        if (vmtype == VM::TYPE_X68030) {
        !           100:                menuMonitor->Append(WinID_MONITOR_MFP, wxT("MFP"), wxT("MFP"),
        !           101:                        wxITEM_CHECK);
        !           102:        }
        !           103:        menuMonitor->Append(WinID_MONITOR_SPC, wxT("SPC"), wxT("SPC"),
        !           104:                wxITEM_CHECK);
        !           105:        menuMonitor->Append(WinID_MONITOR_RTC, wxT("RTC"), wxT("RTC"),
        !           106:                wxITEM_CHECK);
        !           107:        if (vmtype == VM::TYPE_LUNA) {
        !           108:                menuMonitor->Append(WinID_MONITOR_SIO, wxT("SIO"), wxT("SIO"),
        !           109:                        wxITEM_CHECK);
        !           110:                menuMonitor->Append(WinID_MONITOR_LCD, wxT("LCD"), wxT("LCD"),
        !           111:                        wxITEM_CHECK);
        !           112:                menuMonitor->Append(WinID_MONITOR_LANCE, wxT("Lance"), wxT("Lance"),
        !           113:                        wxITEM_CHECK);
        !           114:                menuMonitor->Append(WinID_MONITOR_BITMAP, wxT("ビットマップ制御"),
        !           115:                        wxT("ビットマップ制御"), wxITEM_CHECK);
        !           116:                menuMonitor->Append(WinID_MONITOR_BITMAP0, wxT("ビットマップ#0"),
        !           117:                        wxT("ビットマップ#0"), wxITEM_CHECK);
        !           118:        }
        !           119:        menuMonitor->Append(WinID_MONITOR_NETDRIVER, wxT("ホストネットワーク"),
        !           120:                wxT("ホストネットワーク"), wxITEM_CHECK);
        !           121:        menubar->Append(menuMonitor, wxT("モニター"));
        !           122:        SetMenuBar(menubar);
        !           123: 
        !           124:        wxString title("nono");
        !           125:        switch (vmtype) {
        !           126:         case VM::TYPE_LUNA:
        !           127:                title += "(LUNA-I)";
        !           128:                break;
        !           129:         case VM::TYPE_X68030:
        !           130:                title += "(X68030)";
        !           131:                break;
        !           132:        }
        !           133:        SetTitle(title);
        !           134: 
        !           135:        // UpdateUI イベントは Idle 時に時折チェックされるらしいが、
        !           136:        // (メインビューとサブウィンドウを合わせた) タイマーイベントの粒度が
        !           137:        // 小さいためか、秒間120回とかいうレベルで UpdateUIEvent が飛んでくる
        !           138:        // っぽい (全タイマーをとめたら治る模様)。
        !           139:        // さすがにそんなに来られても気持ち悪いのと、どうせメニュー開いた瞬間
        !           140:        // 表示しようとする前には一度飛んでくるのだから、アイドル時のチェックは
        !           141:        // いらない気がする。間隔広げておいても、ぱっと見副作用はなさそうだけど
        !           142:        // 念のため事象が分かりやすいように 10秒くらいにしておく。
        !           143:        wxUpdateUIEvent::SetUpdateInterval(10000);
        !           144: 
        !           145:        wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);
        !           146: 
        !           147:        gMainView = new WXMainView(this);
        !           148:        vbox->Add(gMainView, 1, wxEXPAND | wxFIXED_MINSIZE);
        !           149: 
        !           150:        SetSizer(vbox);
        !           151: 
        !           152:        Layout();
        !           153:        Fit();
        !           154: 
        !           155:        POST_CREATE();
        !           156: }
        !           157: 
        !           158: WXMainFrame::~WXMainFrame()
        !           159: {
        !           160: }
        !           161: 
        !           162: // ウィンドウ作成イベント
        !           163: void
        !           164: WXMainFrame::OnCreate(wxCommandEvent& event)
        !           165: {
        !           166:        // ウィンドウを表示
        !           167:        for (int i = 0; i < monitor_start.size(); i++) {
        !           168:                if (monitor_start[i]) {
        !           169:                        DoWindow(i, true);
        !           170:                }
        !           171:        }
        !           172: 
        !           173:        // 時刻開始?
        !           174:        // なるべく VM が開始する直前にしたい。
        !           175:        gRTC->InitRTC();
        !           176: 
        !           177:        // VM 実行開始
        !           178:        gVM->SetPowerOffCallback(wxmainframe_poweroff_callback);
        !           179:        gVM->PowerButton();
        !           180: }
        !           181: 
        !           182: // メニューの「高速モード」イベント
        !           183: void
        !           184: WXMainFrame::OnFullSpeed(wxCommandEvent& event)
        !           185: {
        !           186:        if (event.IsChecked()) {
        !           187:                // チェックが入ったので、高速モードにする
        !           188:                gScheduler->SetFullSpeed(true);
        !           189:        } else {
        !           190:                // チェックが消えたので、通常モードにする
        !           191:                gScheduler->SetFullSpeed(false);
        !           192:        }
        !           193: }
        !           194: 
        !           195: // メニューの「高速モード」UI
        !           196: void
        !           197: WXMainFrame::OnFullSpeedUI(wxUpdateUIEvent& event)
        !           198: {
        !           199:        bool is_fullspeed = gScheduler->GetFullSpeed();
        !           200:        event.Check(is_fullspeed);
        !           201: }
        !           202: 
        !           203: // メニューの「終了」イベント
        !           204: void
        !           205: WXMainFrame::OnExit(wxCommandEvent& event)
        !           206: {
        !           207:        // ウィンドウを閉じる
        !           208:        Close();
        !           209: }
        !           210: 
        !           211: // メニューの「表示 > スケール > *」の共通イベント
        !           212: void
        !           213: WXMainFrame::OnMenuScale(wxCommandEvent& event)
        !           214: {
        !           215:        double scale;
        !           216: 
        !           217:        switch (event.GetId()) {
        !           218:         default:
        !           219:         case ID_SCALE_1_00:
        !           220:                scale = 1.0;
        !           221:                break;
        !           222:         case ID_SCALE_0_75:
        !           223:                scale = 0.75;
        !           224:                break;
        !           225:         case ID_SCALE_0_50:
        !           226:                scale = 0.5;
        !           227:                break;
        !           228:        }
        !           229:        gMainView->DoResize(scale);
        !           230: 
        !           231:        // 再レイアウト
        !           232:        Layout();
        !           233:        Fit();
        !           234: }
        !           235: 
        !           236: // メニューの「表示 > スケール > *」の共通 UI
        !           237: void
        !           238: WXMainFrame::OnMenuScaleUI(wxUpdateUIEvent& event)
        !           239: {
        !           240:        double current_scale = gMainView->GetScale();
        !           241:        double event_scale;
        !           242: 
        !           243:        switch (event.GetId()) {
        !           244:         case ID_SCALE_1_00:
        !           245:                event_scale = 1.0;
        !           246:                break;
        !           247:         case ID_SCALE_0_75:
        !           248:                event_scale = 0.75;
        !           249:                break;
        !           250:         case ID_SCALE_0_50:
        !           251:                event_scale = 0.50;
        !           252:                break;
        !           253:         default:
        !           254:                event_scale = 0;
        !           255:                break;
        !           256:        }
        !           257:        event.Check(current_scale == event_scale);
        !           258: }
        !           259: 
        !           260: // メニューの「表示 > フォントサイズ > *」の共通イベント
        !           261: void
        !           262: WXMainFrame::OnMenuFontSize(wxCommandEvent& event)
        !           263: {
        !           264:        fontsize_t fontsize;
        !           265: 
        !           266:        assert(ID_FONTSIZE_12 <= event.GetId() && event.GetId() <= ID_FONTSIZE_24);
        !           267:        switch (event.GetId()) {
        !           268:         case ID_FONTSIZE_12:
        !           269:                fontsize = FONT_6x12;
        !           270:                break;
        !           271:         case ID_FONTSIZE_16:
        !           272:                fontsize = FONT_8x16;
        !           273:                break;
        !           274:         case ID_FONTSIZE_24:
        !           275:                fontsize = FONT_12x24;
        !           276:                break;
        !           277:         default:
        !           278:                __unreachable();
        !           279:                break;
        !           280:        }
        !           281: 
        !           282:        if (fontsize != WXTextPanel::global_fontsize) {
        !           283:                WXTextPanel::global_fontsize = fontsize;
        !           284: 
        !           285:                // アクティブなサブウィンドウ全員に通知
        !           286:                for (int i = 0; i < WinID_MAX; i++) {
        !           287:                        if (windows[i] != NULL) {
        !           288:                                WXSubWindow *subwin = dynamic_cast<WXSubWindow *>(windows[i]);
        !           289:                                subwin->SetFontSize(fontsize);
        !           290:                        }
        !           291:                }
        !           292:        }
        !           293: }
        !           294: 
        !           295: // メニューの「表示 > フォントサイズ > *」共通 UI
        !           296: void
        !           297: WXMainFrame::OnMenuFontSizeUI(wxUpdateUIEvent& event)
        !           298: {
        !           299:        fontsize_t current_size = WXTextPanel::global_fontsize;
        !           300:        fontsize_t event_size = (fontsize_t)(event.GetId() - (ID_FONTSIZE_START+1));
        !           301: 
        !           302:        event.Check(current_size == event_size);
        !           303: }
        !           304: 
        !           305: // メニューのウィンドウ ID 共通イベント
        !           306: // チェックが入る方なら、ウィンドウを作成して表示。
        !           307: // チェックが消える方なら、ウィンドウを削除。
        !           308: void
        !           309: WXMainFrame::OnWindow(wxCommandEvent& event)
        !           310: {
        !           311:        int id = event.GetId();
        !           312: 
        !           313:        DoWindow(id, event.IsChecked());
        !           314: }
        !           315: 
        !           316: void
        !           317: WXMainFrame::DoWindow(int id, bool enable)
        !           318: {
        !           319:        if (enable) {
        !           320:                // チェックが入ったのでウィンドウを作成
        !           321:                switch (id) {
        !           322:                 case WinID_MONITOR_LOG:
        !           323:                        windows[id] = new WXLogMonitor(this, id);
        !           324:                        break;
        !           325:                 case WinID_MONITOR_SCHEDULER:
        !           326:                        windows[id] = new WXMonitorWindow(this, id, "スケジューラ",
        !           327:                                gScheduler);
        !           328:                        break;
        !           329:                 case WinID_MONITOR_MPUREG:
        !           330:                        windows[id] = new WXMonitorWindow(this, id, "MPU レジスタ", gMPU);
        !           331:                        break;
        !           332:                 case WinID_MONITOR_MPUATC:
        !           333:                        windows[id] = new WXMonitorWindow(this, id, "MPU (ATC)", gMPUATC);
        !           334:                        break;
        !           335:                 case WinID_MONITOR_MPUBRHIST:
        !           336:                        windows[id] = new WXMonitorWindow(this, id, "MPU (ブランチ履歴)",
        !           337:                                gMPUBrHist);
        !           338:                        break;
        !           339:                 case WinID_MONITOR_MEMDUMP:
        !           340:                        windows[id] = new WXMemdumpWindow(this, id);
        !           341:                        break;
        !           342:                 case WinID_MONITOR_MFP:
        !           343:                        windows[id] = new WXMonitorWindow(this, id, "MFP", gMFP);
        !           344:                        break;
        !           345:                 case WinID_MONITOR_SPC:
        !           346:                        windows[id] = new WXMonitorWindow(this, id, "SPC", gSPC);
        !           347:                        break;
        !           348:                 case WinID_MONITOR_RTC:
        !           349:                        windows[id] = new WXMonitorWindow(this, id, "RTC", gRTC);
        !           350:                        break;
        !           351:                 case WinID_MONITOR_SIO:
        !           352:                        windows[id] = new WXMonitorWindow(this, id, "SIO", gSIO);
        !           353:                        break;
        !           354:                 case WinID_MONITOR_LCD:
        !           355:                        windows[id] = new WXMonitorWindow(this, id, "LCD", gLCD);
        !           356:                        break;
        !           357:                 case WinID_MONITOR_LANCE:
        !           358:                        windows[id] = new WXMonitorWindow(this, id, "Lance", gLance);
        !           359:                        break;
        !           360:                 case WinID_MONITOR_NETDRIVER:
        !           361:                        windows[id] = new WXMonitorWindow(this, id, "ホストネットワーク",
        !           362:                                gNetDriver);
        !           363:                        break;
        !           364:                 case WinID_MONITOR_BITMAP:
        !           365:                        windows[id] = new WXMonitorWindow(this, id, "ビットマップ制御",
        !           366:                                gBitmap);
        !           367:                        break;
        !           368:                 case WinID_MONITOR_BITMAP0:
        !           369:                        windows[id] = new WXLunaBitmapWindow(this, id, "ビットマップ#0");
        !           370:                        break;
        !           371:                 case WinID_SOFTKEY:
        !           372:                        windows[id] = new WXLunaSoftKeyWindow(this, id);
        !           373:                        break;
        !           374:                }
        !           375:                windows[id]->Show();
        !           376:        } else {
        !           377:                // チェックが消えたのでウィンドウを終了
        !           378:                windows[id]->Close();
        !           379:                // (削除自体はこの少し下の DeleteWindow() で行なっている)
        !           380:        }
        !           381: }
        !           382: 
        !           383: // Update UI イベント
        !           384: void
        !           385: WXMainFrame::OnWindowUI(wxUpdateUIEvent& event)
        !           386: {
        !           387:        int id = event.GetId();
        !           388: 
        !           389:        // ウィンドウが存在していればチェックを表示
        !           390:        event.Check((windows[id] != NULL));
        !           391: }
        !           392: 
        !           393: // ウィンドウをリストから削除する
        !           394: // (ウィンドウの Close() から呼ばれる)
        !           395: void
        !           396: WXMainFrame::DeleteWindow(wxWindowID id)
        !           397: {
        !           398:        delete windows[id];
        !           399:        windows[id] = NULL;
        !           400: }
        !           401: 
        !           402: // VM 電源オフ時に呼ばれるコールバック。
        !           403: // (VM スレッドからアプリケーションを終了するため)
        !           404: void
        !           405: wxmainframe_poweroff_callback()
        !           406: {
        !           407:        gMainFrame->PowerOffCallback();
        !           408: }
        !           409: 
        !           410: // VM からの電源オフ処理
        !           411: void
        !           412: WXMainFrame::PowerOffCallback()
        !           413: {
        !           414:        wxCommandEvent *ev = new wxCommandEvent(wxEVT_MENU, wxID_EXIT);
        !           415:        QueueEvent(ev);
        !           416: }
        !           417: 
        !           418: // モニタウィンドウ識別名一覧
        !           419: /*static*/ const char *
        !           420: WXMainFrame::monitor_names[WinID_MAX] = {
        !           421:        "log",                  // LOG
        !           422:        "scheduler",    // SCHEDULER
        !           423:        "mpureg",               // MPUREG
        !           424:        "mpuatc",               // MPUATC
        !           425:        "mpuhist",              // MPUBRHIST
        !           426:        "memdump",              // MEMDUMP
        !           427:        "mfp",                  // MFP
        !           428:        "spc",                  // SPC
        !           429:        "rtc",                  // RTC
        !           430:        "sio",                  // SIO
        !           431:        "lcd",                  // LCD
        !           432:        "lance",                // LANCE
        !           433:        "bitmap",               // BITMAP
        !           434:        "bitmap0",              // BITMAP0
        !           435:        "netdriver",    // NETDRIVER
        !           436:        "softkey",              // SOFTKEY
        !           437: };
        !           438: 
        !           439: // 起動時にオープンするモニタウィンドウ (-M オプション)
        !           440: /*static*/ std::array<bool, WinID_MAX> WXMainFrame::monitor_start;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.