From 0cfe1bfc06b7ea0ac3df27e0728413bcf93eb63d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D0=BB=D0=B8=D0=BF=D0=B5=D0=BD=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD?= Date: Thu, 8 Sep 2016 07:57:03 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/pip@261 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5 --- src/console/piterminal.cpp | 78 +++++++++++++++++++++++++++++++++++--- src/core/pitime.cpp | 4 +- 2 files changed, 74 insertions(+), 8 deletions(-) diff --git a/src/console/piterminal.cpp b/src/console/piterminal.cpp index c059143e..70092c94 100644 --- a/src/console/piterminal.cpp +++ b/src/console/piterminal.cpp @@ -65,14 +65,16 @@ PRIVATE_DEFINITION_START(PITerminal) #else PIString shell; PIByteArray read_buf, tmp_buf; - PIScreenTypes::CellFormat cur_format; + PIScreenTypes::CellFormat cur_format, line_format; int term_type; int fd, cur_x, cur_y; int save_cur_x, save_cur_y; + int win_y0, win_y1; pid_t pid; PIString esc_seq; bool is_esc_seq, last_read; PIMap DEC; + PIVector > cells_save; termios desc; #endif PRIVATE_DEFINITION_END(PITerminal) @@ -422,6 +424,7 @@ void PITerminal::parseInput(const PIString & s) { if (s[i] == '\n') { //piCoutObj << "new line"; 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; moveCursor(0, 1); continue; @@ -448,21 +451,38 @@ bool PITerminal::isCompleteEscSeq(const PIString & es) { void PITerminal::applyEscSeq(PIString es) { - //piCoutObj << es; + piCoutObj << es; 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) { char a = es.takeRight(1)[0].toAscii(); bool val = false; if (a == 'l') val = false; if (a == 'h') val = true; int dec = es.mid(2).toInt(); - //piCoutObj << "DEC" << dec << val; + piCoutObj << "DEC" << dec << val; + PRIVATE->DEC[dec] = val; switch (dec) { 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.back() == 'm') { es.cutLeft(1).cutRight(1); @@ -507,6 +527,17 @@ void PITerminal::applyEscSeq(PIString es) { 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') { PRIVATE->save_cur_x = PRIVATE->cur_x; 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_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); PIStringList args = es.split(";"); args.resize(2); @@ -525,49 +556,72 @@ void PITerminal::applyEscSeq(PIString es) { //piCoutObj << x << y; PRIVATE->cur_x = piClamp(x, 0, size_x - 1); PRIVATE->cur_y = piClamp(y, 0, size_y - 1); + PRIVATE->line_format = PRIVATE->cur_format; } if (es.back() == 'A') { // cursor up es.cutLeft(1).cutRight(1); int v = es.toInt(); if (v == 0) v = 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 es.cutLeft(1).cutRight(1); int v = es.toInt(); if (v == 0) v = 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 es.cutLeft(1).cutRight(1); int v = es.toInt(); if (v == 0) v = 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 es.cutLeft(1).cutRight(1); int v = es.toInt(); if (v == 0) v = 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 es.cutLeft(1).cutRight(1); int v = es.toInt(); if (v) PRIVATE->cur_x = piClamp(v - 1, 0, size_x - 1); + PRIVATE->line_format = PRIVATE->cur_format; } if (es.back() == 'd') { // goto line es.cutLeft(1).cutRight(1); int v = es.toInt(); if (v == 0) v = 1; PRIVATE->cur_x = 0; 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 es.cutLeft(1).cutRight(1); int v = es.toInt(); if (v == 0) v = 1; PRIVATE->cur_x = 0; PRIVATE->cur_y = piClamp(PRIVATE->cur_y + v, 0, size_y - 1); + PRIVATE->line_format = PRIVATE->cur_format; } if (es.back() == 'F') { // previous line es.cutLeft(1).cutRight(1); int v = es.toInt(); if (v == 0) v = 1; PRIVATE->cur_x = 0; 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 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 = 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 es.cutLeft(1).cutRight(1); 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_y < 0) PRIVATE->cur_y = 0; if (PRIVATE->cur_x >= size_x) { + PRIVATE->line_format = PRIVATE->cur_format; PRIVATE->cur_x = 0; PRIVATE->cur_y++; } @@ -813,6 +874,11 @@ bool PITerminal::resize(int cols, int rows) { ws.ws_col = cols; ws.ws_row = rows; 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 cells.resize(size_y); for (int i = 0; i < size_y; ++i) diff --git a/src/core/pitime.cpp b/src/core/pitime.cpp index 8ee6cb3e..58e9212d 100755 --- a/src/core/pitime.cpp +++ b/src/core/pitime.cpp @@ -232,10 +232,10 @@ PISystemTime PISystemTime::current(bool precise_but_not_system) { # endif sft.dwHighDateTime = ft.dwHighDateTime - __pi_ftjan1970.dwHighDateTime; if (ft.dwLowDateTime < __pi_ftjan1970.dwLowDateTime) { - sft.dwLowDateTime = ft.dwLowDateTime + (0xFFFFFFFF - __pi_ftjan1970.dwLowDateTime); + sft.dwLowDateTime += (0xFFFFFFFF - __pi_ftjan1970.dwLowDateTime); sft.dwHighDateTime--; } else - sft.dwLowDateTime = ft.dwLowDateTime - __pi_ftjan1970.dwLowDateTime; + sft.dwLowDateTime -= __pi_ftjan1970.dwLowDateTime; ullong lt = ullong(sft.dwHighDateTime) * 0x100000000U + ullong(sft.dwLowDateTime); return PISystemTime(lt / 10000000U, (lt % 10000000U) * 100U); }