// tui_shot: headless frames of the demo scene from the C++ port, to diff against python. // tui_shot [rows cols] plain text, same as tai.py --demo-shot // tui_shot frame [rows cols] the raw bytes of the first frame (TuiApp.frame_bytes) // tui_shot cells [rows cols] one line per cell: y x codepoint sgr (compose, no diff) #include "TuiDemo.h" #include #include #include #include using namespace detz::tui; int main(int argc, char** argv) { std::string mode = "text"; int arg = 1; if (argc > 1 && (std::string(argv[1]) == "frame" || std::string(argv[1]) == "cells")) { mode = argv[1]; arg = 2; } int rows = argc > arg ? std::atoi(argv[arg]) : 30; int cols = argc > arg + 1 ? std::atoi(argv[arg + 1]) : 100; if (mode == "text") return TuiDemo::demo_shot(std::cout, rows, cols); TuiApp app; app.rows = rows; app.cols = cols; auto built = TuiDemo::build(app, false); app.mount(built.first); app.close_panel(built.first->find("welcome")); built.second->shell->screen.feed("$ echo hello\r\nhello\r\n$ "); built.second->stream->screen.feed("stream tick 1\r\nstream tick 2\r\nstream tick 3\r\n"); if (mode == "frame") { std::string bytes = app.frame_bytes(); std::fwrite(bytes.data(), 1, bytes.size(), stdout); return 0; } app.render_text(); // forces layout TuiCellRows frame = app.compositor.compose(app.root.get(), rows, cols); for (size_t y = 0; y < frame.size(); y++) { for (size_t x = 0; x < frame[y].size(); x++) { std::printf("%zu %zu %u %s\n", y, x, static_cast(frame[y][x].ch), app.compositor.sgr(frame[y][x].key).substr(1).c_str()); } } return 0; }