Annotation of nono/lib/monitor.h, revision 1.1.1.1

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2021 nono project
                      4: // Licensed under nono-license.txt
                      5: //
                      6: 
                      7: #pragma once
                      8: 
                      9: #include "geometric.h"
                     10: #include "object.h"
                     11: #include "textscreen.h"
                     12: #include "vm.h"
                     13: 
                     14: // モニタ識別子
                     15: //
                     16: // テキストモニタの識別子だがメニューID (とウィンドウの識別ID) としても使う
                     17: // ので wxmainframe あたりも参照。
                     18: enum {
                     19: #include "monitor_id.h"
                     20: };
                     21: 
                     22: // 識別子 (n番目で指定)
                     23: static constexpr int ID_MONITOR_ATC(int n) {
                     24:        return ID_MONITOR_ATC0 + n;
                     25: }
                     26: static constexpr int ID_MONITOR_CMMU(int n) {
                     27:        return ID_MONITOR_CMMU0 + n;
                     28: }
                     29: static constexpr int ID_SUBWIN_CACHE(int n) {
                     30:        return ID_SUBWIN_CACHE0 + n;
                     31: }
                     32: static constexpr int ID_MONITOR_MEMDUMP(int n) {
                     33:        return ID_MONITOR_MEMDUMP0 + n;
                     34: }
                     35: // 判定
                     36: static constexpr bool IS_MONITOR_MEMDUMP(int id) {
                     37:        return (ID_MONITOR_MEMDUMP0 <= id &&
                     38:                id < (ID_MONITOR_MEMDUMP0 + MAX_MEMDUMP_MONITOR));
                     39: }
                     40: 
                     41: class Monitor;
                     42: using MonitorCallback_t = void (Object::*)(Monitor *, TextScreen&);
                     43: // モニタコールバックを宣言するマクロ。
                     44: // 強制力はないけどヘッダで宣言するところで使うこと。
                     45: // コールバック関数の型が変わった時にコンパイルエラーで検出させるため。
                     46: #define DECLARE_MONITOR_CALLBACK(name) void name (Monitor *, TextScreen&)
                     47: // モニタ更新を呼び出すマクロ
                     48: #define MONITOR_UPDATE(m, scr) ((((m).obj)->*((m).func))(&(m), (scr)))
                     49: 
                     50: // モニタ
                     51: class Monitor
                     52: {
                     53:  public:
                     54:        Monitor();
                     55:        Monitor(Object *obj_);
                     56:        virtual ~Monitor();
                     57: 
                     58:        Object *obj {};                         // オブジェクト
                     59:        MonitorCallback_t func {};      // コールバック関数
                     60: 
                     61:        int GetId() const { return id; }
                     62: 
                     63:        void SetSize(nnSize size_) { size = size_; }
                     64:        void SetSize(int col_, int row_) { SetSize(nnSize(col_, row_)); }
                     65:        virtual nnSize GetSize() const { return size; }
                     66: 
                     67:        // 登録。
                     68:        // モニタの登録はコンストラクタおよび Create フェーズまでに行うこと。
                     69:        // Create() の後、Init() より前に -M オプションの処理があるため。
                     70:        // see wx/wxapp.cpp
                     71:        void Regist(int id);
                     72: 
                     73:        // 削除。
                     74:        void Unregist();
                     75: 
                     76:  private:
                     77:        // モニター識別子
                     78:        int id;
                     79: 
                     80:        // モニターサイズ
                     81:        nnSize size {};
                     82: };
                     83: 
                     84: //
                     85: // モニターマネージャ
                     86: //
                     87: class MonitorManager
                     88: {
                     89:        friend class Monitor;
                     90: 
                     91:        // モニター情報 (事前定義)
                     92:        struct MonitorInfo {
                     93:                int id;
                     94:                vmf_t feature;
                     95:                std::vector<std::string> aliases;
                     96:        };
                     97: 
                     98:  public:
                     99:        // 現在登録されているモニターのリストを返す。
                    100:        const std::vector<Monitor *>& GetList() const { return list; }
                    101: 
                    102:        // 指定された id を持つモニターを返す。
                    103:        // こっちは、なければ assert する。
                    104:        Monitor& Get(int id) const {
                    105:                for (auto mon : list) {
                    106:                        if (mon->GetId() == id) {
                    107:                                return *mon;
                    108:                        }
                    109:                }
                    110:                assertmsg(false, "id=%d not found", id);
                    111:        }
                    112: 
                    113:        // 指定された id を持つモニターを返す。
                    114:        // こっちは、なければ NULL を返す。
                    115:        Monitor *Find(int id) const {
                    116:                for (auto mon : list) {
                    117:                        if (mon->GetId() == id) {
                    118:                                return mon;
                    119:                        }
                    120:                }
                    121:                return NULL;
                    122:        }
                    123: 
                    124:        // 指定された id に対応する機種フラグを返す。
                    125:        vmf_t GetFeature(int id) const {
                    126:                assert(0 <= id && id < info.size());
                    127:                return info[id].feature;
                    128:        }
                    129: 
                    130:        // 指定された id に対応する名前のリストを返す。
                    131:        // id が範囲外だと assert する。
                    132:        const std::vector<std::string>& GetAliases(int id) const {
                    133:                assert(0 <= id && id < info.size());
                    134:                return info[id].aliases;
                    135:        }
                    136: 
                    137:        // id リストから一覧表示用の文字列を生成して返す
                    138:        static std::string MakeListString(std::vector<int> list);
                    139: 
                    140:        // 以降の追加を禁止する (プログラムミスを避けるため)
                    141:        void Fix();
                    142: 
                    143:  private:
                    144:        // 登録 (friend の Monitor からのみ呼べる)
                    145:        void Regist(Monitor *mon);
                    146: 
                    147:        // 削除 (friend の Monitor からのみ呼べる)
                    148:        void Unregist(Monitor *mon);
                    149: 
                    150:        // 現在登録されているモニターのリスト
                    151:        std::vector<Monitor *> list {};
                    152: 
                    153:        // 事前に設定されているモニター情報
                    154:        static const std::vector<MonitorInfo> info;
                    155: 
                    156:        // モニタの登録は -M オプションの処理が始まるまでに終えないといけない。
                    157:        bool fixed {};
                    158: };
                    159: 
                    160: extern MonitorManager gMonitorManager;

unix.superglobalmegacorp.com

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