#include #include #include #include #include #include #include #include #include #include #include #include "timercpp.h" using namespace std; void beforeExit(); void beforeExit(int i); void setCursor(int XPos, int YPos); void getCursor(int* x, int* y); void hideCursor(); void showCursor(); void closeScreen(); void closeScreen(short width, short height); void writeAt(int x, int y, char ch); void printFrame(vector> screen, short width, short height); void screen_type(vector> &screen, string str, int x, int y, bool vertical); void screen_clear(vector> &screen); void eachFrame(vector> &screen, short width, short height); Timer t = Timer(); ofstream Log ("log.txt"); int main(int argc, char **argv) { //^C signal(SIGINT, beforeExit); //abort() signal(SIGABRT, beforeExit); //sent by "kill" command signal(SIGTERM, beforeExit); //^Z signal(SIGTSTP, beforeExit); atexit(beforeExit); float framerate = 10.0; float frameduration = 1000.0/framerate; vector> screen; // WILL ALWAYS BE AT LEAST 1x1 struct winsize w; ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); // width: w.ws_col // height: w.ws_row for (int i = 0; i < w.ws_row-1; i++) cout << endl; hideCursor(); t.setInterval([&]() { ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); if (w.ws_row > 0 && w.ws_col > 0) { //fill vector screen.resize(w.ws_col); for (auto& col : screen) col.resize(w.ws_row); eachFrame(screen, w.ws_col, w.ws_row); printFrame(screen, w.ws_col, w.ws_row); } }, (int) frameduration); while (true); return 0; } void beforeExit() { //closeScreen(); setCursor(0,0); showCursor(); t.stop(); cout << "goodbye" << endl; exit(0); } void beforeExit(int i) { beforeExit(); } void setCursor(int XPos, int YPos) { printf("\033[%d;%dH",YPos+1,XPos+1); } void getCursor(int* x, int* y) { printf("\033[6n"); scanf("\033[%d;%dR", x, y); } void hideCursor() { cout << "\e[?25l" << flush; } void showCursor() { cout << "\e[?25h" << flush; } void writeAt(int x, int y, char ch) { if (ch == 0) ch == ' '; setCursor(x, y); //printf("%s", ch); cout << ch << flush; fflush(stdout); } void closeScreen() { struct winsize w; ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); closeScreen(w.ws_col, w.ws_row); } void closeScreen(short width, short height) { setCursor(0, 0); for (int i = 0; i < height; i++) for (int j = 0; j < width; j++) writeAt(j, i, ' '); setCursor(0, 0); } void printFrame(vector> screen, short width, short height) { //print frame for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) //cout << screen.at(x).at(y); writeAt(x, y, screen.at(x).at(y)); //cout << endl; } setCursor(0,0); /*for (auto& col : screen) { for (auto& ch : col) cout << ch; cout << endl; }*/ //cout << endl; } void screen_type(vector> &screen, string str, int x, int y, bool vertical) { int width = 0, height = 0; if (str.length()) { //str.append("\033[0m"); width = 1; height = 1; if (vertical) height = str.length(); else width = str.length(); width = min(width, (int) screen.size() - x); height = min(height, (int) screen.at(0).size() - y); } for (int i = x, ii = 0, d = 0; ii < width; i++, ii++) for (int j = y, jj = 0; jj < height; j++, jj++, d++) { //cout << str.at(d) << " " << i << "," << j << endl; screen.at(i).at(j) = str.at(d); } } void screen_clear(vector> &screen) { for (int i = 0; i < screen.size(); i++) for (int j = 0; j < screen.at(i).size(); j++) screen.at(i).at(j) = ' '; } void eachFrame(vector> &screen, short width, short height) { screen_clear(screen); stringstream ss; //ss << width << "x" << height; ss << "Hello World."; screen_type(screen, ss.str(), 10, 10, false); }