--- nono/lib/textscreen.h 2026/04/29 17:04:34 1.1.1.3 +++ nono/lib/textscreen.h 2026/04/29 17:04:37 1.1.1.4 @@ -59,10 +59,7 @@ class TextScreen // 初期化 void Init(int col, int row); - // 折り返しモードかどうか - bool foldmode {}; - - // クリア + // 画面をクリアして、カーソルをホームポジションに移動 void Clear(); // 現在位置を移動 @@ -72,33 +69,41 @@ class TextScreen } // 現在位置に1文字出力 (上位バイトは属性) - void Putc(uint16 ch); + // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 + virtual void Putc(uint16 ch); // 現在位置に文字列を出力 + // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 void Puts(const char *str); // 現在位置に指定の属性で文字列を出力 + // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 void Puts(TA attr, const char *str); // 座標を指定して文字列を出力 + // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 void Puts(int x, int y, const char *str) { Locate(x, y); Puts(str); } // 座標と属性を指定して、文字列を出力 + // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 void Puts(int x, int y, TA attr, const char *str) { Locate(x, y); Puts(attr, str); } // 現在位置に属性なしで書式付き文字列を出力 + // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 void Print(const char *fmt, ...) __printflike(2, 3); // 座標を指定して属性なしで書式付き文字列を出力 + // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 void Print(int x, int y, const char *fmt, ...) __printflike(4, 5); // 座標と属性を指定して、書式付き文字列を出力 + // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 void Print(int x, int y, TA attr, const char *fmt, ...) __printflike(5, 6); @@ -121,10 +126,13 @@ class TextScreen // 行数を取得 int GetRow() const { return row; } - private: - // 改行(次の行の左端に移動) - void CRLF(); + // ユーザ定義の引数 + // ご自由にお使いください。例えばモニタの出力開始オフセットやアドレス + // など、呼び出し側が設定して書き出す側がそれに従った内容を出力する + // ような用途。 + uint64 userdata = 0; + protected: // バッファ (幅x高さちょうどの長さ、ゼロ終端文字列ではない) // 上位8ビットは属性、下位8ビットが文字コード。 std::unique_ptr textbuf {}; @@ -141,3 +149,40 @@ class TextScreen // カーソル Y 座標 int Y = 0; }; + +// +// テキストコンソール +// +class TextConsole : public TextScreen +{ + using inherited = TextScreen; + public: + TextConsole(); + virtual ~TextConsole() override; + + // 現在位置に1文字出力 (上位バイトは属性) + // 出力後カーソルは移動する。右端で改行、下端で行スクロールが起きる。 + void Putc(uint16 ch) override; + + private: + // 改行(次の行の左端に移動) + void CRLF(); +}; + +// +// モニターインタフェース +// +// モニターされる側はこのインタフェースを実装すること。 +// +class IMonitor +{ + public: + // 自身の現在の状態を TextScreen に書き出す + virtual void MonitorUpdate(TextScreen&) = 0; + + // このモニターが必要とするサイズ(桁数×行数)を取得する + virtual nnSize GetMonitorSize() = 0; + + // デストラクタ + virtual ~IMonitor() { } +};