Annotation of nono/wx/wxapp.cpp, revision 1.1.1.1

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2018 [email protected]
                      4: //
                      5: 
                      6: #include "vm.h"
                      7: #include "wxheader.h"
                      8: #include "wxmainframe.h"
                      9: #include "wxmainview.h"
                     10: #include "wxtextpanel.h"
                     11: #include "mainapp.h"
                     12: #include <wx/cmdline.h>
                     13: 
                     14: // イベントタイプの定義
                     15: DEFINE_EVENT_TYPE(WXW_EVT_CREATE);
                     16: DEFINE_EVENT_TYPE(WXW_EVT_MONITOR_UPDATE);
                     17: 
                     18: // コマンドラインオプションとか
                     19: bool console_log;
                     20: 
                     21: // コマンドラインオプション
                     22: static const wxCmdLineEntryDesc cmddesc[] =
                     23: {
                     24:        { wxCMD_LINE_OPTION, "b", "b", "breakpoint", wxCMD_LINE_VAL_STRING },
                     25:        { wxCMD_LINE_OPTION, "c", "c", "vm directory", wxCMD_LINE_VAL_STRING },
                     26:        { wxCMD_LINE_SWITCH, "d", "d", "debugger prompt on startup", },
                     27:        { wxCMD_LINE_SWITCH, "C", "C", "console log" },
                     28:        { wxCMD_LINE_SWITCH, "f", "f", "fast mode" },
                     29:        { wxCMD_LINE_OPTION, "L", "L", "loglevel (-L help displays names)",
                     30:                wxCMD_LINE_VAL_STRING },
                     31:        { wxCMD_LINE_OPTION, "M", "M", "monitors to display at startup",
                     32:                wxCMD_LINE_VAL_STRING },
                     33:        { wxCMD_LINE_OPTION, "s", "s", "screen scale", wxCMD_LINE_VAL_STRING },
                     34:        { wxCMD_LINE_OPTION, "", "fontsize", "font size {12, 16, 24} (default:12)",
                     35:                wxCMD_LINE_VAL_STRING },
                     36:        { wxCMD_LINE_SWITCH, "v", "v", "version" },
                     37: 
                     38:        { wxCMD_LINE_NONE },
                     39: };
                     40: 
                     41: class WXApp
                     42:        : public wxApp
                     43: {
                     44:  public:
                     45:        bool OnInit();
                     46:  private:
                     47:        bool Parse();
                     48:        bool ParseMonitors(const wxString& str);
                     49:        int SearchMonitorName(const char *name);
                     50: };
                     51: 
                     52: IMPLEMENT_APP(WXApp)
                     53: 
                     54: bool
                     55: WXApp::OnInit()
                     56: {
                     57:        debug_breakaddr = 0xffffffff;
                     58:        WXMainView::screen_scale = 1.0;
                     59:        WXTextPanel::global_fontsize = FONT_6x12;
                     60:        vmdir = ".";
                     61: 
                     62:        if (!Parse()) {
                     63:                return false;
                     64:        }
                     65: 
                     66:        // -C オプションならコンソールにもログを出力
                     67:        if (!main_init<false>(console_log)) {
                     68:                return false;
                     69:        }
                     70: 
                     71:        // メインウィンドウ
                     72:        gMainFrame = new WXMainFrame(NULL);
                     73:        gMainFrame->Show(true);
                     74:        SetTopWindow(gMainFrame);
                     75:        return true;
                     76: }
                     77: 
                     78: bool
                     79: WXApp::Parse()
                     80: {
                     81:        u_long ulval;
                     82: 
                     83:        wxCmdLineParser cmd(argc, argv);
                     84:        cmd.SetDesc(cmddesc);
                     85:        if (cmd.Parse() != 0) {
                     86:                return false;
                     87:        }
                     88: 
                     89:        wxString arg;
                     90: 
                     91:        // -v
                     92:        if (cmd.Found("v")) {
                     93:                fprintf(stderr, "nono version %d.%d.%d\n",
                     94:                        NONO_MAJOR_VER, NONO_MINOR_VER, NONO_PATCH_VER);
                     95:                return false;
                     96:        }
                     97: 
                     98:        // -b ブレイクポイント
                     99:        if (cmd.Found("b", &arg)) {
                    100:                arg.ToULong(&ulval, 16);
                    101:                debug_breakaddr = ulval;
                    102:        }
                    103: 
                    104:        // -c 設定ファイル
                    105:        if (cmd.Found("c", &arg)) {
                    106:                vmdir = std::string((const char *)arg.mb_str());
                    107:        }
                    108: 
                    109:        // -L ログレベル
                    110:        if (cmd.Found("L", &arg)) {
                    111:                strlcpy(logopt, (const char *)arg.mb_str(), sizeof(logopt));
                    112:        }
                    113: 
                    114:        // -M 起動時に表示するモニタ
                    115:        if (cmd.Found("M", &arg)) {
                    116:                if (!ParseMonitors(arg)) {
                    117:                        return false;
                    118:                }
                    119:        }
                    120: 
                    121:        // screen scale
                    122:        if (cmd.Found("s", &arg)) {
                    123:                if (!arg.ToDouble(&WXMainView::screen_scale)) {
                    124:                        return false;
                    125:                }
                    126:        }
                    127: 
                    128:        // テキスト系コントロールのフォントサイズ
                    129:        if (cmd.Found("fontsize", &arg)) {
                    130:                fontsize_t fontsize;
                    131:                arg.ToULong(&ulval, 10);
                    132:                switch (ulval) {
                    133:                 case 12:
                    134:                        fontsize = FONT_6x12;
                    135:                        break;
                    136:                 case 16:
                    137:                        fontsize = FONT_8x16;
                    138:                        break;
                    139:                 case 24:
                    140:                        fontsize = FONT_12x24;
                    141:                        break;
                    142:                 default:
                    143:                        return false;
                    144:                }
                    145:                WXTextPanel::global_fontsize = fontsize;
                    146:        }
                    147: 
                    148:        console_log = cmd.Found("C");
                    149:        debug_on_start = cmd.Found("d");
                    150:        fast_mode = cmd.Found("f");
                    151: 
                    152:        return true;
                    153: }
                    154: 
                    155: // -M オプションの解析。書式は
                    156: //  -M <name>[,<name>[,...]]
                    157: //  -M help
                    158: // 継続不能なエラーなら false を返す。
                    159: bool
                    160: WXApp::ParseMonitors(const wxString& str)
                    161: {
                    162:        const char *sep = ",";
                    163:        char *word;
                    164:        char *last;
                    165:        char buf[str.Length() + 1];
                    166: 
                    167:        if (str == wxT("help")) {
                    168:                for (int i = 0; i < WinID_MAX; i++) {
                    169:                        fprintf(stderr, " %s\n", WXMainFrame::monitor_names[i]);
                    170:                }
                    171:                return false;
                    172:        }
                    173: 
                    174:        // 由緒正しい C でパースしてしまう
                    175:        strcpy(buf, (const char *)str.mb_str());
                    176:        for (word = strtok_r(buf, sep, &last);
                    177:             word;
                    178:             word = strtok_r(NULL, sep, &last))
                    179:        {
                    180:                int i = SearchMonitorName(word);
                    181:                if (i < 0) {
                    182:                        warnx("Unknown window name \"%s\"", word);
                    183:                        return false;
                    184:                }
                    185:                WXMainFrame::monitor_start[i] = true;
                    186:        }
                    187:        return true;
                    188: }
                    189: 
                    190: int
                    191: WXApp::SearchMonitorName(const char *name)
                    192: {
                    193:        for (int i = 0; i < WinID_MAX; i++) {
                    194:                if (strcmp(name, WXMainFrame::monitor_names[i]) == 0) {
                    195:                        return i;
                    196:                }
                    197:        }
                    198:        return -1;
                    199: }

unix.superglobalmegacorp.com

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