From 0816c1ee66ddb3735b98406d8102efc3b2be4eda Mon Sep 17 00:00:00 2001 From: Zomo Date: Tue, 20 Apr 2021 19:54:00 -0500 Subject: [PATCH] forgot to init --- .gitignore | 2 + build | 1 + main.cpp | 193 +++++++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 184 insertions(+), 12 deletions(-) create mode 100644 .gitignore create mode 100755 build diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..03eae2f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +log.txt +*.o \ No newline at end of file diff --git a/build b/build new file mode 100755 index 0000000..319104d --- /dev/null +++ b/build @@ -0,0 +1 @@ +g++-10 -fconcepts-ts $1.cpp -o $1.o && chmod +x $1.o diff --git a/main.cpp b/main.cpp index deb82c0..4ef52fd 100644 --- a/main.cpp +++ b/main.cpp @@ -1,31 +1,200 @@ -#include -#include -#include + +#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 clearScreen(); +void clearScreen(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 eachFrame(vector> &screen, short width, short height); + +Timer t = Timer(); +ofstream Log ("log.txt"); + int main(int argc, char **argv) { - struct winsize w; - ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); - vector< vector > screen; - - Timer t = Timer(); + //^C + signal(SIGINT, beforeExit); + //abort() + signal(SIGABRT, beforeExit); + //sent by "kill" command + signal(SIGTERM, beforeExit); + //^Z + signal(SIGTSTP, beforeExit); + atexit(beforeExit); - float framerate = 60.0; + 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([&]() { - eachFrame(w.ws_row, w.ws_col, screen); - }, (int) frameduration); + 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 eachFrame(short width, short height, vector< vector > screen) +void beforeExit() +{ + //clearScreen(); + 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 clearScreen() { + struct winsize w; + ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); + clearScreen(w.ws_col, w.ws_row); +} + +void clearScreen(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 eachFrame(vector> &screen, short width, short height) { + stringstream ss; + + //ss << width << "x" << height; + ss << "Hello World."; + + screen_type(screen, ss.str(), 10, 10, false); + } \ No newline at end of file