199 lines
4.0 KiB
C++
199 lines
4.0 KiB
C++
|
|
#include <algorithm>
|
|
#include <fstream>
|
|
#include <iostream>
|
|
#include <sstream>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <sys/ioctl.h>
|
|
#include <term.h>
|
|
#include <termios.h>
|
|
#include <unistd.h>
|
|
#include <vector>
|
|
#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<vector<char>> screen, short width, short height);
|
|
void screen_type(vector<vector<char>> &screen, string str, int x, int y, bool vertical);
|
|
void eachFrame(vector<vector<char>> &screen, short width, short height);
|
|
|
|
Timer t = Timer();
|
|
|
|
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<vector<char>> 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()
|
|
{
|
|
//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<vector<char>> 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<vector<char>> &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<vector<char>> &screen, short width, short height)
|
|
{
|
|
|
|
stringstream ss;
|
|
|
|
ss << width << "x" << height;
|
|
//ss << "Hello World.";
|
|
|
|
screen_type(screen, ss.str(), 10, 10, false);
|
|
|
|
} |