2
Copyright 2007-2008 by Robert Knight <robertknight@gmail.com>
4
This program is free software; you can redistribute it and/or modify
5
it under the terms of the GNU General Public License as published by
6
the Free Software Foundation; either version 2 of the License, or
7
(at your option) any later version.
9
This program is distributed in the hope that it will be useful,
10
but WITHOUT ANY WARRANTY; without even the implied warranty of
11
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
GNU General Public License for more details.
14
You should have received a copy of the GNU General Public License
15
along with this program; if not, write to the Free Software
16
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20
#ifndef SCREENWINDOW_H
21
#define SCREENWINDOW_H
29
#include "Character.h"
37
* Provides a window onto a section of a terminal screen. A terminal widget can then render
38
* the contents of the window and use the window to change the terminal screen's selection
39
* in response to mouse or keyboard input.
41
* A new ScreenWindow for a terminal session can be created by calling Emulation::createWindow()
43
* Use the scrollTo() method to scroll the window up and down on the screen.
44
* Use the getImage() method to retrieve the character image which is currently visible in the window.
46
* setTrackOutput() controls whether the window moves to the bottom of the associated screen when new
47
* lines are added to it.
49
* Whenever the output from the underlying screen is changed, the notifyOutputChanged() slot should
50
* be called. This in turn will update the window's position and emit the outputChanged() signal
53
class ScreenWindow : public QObject
59
* Constructs a new screen window with the given parent.
60
* A screen must be specified by calling setScreen() before calling getImage() or getLineProperties().
62
* You should not call this constructor directly, instead use the Emulation::createWindow() method
63
* to create a window on the emulation which you wish to view. This allows the emulation
64
* to notify the window when the associated screen has changed and synchronize selection updates
65
* between all views on a session.
67
ScreenWindow(QObject* parent = 0);
68
virtual ~ScreenWindow();
70
/** Sets the screen which this window looks onto */
71
void setScreen(Screen* screen);
72
/** Returns the screen which this window looks onto */
73
Screen* screen() const;
76
* Returns the image of characters which are currently visible through this window
79
* The returned buffer is managed by the ScreenWindow instance and does not need to be
80
* deleted by the caller.
82
Character* getImage();
85
* Returns the line attributes associated with the lines of characters which
86
* are currently visible through this window
88
QVector<LineProperty> getLineProperties();
91
* Returns the number of lines which the region of the window
92
* specified by scrollRegion() has been scrolled by since the last call
93
* to resetScrollCount(). scrollRegion() is in most cases the
94
* whole window, but will be a smaller area in, for example, applications
95
* which provide split-screen facilities.
97
* This is not guaranteed to be accurate, but allows views to optimize
98
* rendering by reducing the amount of costly text rendering that
99
* needs to be done when the output is scrolled.
101
int scrollCount() const;
104
* Resets the count of scrolled lines returned by scrollCount()
106
void resetScrollCount();
109
* Returns the area of the window which was last scrolled, this is
110
* usually the whole window area.
112
* Like scrollCount(), this is not guaranteed to be accurate,
113
* but allows views to optimize rendering.
115
QRect scrollRegion() const;
118
* Sets the start of the selection to the given @p line and @p column within
121
void setSelectionStart( int column , int line , bool columnMode );
123
* Sets the end of the selection to the given @p line and @p column within
126
void setSelectionEnd( int column , int line );
128
* Retrieves the start of the selection within the window.
130
void getSelectionStart( int& column , int& line );
132
* Retrieves the end of the selection within the window.
134
void getSelectionEnd( int& column , int& line );
136
* Returns true if the character at @p line , @p column is part of the selection.
138
bool isSelected( int column , int line );
140
* Clears the current selection
142
void clearSelection();
144
/** Sets the number of lines in the window */
145
void setWindowLines(int lines);
146
/** Returns the number of lines in the window */
147
int windowLines() const;
148
/** Returns the number of columns in the window */
149
int windowColumns() const;
151
/** Returns the total number of lines in the screen */
152
int lineCount() const;
153
/** Returns the total number of columns in the screen */
154
int columnCount() const;
156
/** Returns the index of the line which is currently at the top of this window */
157
int currentLine() const;
160
* Returns the position of the cursor
163
QPoint cursorPosition() const;
166
* Convenience method. Returns true if the window is currently at the bottom
169
bool atEndOfOutput() const;
171
/** Scrolls the window so that @p line is at the top of the window */
172
void scrollTo( int line );
174
/** Describes the units which scrollBy() moves the window by. */
175
enum RelativeScrollMode
177
/** Scroll the window down by a given number of lines. */
180
* Scroll the window down by a given number of pages, where
181
* one page is windowLines() lines
187
* Scrolls the window relative to its current position on the screen.
189
* @param mode Specifies whether @p amount refers to the number of lines or the number
190
* of pages to scroll.
191
* @param amount The number of lines or pages ( depending on @p mode ) to scroll by. If
192
* this number is positive, the view is scrolled down. If this number is negative, the view
195
void scrollBy( RelativeScrollMode mode , int amount );
198
* Specifies whether the window should automatically move to the bottom
199
* of the screen when new output is added.
201
* If this is set to true, the window will be moved to the bottom of the associated screen ( see
202
* screen() ) when the notifyOutputChanged() method is called.
204
void setTrackOutput(bool trackOutput);
206
* Returns whether the window automatically moves to the bottom of the screen as
207
* new output is added. See setTrackOutput()
209
bool trackOutput() const;
212
* Returns the text which is currently selected.
214
* @param preserveLineBreaks See Screen::selectedText()
216
QString selectedText( bool preserveLineBreaks ) const;
220
* Notifies the window that the contents of the associated terminal screen have changed.
221
* This moves the window to the bottom of the screen if trackOutput() is true and causes
222
* the outputChanged() signal to be emitted.
224
void notifyOutputChanged();
228
* Emitted when the contents of the associated terminal screen (see screen()) changes.
230
void outputChanged();
233
* Emitted when the screen window is scrolled to a different position.
235
* @param line The line which is now at the top of the window.
237
void scrolled(int line);
239
/** Emitted when the selection is changed. */
240
void selectionChanged();
243
int endWindowLine() const;
244
void fillUnusedArea();
246
Screen* _screen; // see setScreen() , screen()
247
Character* _windowBuffer;
248
int _windowBufferSize;
249
bool _bufferNeedsUpdate;
252
int _currentLine; // see scrollTo() , currentLine()
253
bool _trackOutput; // see setTrackOutput() , trackOutput()
254
int _scrollCount; // count of lines which the window has been scrolled by since
255
// the last call to resetScrollCount()
259
#endif // SCREENWINDOW_H