Fix the long standing limitation where multiple views on the same terminal session had to be the same size - the size of the smallest view. This means that it is now possible, for example, to have a large view on a session for browsing and examining output and a smaller view on the same session for input. The underlying terminal does not support the concept of multiple windows, so the size reported to terminal applications is still that of the smallest view. Full-screen applications such as vim and emacs will therefore be the size of the smallest view on all views.

* Add a method in ScreenWindow to set the size of the window (in lines, the number of columns is still ifxed).  
* Call this method in TerminalDisplay to set the window size when the widget is resized or when the screen window of a display is initially set.
* Fix ScreenWindow::getImage() and ScreenWindow::getLineProperties() so that they do not attempt to retrieve information about lines beyond the end of the screen.
* Fix ScreenWindow::getLineProperties() to always return result vector of size windowColumns(), though the number of elements copied from the screen may be less.


svn path=/trunk/KDE/kdebase/apps/konsole/; revision=749874
This commit is contained in:
Robert Knight
2007-12-18 04:32:05 +00:00
parent a51b972080
commit c708aff22c
3 changed files with 29 additions and 3 deletions

View File

@@ -33,6 +33,7 @@ ScreenWindow::ScreenWindow(QObject* parent)
, _windowBuffer(0)
, _windowBufferSize(0)
, _bufferNeedsUpdate(true)
, _windowLines(1)
, _currentLine(0)
, _trackOutput(true)
, _scrollCount(0)
@@ -70,15 +71,26 @@ Character* ScreenWindow::getImage()
return _windowBuffer;
_screen->getImage(_windowBuffer,size,
_currentLine,_currentLine + windowLines() - 1);
_currentLine,endWindowLine());
_bufferNeedsUpdate = false;
return _windowBuffer;
}
int ScreenWindow::endWindowLine() const
{
return qMin(_currentLine + windowLines() - 1,
_screen->getHistLines() + _screen->getLines() - 1);
}
QVector<LineProperty> ScreenWindow::getLineProperties()
{
return _screen->getLineProperties(_currentLine,_currentLine+windowLines()-1);
QVector<LineProperty> result = _screen->getLineProperties(_currentLine,endWindowLine());
if (result.count() != windowLines())
result.resize(windowLines());
return result;
}
QString ScreenWindow::selectedText( bool preserveLineBreaks ) const
@@ -126,9 +138,14 @@ void ScreenWindow::clearSelection()
emit selectionChanged();
}
void ScreenWindow::setWindowLines(int lines)
{
Q_ASSERT(lines > 0);
_windowLines = lines;
}
int ScreenWindow::windowLines() const
{
return _screen->getLines();
return _windowLines;
}
int ScreenWindow::windowColumns() const