diff --git a/src/Screen.cpp b/src/Screen.cpp index f56bbb0e..46b930da 100644 --- a/src/Screen.cpp +++ b/src/Screen.cpp @@ -11,6 +11,7 @@ // Qt #include #include +#include // Konsole decoders #include @@ -366,23 +367,12 @@ void Screen::restoreCursor() updateEffectiveRendition(); } -#include - void Screen::resizeImage(int new_lines, int new_columns) { if ((new_lines == _lines) && (new_columns == _columns)) { return; } - if (_cuY > new_lines - 1) { - // attempt to preserve focus and _lines - _bottomMargin = _lines - 1; //FIXME: margin lost - for (int i = 0; i < _cuY - (new_lines - 1); i++) { - addHistLine(); - scrollUp(0, 1); - } - } - if (new_columns != _columns) { // Random not printable char to mark nextline const auto NextLine = Character(130, @@ -392,6 +382,7 @@ void Screen::resizeImage(int new_lines, int new_columns) false); // First join everything. int currentPos = 0; + int count_needed_lines = 0; while (currentPos != _screenLines.count()) { // if the line have the 'NextLine' char, concat with the next line and remove it. if (_screenLines[currentPos].count() && _screenLines[currentPos].at(_screenLines[currentPos].count() - 1) == NextLine) { @@ -401,9 +392,22 @@ void Screen::resizeImage(int new_lines, int new_columns) _cuY--; continue; } + count_needed_lines += _screenLines[currentPos].count() / (new_columns + 1); currentPos++; } + // If it will need more lines than new_lines have, send lines to _history + count_needed_lines += _cuY; + if (count_needed_lines > new_lines - 1) { + _screenLines.resize(_lines + 1); + // attempt to preserve focus and _lines + _bottomMargin = _lines - 1; //FIXME: margin lost + for (int i = 0; i < count_needed_lines - (new_lines - 1); i++) { + addHistLine(); + scrollUp(0, 1); + } + } + // Then move the data to lines below. currentPos = 0; while (currentPos != _screenLines.count()) { @@ -426,6 +430,14 @@ void Screen::resizeImage(int new_lines, int new_columns) } _screenLines.resize(new_lines + 1); } else { + if (_cuY > new_lines - 1) { + // attempt to preserve focus and _lines + _bottomMargin = _lines - 1; //FIXME: margin lost + for (int i = 0; i < _cuY - (new_lines - 1); i++) { + addHistLine(); + scrollUp(0, 1); + } + } _screenLines.resize(new_lines + 1); }