git-svn-id: svn://db.shs.com.ru/pip@261 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
@@ -65,14 +65,16 @@ PRIVATE_DEFINITION_START(PITerminal)
|
|||||||
#else
|
#else
|
||||||
PIString shell;
|
PIString shell;
|
||||||
PIByteArray read_buf, tmp_buf;
|
PIByteArray read_buf, tmp_buf;
|
||||||
PIScreenTypes::CellFormat cur_format;
|
PIScreenTypes::CellFormat cur_format, line_format;
|
||||||
int term_type;
|
int term_type;
|
||||||
int fd, cur_x, cur_y;
|
int fd, cur_x, cur_y;
|
||||||
int save_cur_x, save_cur_y;
|
int save_cur_x, save_cur_y;
|
||||||
|
int win_y0, win_y1;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
PIString esc_seq;
|
PIString esc_seq;
|
||||||
bool is_esc_seq, last_read;
|
bool is_esc_seq, last_read;
|
||||||
PIMap<int, bool> DEC;
|
PIMap<int, bool> DEC;
|
||||||
|
PIVector<PIVector<PIScreenTypes::Cell> > cells_save;
|
||||||
termios desc;
|
termios desc;
|
||||||
#endif
|
#endif
|
||||||
PRIVATE_DEFINITION_END(PITerminal)
|
PRIVATE_DEFINITION_END(PITerminal)
|
||||||
@@ -422,6 +424,7 @@ void PITerminal::parseInput(const PIString & s) {
|
|||||||
if (s[i] == '\n') {
|
if (s[i] == '\n') {
|
||||||
//piCoutObj << "new line";
|
//piCoutObj << "new line";
|
||||||
for (int i = PRIVATE->cur_x; i < size_x; ++i) cells[PRIVATE->cur_y][i].format = PRIVATE->cur_format;
|
for (int i = PRIVATE->cur_x; i < size_x; ++i) cells[PRIVATE->cur_y][i].format = PRIVATE->cur_format;
|
||||||
|
PRIVATE->line_format = PRIVATE->cur_format;
|
||||||
PRIVATE->cur_x = 0;
|
PRIVATE->cur_x = 0;
|
||||||
moveCursor(0, 1);
|
moveCursor(0, 1);
|
||||||
continue;
|
continue;
|
||||||
@@ -448,21 +451,38 @@ bool PITerminal::isCompleteEscSeq(const PIString & es) {
|
|||||||
|
|
||||||
|
|
||||||
void PITerminal::applyEscSeq(PIString es) {
|
void PITerminal::applyEscSeq(PIString es) {
|
||||||
//piCoutObj << es;
|
piCoutObj << es;
|
||||||
if (es.size_s() < 2) return;
|
if (es.size_s() < 2) return;
|
||||||
|
PIScreenTypes::Cell line_cell = PIScreenTypes::Cell(' ', PRIVATE->line_format);
|
||||||
|
PIScreenTypes::Cell def_cell = PIScreenTypes::Cell(' ', PRIVATE->cur_format);
|
||||||
if (es[1] == '?' && es.size_s() >= 2) {
|
if (es[1] == '?' && es.size_s() >= 2) {
|
||||||
char a = es.takeRight(1)[0].toAscii();
|
char a = es.takeRight(1)[0].toAscii();
|
||||||
bool val = false;
|
bool val = false;
|
||||||
if (a == 'l') val = false;
|
if (a == 'l') val = false;
|
||||||
if (a == 'h') val = true;
|
if (a == 'h') val = true;
|
||||||
int dec = es.mid(2).toInt();
|
int dec = es.mid(2).toInt();
|
||||||
//piCoutObj << "DEC" << dec << val;
|
piCoutObj << "DEC" << dec << val;
|
||||||
|
PRIVATE->DEC[dec] = val;
|
||||||
switch (dec) {
|
switch (dec) {
|
||||||
case 25: cursor_visible = val; break;
|
case 25: cursor_visible = val; break;
|
||||||
default: PRIVATE->DEC[dec] = val; break;
|
case 1049:
|
||||||
|
if (val) {
|
||||||
|
PRIVATE->save_cur_x = PRIVATE->cur_x;
|
||||||
|
PRIVATE->save_cur_y = PRIVATE->cur_y;
|
||||||
|
} else {
|
||||||
|
PRIVATE->cur_x = PRIVATE->save_cur_x;
|
||||||
|
PRIVATE->cur_y = PRIVATE->save_cur_y;
|
||||||
|
}
|
||||||
|
case 1047:
|
||||||
|
if (val) {
|
||||||
|
PRIVATE->cells_save = cells;
|
||||||
|
for (int i = 0; i < size_y; ++i) cells[i].fill(def_cell);
|
||||||
|
} else {
|
||||||
|
cells = PRIVATE->cells_save;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PIScreenTypes::Cell def_cell = PIScreenTypes::Cell(' ', PRIVATE->cur_format);
|
|
||||||
if (es[0] == '[') { // CSI
|
if (es[0] == '[') { // CSI
|
||||||
if (es.back() == 'm') {
|
if (es.back() == 'm') {
|
||||||
es.cutLeft(1).cutRight(1);
|
es.cutLeft(1).cutRight(1);
|
||||||
@@ -507,6 +527,17 @@ void PITerminal::applyEscSeq(PIString es) {
|
|||||||
PRIVATE->cur_format.color_back = t;
|
PRIVATE->cur_format.color_back = t;
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
|
if (es.back() == 'r') {
|
||||||
|
piCoutObj << es;
|
||||||
|
es.cutLeft(1).cutRight(1);
|
||||||
|
PIStringList args = es.split(";");
|
||||||
|
args.resize(2);
|
||||||
|
int y0(0), y1(0);
|
||||||
|
if (!args[0].isEmpty()) y0 = args[0].toInt() - 1;
|
||||||
|
if (!args[1].isEmpty()) y1 = args[1].toInt() - 1;
|
||||||
|
PRIVATE->win_y0 = piClamp(y0, 0, size_y - 1);
|
||||||
|
PRIVATE->win_y1 = piClamp(y1, 0, size_y - 1);
|
||||||
|
}
|
||||||
if (es.back() == 's') {
|
if (es.back() == 's') {
|
||||||
PRIVATE->save_cur_x = PRIVATE->cur_x;
|
PRIVATE->save_cur_x = PRIVATE->cur_x;
|
||||||
PRIVATE->save_cur_y = PRIVATE->cur_y;
|
PRIVATE->save_cur_y = PRIVATE->cur_y;
|
||||||
@@ -515,7 +546,7 @@ void PITerminal::applyEscSeq(PIString es) {
|
|||||||
PRIVATE->cur_x = PRIVATE->save_cur_x;
|
PRIVATE->cur_x = PRIVATE->save_cur_x;
|
||||||
PRIVATE->cur_y = PRIVATE->save_cur_y;
|
PRIVATE->cur_y = PRIVATE->save_cur_y;
|
||||||
}
|
}
|
||||||
if (es.back() == 'H' || es.back() == 'f') {
|
if (es.back() == 'H' || es.back() == 'f' || es.back() == 'r') {
|
||||||
es.cutLeft(1).cutRight(1);
|
es.cutLeft(1).cutRight(1);
|
||||||
PIStringList args = es.split(";");
|
PIStringList args = es.split(";");
|
||||||
args.resize(2);
|
args.resize(2);
|
||||||
@@ -525,49 +556,72 @@ void PITerminal::applyEscSeq(PIString es) {
|
|||||||
//piCoutObj << x << y;
|
//piCoutObj << x << y;
|
||||||
PRIVATE->cur_x = piClamp(x, 0, size_x - 1);
|
PRIVATE->cur_x = piClamp(x, 0, size_x - 1);
|
||||||
PRIVATE->cur_y = piClamp(y, 0, size_y - 1);
|
PRIVATE->cur_y = piClamp(y, 0, size_y - 1);
|
||||||
|
PRIVATE->line_format = PRIVATE->cur_format;
|
||||||
}
|
}
|
||||||
if (es.back() == 'A') { // cursor up
|
if (es.back() == 'A') { // cursor up
|
||||||
es.cutLeft(1).cutRight(1);
|
es.cutLeft(1).cutRight(1);
|
||||||
int v = es.toInt(); if (v == 0) v = 1;
|
int v = es.toInt(); if (v == 0) v = 1;
|
||||||
PRIVATE->cur_y = piClamp(PRIVATE->cur_y - v, 0, size_y - 1);
|
PRIVATE->cur_y = piClamp(PRIVATE->cur_y - v, 0, size_y - 1);
|
||||||
|
PRIVATE->line_format = PRIVATE->cur_format;
|
||||||
}
|
}
|
||||||
if (es.back() == 'B') { // cursor down
|
if (es.back() == 'B') { // cursor down
|
||||||
es.cutLeft(1).cutRight(1);
|
es.cutLeft(1).cutRight(1);
|
||||||
int v = es.toInt(); if (v == 0) v = 1;
|
int v = es.toInt(); if (v == 0) v = 1;
|
||||||
PRIVATE->cur_y = piClamp(PRIVATE->cur_y + v, 0, size_y - 1);
|
PRIVATE->cur_y = piClamp(PRIVATE->cur_y + v, 0, size_y - 1);
|
||||||
|
PRIVATE->line_format = PRIVATE->cur_format;
|
||||||
}
|
}
|
||||||
if (es.back() == 'C' || es.back() == 'a') { // cursor forward, next column
|
if (es.back() == 'C' || es.back() == 'a') { // cursor forward, next column
|
||||||
es.cutLeft(1).cutRight(1);
|
es.cutLeft(1).cutRight(1);
|
||||||
int v = es.toInt(); if (v == 0) v = 1;
|
int v = es.toInt(); if (v == 0) v = 1;
|
||||||
PRIVATE->cur_x = piClamp(PRIVATE->cur_x + v, 0, size_x - 1);
|
PRIVATE->cur_x = piClamp(PRIVATE->cur_x + v, 0, size_x - 1);
|
||||||
|
PRIVATE->line_format = PRIVATE->cur_format;
|
||||||
}
|
}
|
||||||
if (es.back() == 'D') { // cursor back
|
if (es.back() == 'D') { // cursor back
|
||||||
es.cutLeft(1).cutRight(1);
|
es.cutLeft(1).cutRight(1);
|
||||||
int v = es.toInt(); if (v == 0) v = 1;
|
int v = es.toInt(); if (v == 0) v = 1;
|
||||||
PRIVATE->cur_x = piClamp(PRIVATE->cur_x - v, 0, size_x - 1);
|
PRIVATE->cur_x = piClamp(PRIVATE->cur_x - v, 0, size_x - 1);
|
||||||
|
PRIVATE->line_format = PRIVATE->cur_format;
|
||||||
}
|
}
|
||||||
if (es.back() == 'G' || es.back() == '`') { // goto column
|
if (es.back() == 'G' || es.back() == '`') { // goto column
|
||||||
es.cutLeft(1).cutRight(1);
|
es.cutLeft(1).cutRight(1);
|
||||||
int v = es.toInt();
|
int v = es.toInt();
|
||||||
if (v) PRIVATE->cur_x = piClamp(v - 1, 0, size_x - 1);
|
if (v) PRIVATE->cur_x = piClamp(v - 1, 0, size_x - 1);
|
||||||
|
PRIVATE->line_format = PRIVATE->cur_format;
|
||||||
}
|
}
|
||||||
if (es.back() == 'd') { // goto line
|
if (es.back() == 'd') { // goto line
|
||||||
es.cutLeft(1).cutRight(1);
|
es.cutLeft(1).cutRight(1);
|
||||||
int v = es.toInt(); if (v == 0) v = 1;
|
int v = es.toInt(); if (v == 0) v = 1;
|
||||||
PRIVATE->cur_x = 0;
|
PRIVATE->cur_x = 0;
|
||||||
PRIVATE->cur_y = piClamp(v - 1, 0, size_y - 1);
|
PRIVATE->cur_y = piClamp(v - 1, 0, size_y - 1);
|
||||||
|
PRIVATE->line_format = PRIVATE->cur_format;
|
||||||
}
|
}
|
||||||
if (es.back() == 'E' || es.back() == 'e') { // next line
|
if (es.back() == 'E' || es.back() == 'e') { // next line
|
||||||
es.cutLeft(1).cutRight(1);
|
es.cutLeft(1).cutRight(1);
|
||||||
int v = es.toInt(); if (v == 0) v = 1;
|
int v = es.toInt(); if (v == 0) v = 1;
|
||||||
PRIVATE->cur_x = 0;
|
PRIVATE->cur_x = 0;
|
||||||
PRIVATE->cur_y = piClamp(PRIVATE->cur_y + v, 0, size_y - 1);
|
PRIVATE->cur_y = piClamp(PRIVATE->cur_y + v, 0, size_y - 1);
|
||||||
|
PRIVATE->line_format = PRIVATE->cur_format;
|
||||||
}
|
}
|
||||||
if (es.back() == 'F') { // previous line
|
if (es.back() == 'F') { // previous line
|
||||||
es.cutLeft(1).cutRight(1);
|
es.cutLeft(1).cutRight(1);
|
||||||
int v = es.toInt(); if (v == 0) v = 1;
|
int v = es.toInt(); if (v == 0) v = 1;
|
||||||
PRIVATE->cur_x = 0;
|
PRIVATE->cur_x = 0;
|
||||||
PRIVATE->cur_y = piClamp(PRIVATE->cur_y - v, 0, size_y - 1);
|
PRIVATE->cur_y = piClamp(PRIVATE->cur_y - v, 0, size_y - 1);
|
||||||
|
PRIVATE->line_format = PRIVATE->cur_format;
|
||||||
|
}
|
||||||
|
if (es.back() == 'L') { // insert lines
|
||||||
|
es.cutLeft(1).cutRight(1);
|
||||||
|
int v = es.toInt(); if (v == 0) v = 1;
|
||||||
|
for (int i = piClamp(size_y - 1, PRIVATE->win_y0, PRIVATE->win_y1); i >= piClamp(PRIVATE->cur_y + v, PRIVATE->win_y0, PRIVATE->win_y1); --i) cells[i] = cells[i - v];
|
||||||
|
for (int j = piClamp(PRIVATE->cur_y, PRIVATE->win_y0, PRIVATE->win_y1); j < piClamp(PRIVATE->cur_y + v, PRIVATE->win_y0, PRIVATE->win_y1); ++j)
|
||||||
|
for (int i = 0; i < PRIVATE->cur_x; ++i) cells[j][i] = def_cell;
|
||||||
|
}
|
||||||
|
if (es.back() == 'M') { // delete lines
|
||||||
|
es.cutLeft(1).cutRight(1);
|
||||||
|
int v = es.toInt(); if (v == 0) v = 1;
|
||||||
|
for (int i = piClamp(PRIVATE->cur_y, PRIVATE->win_y0, PRIVATE->win_y1); i < piClamp(size_y - v, PRIVATE->win_y0, PRIVATE->win_y1); ++i) cells[i] = cells[i + v];
|
||||||
|
for (int j = piClamp(size_y - v, PRIVATE->win_y0, PRIVATE->win_y1); j < piClamp(size_y, PRIVATE->win_y0, PRIVATE->win_y1); ++j)
|
||||||
|
for (int i = 0; i < PRIVATE->cur_x; ++i) cells[j][i] = def_cell;
|
||||||
}
|
}
|
||||||
if (es.back() == 'P') { // delete characters
|
if (es.back() == 'P') { // delete characters
|
||||||
es.cutLeft(1).cutRight(1);
|
es.cutLeft(1).cutRight(1);
|
||||||
@@ -575,6 +629,12 @@ void PITerminal::applyEscSeq(PIString es) {
|
|||||||
for (int i = PRIVATE->cur_x; i < size_x - v; ++i) cells[PRIVATE->cur_y][i] = cells[PRIVATE->cur_y][i + v];
|
for (int i = PRIVATE->cur_x; i < size_x - v; ++i) cells[PRIVATE->cur_y][i] = cells[PRIVATE->cur_y][i + v];
|
||||||
for (int i = size_x - v; i < size_x; ++i) cells[PRIVATE->cur_y][i] = def_cell;
|
for (int i = size_x - v; i < size_x; ++i) cells[PRIVATE->cur_y][i] = def_cell;
|
||||||
}
|
}
|
||||||
|
if (es.back() == '@') { // delete characters
|
||||||
|
es.cutLeft(1).cutRight(1);
|
||||||
|
int v = es.toInt(); if (v == 0) v = 1;
|
||||||
|
for (int i = size_x - 1; i >= PRIVATE->cur_x + v; --i) cells[PRIVATE->cur_y][i] = cells[PRIVATE->cur_y][i - v];
|
||||||
|
for (int i = PRIVATE->cur_x; i < PRIVATE->cur_x + v; ++i) cells[PRIVATE->cur_y][i] = def_cell;
|
||||||
|
}
|
||||||
if (es.back() == 'J') { // erase data
|
if (es.back() == 'J') { // erase data
|
||||||
es.cutLeft(1).cutRight(1);
|
es.cutLeft(1).cutRight(1);
|
||||||
int v = es.toInt();
|
int v = es.toInt();
|
||||||
@@ -618,6 +678,7 @@ void PITerminal::moveCursor(int dx, int dy) {
|
|||||||
if (PRIVATE->cur_x < 0) PRIVATE->cur_x = 0;
|
if (PRIVATE->cur_x < 0) PRIVATE->cur_x = 0;
|
||||||
if (PRIVATE->cur_y < 0) PRIVATE->cur_y = 0;
|
if (PRIVATE->cur_y < 0) PRIVATE->cur_y = 0;
|
||||||
if (PRIVATE->cur_x >= size_x) {
|
if (PRIVATE->cur_x >= size_x) {
|
||||||
|
PRIVATE->line_format = PRIVATE->cur_format;
|
||||||
PRIVATE->cur_x = 0;
|
PRIVATE->cur_x = 0;
|
||||||
PRIVATE->cur_y++;
|
PRIVATE->cur_y++;
|
||||||
}
|
}
|
||||||
@@ -813,6 +874,11 @@ bool PITerminal::resize(int cols, int rows) {
|
|||||||
ws.ws_col = cols;
|
ws.ws_col = cols;
|
||||||
ws.ws_row = rows;
|
ws.ws_row = rows;
|
||||||
ioctl(PRIVATE->fd, TIOCSWINSZ, &ws);
|
ioctl(PRIVATE->fd, TIOCSWINSZ, &ws);
|
||||||
|
PRIVATE->win_y0 = 0;
|
||||||
|
PRIVATE->win_y1 = size_y - 1;
|
||||||
|
PRIVATE->cells_save.resize(size_y);
|
||||||
|
for (int i = 0; i < size_y; ++i)
|
||||||
|
PRIVATE->cells_save[i].resize(size_x);
|
||||||
#endif
|
#endif
|
||||||
cells.resize(size_y);
|
cells.resize(size_y);
|
||||||
for (int i = 0; i < size_y; ++i)
|
for (int i = 0; i < size_y; ++i)
|
||||||
|
|||||||
@@ -232,10 +232,10 @@ PISystemTime PISystemTime::current(bool precise_but_not_system) {
|
|||||||
# endif
|
# endif
|
||||||
sft.dwHighDateTime = ft.dwHighDateTime - __pi_ftjan1970.dwHighDateTime;
|
sft.dwHighDateTime = ft.dwHighDateTime - __pi_ftjan1970.dwHighDateTime;
|
||||||
if (ft.dwLowDateTime < __pi_ftjan1970.dwLowDateTime) {
|
if (ft.dwLowDateTime < __pi_ftjan1970.dwLowDateTime) {
|
||||||
sft.dwLowDateTime = ft.dwLowDateTime + (0xFFFFFFFF - __pi_ftjan1970.dwLowDateTime);
|
sft.dwLowDateTime += (0xFFFFFFFF - __pi_ftjan1970.dwLowDateTime);
|
||||||
sft.dwHighDateTime--;
|
sft.dwHighDateTime--;
|
||||||
} else
|
} else
|
||||||
sft.dwLowDateTime = ft.dwLowDateTime - __pi_ftjan1970.dwLowDateTime;
|
sft.dwLowDateTime -= __pi_ftjan1970.dwLowDateTime;
|
||||||
ullong lt = ullong(sft.dwHighDateTime) * 0x100000000U + ullong(sft.dwLowDateTime);
|
ullong lt = ullong(sft.dwHighDateTime) * 0x100000000U + ullong(sft.dwLowDateTime);
|
||||||
return PISystemTime(lt / 10000000U, (lt % 10000000U) * 100U);
|
return PISystemTime(lt / 10000000U, (lt % 10000000U) * 100U);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user