You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

1078 lines
33 KiB

/*
Copyright 2007-2008 by Robert Knight <robertknight@gmail.com>
Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
*/
#ifndef TERMINALDISPLAY_H
#define TERMINALDISPLAY_H
// Qt
#include <QColor>
#include <QPointer>
#include <QWidget>
// Konsole
#include "Character.h"
#include "konsoleprivate_export.h"
#include "ScreenWindow.h"
#include "ColorScheme.h"
#include "Enumeration.h"
#include "ScrollState.h"
class QDrag;
class QDragEnterEvent;
class QDropEvent;
class QLabel;
class QTimer;
class QEvent;
class QVBoxLayout;
class QKeyEvent;
class QScrollBar;
class QShowEvent;
class QHideEvent;
class QTimerEvent;
class KMessageWidget;
namespace Konsole {
class FilterChain;
class TerminalImageFilterChain;
class SessionController;
/**
* A widget which displays output from a terminal emulation and sends input keypresses and mouse activity
* to the terminal.
*
* When the terminal emulation receives new output from the program running in the terminal,
* it will update the display by calling updateImage().
*
* TODO More documentation
*/
class KONSOLEPRIVATE_EXPORT TerminalDisplay : public QWidget
{
Q_OBJECT
public:
/** Constructs a new terminal display widget with the specified parent. */
explicit TerminalDisplay(QWidget *parent = nullptr);
~TerminalDisplay() Q_DECL_OVERRIDE;
/** Returns the terminal color palette used by the display. */
const ColorEntry *colorTable() const;
/** Sets the terminal color palette used by the display. */
void setColorTable(const ColorEntry table[]);
/**
* Sets the seed used to generate random colors for the display
* (in color schemes that support them).
*/
void setRandomSeed(uint randomSeed);
/**
* Returns the seed used to generate random colors for the display
* (in color schemes that support them).
*/
uint randomSeed() const;
/** Sets the opacity of the terminal display. */
void setOpacity(qreal opacity);
/** Sets the background picture */
void setWallpaper(ColorSchemeWallpaper::Ptr p);
/**
* Specifies whether the terminal display has a vertical scroll bar, and if so whether it
* is shown on the left or right side of the display.
*/
void setScrollBarPosition(Enum::ScrollBarPositionEnum position);
Enum::ScrollBarPositionEnum scrollBarPosition() const
{
return _scrollbarLocation;
}
/**
* Sets the current position and range of the display's scroll bar.
*
* @param cursor The position of the scroll bar's thumb.
* @param slines The maximum value of the scroll bar.
*/
void setScroll(int cursor, int slines);
void setScrollFullPage(bool fullPage);
bool scrollFullPage() const;
/**
* Returns the display's filter chain. When the image for the display is updated,
* the text is passed through each filter in the chain. Each filter can define
* hotspots which correspond to certain strings (such as URLs or particular words).
* Depending on the type of the hotspots created by the filter ( returned by Filter::Hotspot::type() )
* the view will draw visual cues such as underlines on mouse-over for links or translucent
* rectangles for markers.
*
* To add a new filter to the view, call:
* viewWidget->filterChain()->addFilter( filterObject );
*/
FilterChain *filterChain() const;
/**
* Updates the filters in the display's filter chain. This will cause
* the hotspots to be updated to match the current image.
*
* WARNING: This function can be expensive depending on the
* image size and number of filters in the filterChain()
*
* TODO - This API does not really allow efficient usage. Revise it so
* that the processing can be done in a better way.
*
* eg:
* - Area of interest may be known ( eg. mouse cursor hovering
* over an area )
*/
void processFilters();
/**
* Returns a list of menu actions created by the filters for the content
* at the given @p position.
*/
QList<QAction *> filterActions(const QPoint &position);
/** Specifies whether or not the cursor can blink. */
void setBlinkingCursorEnabled(bool blink);
/** Returns true if the cursor is allowed to blink or false otherwise. */
bool blinkingCursorEnabled() const
{
return _allowBlinkingCursor;
}
/** Specifies whether or not text can blink. */
void setBlinkingTextEnabled(bool blink);
void setControlDrag(bool enable)
{
_ctrlRequiredForDrag = enable;
}
bool ctrlRequiredForDrag() const
{
return _ctrlRequiredForDrag;
}
void setDropUrlsAsText(bool enable)
{
_dropUrlsAsText = enable;
}
bool getDropUrlsAsText() const
{
return _dropUrlsAsText;
}
/** Sets how the text is selected when the user triple clicks within the display. */
void setTripleClickMode(Enum::TripleClickModeEnum mode)
{
_tripleClickMode = mode;
}
/** See setTripleClickSelectionMode() */
Enum::TripleClickModeEnum tripleClickMode() const
{
return _tripleClickMode;
}
/**
* Specifies whether links and email addresses should be opened when
* clicked with the mouse. Defaults to false.
*/
void setOpenLinksByDirectClick(bool value)
{
_openLinksByDirectClick = value;
}
/**
* Returns true if links and email addresses should be opened when
* clicked with the mouse.
*/
bool getOpenLinksByDirectClick() const
{
return _openLinksByDirectClick;
}
/**
* Sets whether leading spaces should be trimmed in selected text.
*/
void setTrimLeadingSpaces(bool enabled)
{
_trimLeadingSpaces = enabled;
}
/**
* Returns true if leading spaces should be trimmed in selected text.
*/
bool trimLeadingSpaces() const
{
return _trimLeadingSpaces;
}
/**
* Sets whether trailing spaces should be trimmed in selected text.
*/
void setTrimTrailingSpaces(bool enabled)
{
_trimTrailingSpaces = enabled;
}
/**
* Returns true if trailing spaces should be trimmed in selected text.
*/
bool trimTrailingSpaces() const
{
return _trimTrailingSpaces;
}
void setLineSpacing(uint);
uint lineSpacing() const;
void setSessionController(SessionController *controller);
SessionController *sessionController();
/**
* Sets the shape of the keyboard cursor. This is the cursor drawn
* at the position in the terminal where keyboard input will appear.
*
* In addition the terminal display widget also has a cursor for
* the mouse pointer, which can be set using the QWidget::setCursor()
* method.
*
* Defaults to BlockCursor
*/
void setKeyboardCursorShape(Enum::CursorShapeEnum shape);
/**
* Returns the shape of the keyboard cursor. See setKeyboardCursorShape()
*/
Enum::CursorShapeEnum keyboardCursorShape() const;
/**
* Sets the Cursor Style (DECSCUSR) via escape sequences
* @p shape cursor shape
* @p isBlinking if true, the cursor will be set to blink
*/
void setCursorStyle(Enum::CursorShapeEnum shape, bool isBlinking);
/**
* Resets the cursor style to the current profile cursor shape and
* blinking settings
*/
void resetCursorStyle();
/**
* Sets the color used to draw the keyboard cursor.
*
* The keyboard cursor defaults to using the foreground color of the character
* underneath it.
*
* @param color By default, the widget uses the color of the
* character under the cursor to draw the cursor, and inverts the
* color of that character to make sure it is still readable. If @p
* color is a valid QColor, the widget uses that color to draw the
* cursor. If @p color is not an valid QColor, the widget falls back
* to the default behavior.
*/
void setKeyboardCursorColor(const QColor &color);
/**
* Returns the color of the keyboard cursor, or an invalid color if the keyboard
* cursor color is set to change according to the foreground color of the character
* underneath it.
*/
QColor keyboardCursorColor() const;
/**
* Returns the number of lines of text which can be displayed in the widget.
*
* This will depend upon the height of the widget and the current font.
* See fontHeight()
*/
int lines() const
{
return _lines;
}
/**
* Returns the number of characters of text which can be displayed on
* each line in the widget.
*
* This will depend upon the width of the widget and the current font.
* See fontWidth()
*/
int columns() const
{
return _columns;
}
/**
* Returns the height of the characters in the font used to draw the text in the display.
*/
int fontHeight() const
{
return _fontHeight;
}
/**
* Returns the width of the characters in the display.
* This assumes the use of a fixed-width font.
*/
int fontWidth() const
{
return _fontWidth;
}
void setSize(int columns, int lines);
// reimplemented
QSize sizeHint() const Q_DECL_OVERRIDE;
/**
* Sets which characters, in addition to letters and numbers,
* are regarded as being part of a word for the purposes
* of selecting words in the display by double clicking on them.
*
* The word boundaries occur at the first and last characters which
* are either a letter, number, or a character in @p wc
*
* @param wc An array of characters which are to be considered parts
* of a word ( in addition to letters and numbers ).
*/
void setWordCharacters(const QString &wc);
/**
* Returns the characters which are considered part of a word for the
* purpose of selecting words in the display with the mouse.
*
* @see setWordCharacters()
*/
QString wordCharacters() const
{
return _wordCharacters;
}
/**
* Sets the type of effect used to alert the user when a 'bell' occurs in the
* terminal session.
*
* The terminal session can trigger the bell effect by calling bell() with
* the alert message.
*/
void setBellMode(int mode);
/**
* Returns the type of effect used to alert the user when a 'bell' occurs in
* the terminal session.
*
* See setBellMode()
*/
int bellMode() const;
/** Play a visual bell for prompt or warning. */
void visualBell();
/**
* Specified whether zoom terminal on Ctrl+mousewheel is enabled or not.
* Defaults to enabled.
*/
void setMouseWheelZoom(bool value)
{
_mouseWheelZoom = value;
}
/**
* Returns the whether zoom terminal on Ctrl+mousewheel is enabled.
*
* See setMouseWheelZoom()
*/
bool mouseWheelZoom()
{
return _mouseWheelZoom;
}
/**
* Reimplemented. Has no effect. Use setVTFont() to change the font
* used to draw characters in the display.
*/
virtual void setFont(const QFont &);
/** Returns the font used to draw characters in the display */
QFont getVTFont()
{
return font();
}
/**
* Sets the font used to draw the display. Has no effect if @p font
* is larger than the size of the display itself.
*/
void setVTFont(const QFont &f);
/** Increases the font size */
void increaseFontSize();
/** Decreases the font size */
void decreaseFontSize();
/**
* Specified whether anti-aliasing of text in the terminal display
* is enabled or not. Defaults to enabled.
*/
void setAntialias(bool value)
{
_antialiasText = value;
}
/**
* Returns true if anti-aliasing of text in the terminal is enabled.
*/
bool antialias() const
{
return _antialiasText;
}
/**
* Specifies whether characters with intense colors should be rendered
* as bold. Defaults to true.
*/
void setBoldIntense(bool value)
{
_boldIntense = value;
}
/**
* Returns true if characters with intense colors are rendered in bold.
*/
bool getBoldIntense() const
{
return _boldIntense;
}
/**
* Specifies whether line characters will be displayed using font instead
* of builtin code.
* as bold. Defaults to false.
*/
void setUseFontLineCharacters(bool value)
{
_useFontLineCharacters = value;
}
/**
* Returns true if font line characters will be used.
*/
bool getFontLineCharacters() const
{
return _useFontLineCharacters;
}
/**
* Sets whether or not the current height and width of the
* terminal in lines and columns is displayed whilst the widget
* is being resized.
*/
void setShowTerminalSizeHint(bool on)
{
_showTerminalSizeHint = on;
}
/**
* Returns whether or not the current height and width of
* the terminal in lines and columns is displayed whilst the widget
* is being resized.
*/
bool showTerminalSizeHint() const
{
return _showTerminalSizeHint;
}
/**
* Sets the status of the BiDi rendering inside the terminal display.
* Defaults to disabled.
*/
void setBidiEnabled(bool set)
{
_bidiEnabled = set;
}
/**
* Returns the status of the BiDi rendering in this widget.
*/
bool isBidiEnabled() const
{
return _bidiEnabled;
}
/**
* Sets the modifiers that shows URL hints when they are pressed
* Defaults to disabled.
*/
void setUrlHintsModifiers(int modifiers)
{
_urlHintsModifiers = Qt::KeyboardModifiers(modifiers);
}
/**
* Sets the terminal screen section which is displayed in this widget.
* When updateImage() is called, the display fetches the latest character image from the
* the associated terminal screen window.
*
* In terms of the model-view paradigm, the ScreenWindow is the model which is rendered
* by the TerminalDisplay.
*/
void setScreenWindow(ScreenWindow *window);
/** Returns the terminal screen section which is displayed in this widget. See setScreenWindow() */
ScreenWindow *screenWindow() const;
// Select the current line.
void selectCurrentLine();
/**
* Selects everything in the terminal
*/
void selectAll();
void printContent(QPainter &painter, bool friendly);
/**
* Gets the background of the display
* @see setBackgroundColor(), setColorTable(), setForegroundColor()
*/
QColor getBackgroundColor() const;
bool bracketedPasteMode() const;
/**
* Returns true if the flow control warning box is enabled.
* See outputSuspended() and setFlowControlWarningEnabled()
*/
bool flowControlWarningEnabled() const
{
return _flowControlWarningEnabled;
}
/** See setUsesMouseTracking() */
bool usesMouseTracking() const;
/** See setAlternateScrolling() */
bool alternateScrolling() const;
public Q_SLOTS:
/**
* Scrolls current ScreenWindow
*
* it's needed for proper handling scroll commands in the Vt102Emulation class
*/
void scrollScreenWindow(enum ScreenWindow::RelativeScrollMode mode, int amount);
/**
* Causes the terminal display to fetch the latest character image from the associated
* terminal screen ( see setScreenWindow() ) and redraw the display.
*/
void updateImage();
/**
* Causes the terminal display to fetch the latest line status flags from the
* associated terminal screen ( see setScreenWindow() ).
*/
void updateLineProperties();
void setAutoCopySelectedText(bool enabled);
void setCopyTextAsHTML(bool enabled);
void setMiddleClickPasteMode(Enum::MiddleClickPasteModeEnum mode);
/** Copies the selected text to the X11 Selection. */
void copyToX11Selection();
/** Copies the selected text to the system clipboard. */
void copyToClipboard();
/**
* Pastes the content of the clipboard into the
* display.
*/
void pasteFromClipboard(bool appendEnter = false);
/**
* Pastes the content of the X11 selection into the
* display.
*/
void pasteFromX11Selection(bool appendEnter = false);
/**
* Changes whether the flow control warning box should be shown when the flow control
* stop key (Ctrl+S) are pressed.
*/
void setFlowControlWarningEnabled(bool enable);
/**
* Causes the widget to display or hide a message informing the user that terminal
* output has been suspended (by using the flow control key combination Ctrl+S)
*
* @param suspended True if terminal output has been suspended and the warning message should
* be shown or false to indicate that terminal output has been resumed and that
* the warning message should disappear.
*/
void outputSuspended(bool suspended);
/**
* Sets whether the program currently running in the terminal is interested
* in Mouse Tracking events.
*
* When set to true, Konsole will send Mouse Tracking events.
*
* The user interaction needed to create text selections will change
* also, and the user will be required to hold down the Shift key to
* create a selection or perform other mouse activities inside the view
* area, since the program running in the terminal is being allowed
* to handle normal mouse events itself.
*
* @param on Set to true if the program running in the terminal is
* interested in Mouse Tracking events or false otherwise.
*/
void setUsesMouseTracking(bool on);
/**
* Sets the AlternateScrolling profile property which controls whether
* to emulate up/down key presses for mouse scroll wheel events.
* For more details, check the documentation of that property in the
* Profile header.
* Enabled by default.
*/
void setAlternateScrolling(bool enable);
void setBracketedPasteMode(bool on);
/**
* Shows a notification that a bell event has occurred in the terminal.
* TODO: More documentation here
*/
void bell(const QString &message);
/**
* Sets the background of the display to the specified color.
* @see setColorTable(), getBackgroundColor(), setForegroundColor()
*/
void setBackgroundColor(const QColor &color);
/**
* Sets the text of the display to the specified color.
* @see setColorTable(), setBackgroundColor(), getBackgroundColor()
*/
void setForegroundColor(const QColor &color);
/**
* Sets the display's contents margins.
*/
void setMargin(int margin);
/**
* Sets whether the contents are centered between the margins.
*/
void setCenterContents(bool enable);
// Used to show/hide the message widget
void updateReadOnlyState(bool readonly);
Q_SIGNALS:
/**
* Emitted when the user presses a key whilst the terminal widget has focus.
*/
void keyPressedSignal(QKeyEvent *event);
/**
* A mouse event occurred.
* @param button The mouse button (0 for left button, 1 for middle button, 2 for right button, 3 for release)
* @param column The character column where the event occurred
* @param line The character row where the event occurred
* @param eventType The type of event. 0 for a mouse press / release or 1 for mouse motion
*/
void mouseSignal(int button, int column, int line, int eventType);
void changedFontMetricSignal(int height, int width);
void changedContentSizeSignal(int height, int width);
/**
* Emitted when the user right clicks on the display, or right-clicks
* with the Shift key held down if usesMouseTracking() is true.
*
* This can be used to display a context menu.
*/
void configureRequest(const QPoint &position);
/**
* When a shortcut which is also a valid terminal key sequence is pressed while
* the terminal widget has focus, this signal is emitted to allow the host to decide
* whether the shortcut should be overridden.
* When the shortcut is overridden, the key sequence will be sent to the terminal emulation instead
* and the action associated with the shortcut will not be triggered.
*
* @p override is set to false by default and the shortcut will be triggered as normal.
*/
void overrideShortcutCheck(QKeyEvent *keyEvent, bool &override);
void sendStringToEmu(const QByteArray &local8BitString);
void focusLost();
void focusGained();
protected:
bool event(QEvent *event) Q_DECL_OVERRIDE;
void paintEvent(QPaintEvent *pe) Q_DECL_OVERRIDE;
void showEvent(QShowEvent *event) Q_DECL_OVERRIDE;
void hideEvent(QHideEvent *event) Q_DECL_OVERRIDE;
void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE;
void contextMenuEvent(QContextMenuEvent *event) Q_DECL_OVERRIDE;
virtual void fontChange(const QFont &);
void focusInEvent(QFocusEvent *event) Q_DECL_OVERRIDE;
void focusOutEvent(QFocusEvent *event) Q_DECL_OVERRIDE;
void keyPressEvent(QKeyEvent *event) Q_DECL_OVERRIDE;
void keyReleaseEvent(QKeyEvent *event) Q_DECL_OVERRIDE;
void leaveEvent(QEvent *event) Q_DECL_OVERRIDE;
void mouseDoubleClickEvent(QMouseEvent *ev) Q_DECL_OVERRIDE;
void mousePressEvent(QMouseEvent *ev) Q_DECL_OVERRIDE;
void mouseReleaseEvent(QMouseEvent *ev) Q_DECL_OVERRIDE;
void mouseMoveEvent(QMouseEvent *ev) Q_DECL_OVERRIDE;
virtual void extendSelection(const QPoint &position);
void wheelEvent(QWheelEvent *ev) Q_DECL_OVERRIDE;
bool focusNextPrevChild(bool next) Q_DECL_OVERRIDE;
// drag and drop
void dragEnterEvent(QDragEnterEvent *event) Q_DECL_OVERRIDE;
void dropEvent(QDropEvent *event) Q_DECL_OVERRIDE;
void doDrag();
enum DragState {
diNone, diPending, diDragging
};
struct DragInfo {
DragState state;
QPoint start;
QDrag *dragObject;
} _dragInfo;
// classifies the 'ch' into one of three categories
// and returns a character to indicate which category it is in
//
// - A space (returns ' ')
// - Part of a word (returns 'a')
// - Other characters (returns the input character)
QChar charClass(const Character &ch) const;
void clearImage();
void mouseTripleClickEvent(QMouseEvent *ev);
void selectLine(QPoint pos, bool entireLine);
// reimplemented
void inputMethodEvent(QInputMethodEvent *event) Q_DECL_OVERRIDE;
QVariant inputMethodQuery(Qt::InputMethodQuery query) const Q_DECL_OVERRIDE;
void updateScrollBarPalette();
protected Q_SLOTS:
void scrollBarPositionChanged(int value);
void blinkTextEvent();
void blinkCursorEvent();
private Q_SLOTS:
void swapFGBGColors();
void viewScrolledByUser();
/**
* Called from the drag-and-drop popup. Causes the dropped URLs to be pasted as text.
*/
void dropMenuPasteActionTriggered();
void dropMenuCdActionTriggered();
void dismissOutputSuspendedMessage();
private:
Q_DISABLE_COPY(TerminalDisplay)
// -- Drawing helpers --
// divides the part of the display specified by 'rect' into
// fragments according to their colors and styles and calls
// drawTextFragment() or drawPrinterFriendlyTextFragment()
// to draw the fragments
void drawContents(QPainter &painter, const QRect &rect);
// draw a transparent rectangle over the line of the current match
void drawCurrentResultRect(QPainter &painter);
// draws a section of text, all the text in this section
// has a common color and style
void drawTextFragment(QPainter &painter, const QRect &rect, const QString &text,
const Character *style);
void drawPrinterFriendlyTextFragment(QPainter &painter, const QRect &rect, const QString &text,
const Character *style);
// draws the background for a text fragment
// if useOpacitySetting is true then the color's alpha value will be set to
// the display's transparency (set with setOpacity()), otherwise the background
// will be drawn fully opaque
void drawBackground(QPainter &painter, const QRect &rect, const QColor &backgroundColor,
bool useOpacitySetting);
// draws the cursor character
void drawCursor(QPainter &painter, const QRect &rect, const QColor &foregroundColor,
const QColor &backgroundColor, bool &invertCharacterColor);
// draws the characters or line graphics in a text fragment
void drawCharacters(QPainter &painter, const QRect &rect, const QString &text,
const Character *style, bool invertCharacterColor);
// draws a string of line graphics
void drawLineCharString(QPainter &painter, int x, int y, const QString &str,
const Character *attributes);
// draws the preedit string for input methods
void drawInputMethodPreeditString(QPainter &painter, const QRect &rect);
// --
// maps an area in the character image to an area on the widget
QRect imageToWidget(const QRect &imageArea) const;
// maps a point on the widget to the position ( ie. line and column )
// of the character at that point. When the edge is true, it maps to
// a character which left edge is closest to the point.
void getCharacterPosition(const QPoint &widgetPoint, int &line, int &column, bool edge) const;
// the area where the preedit string for input methods will be draw
QRect preeditRect() const;
// shows a notification window in the middle of the widget indicating the terminal's
// current size in columns and lines
void showResizeNotification();
// scrolls the image by a number of lines.
// 'lines' may be positive ( to scroll the image down )
// or negative ( to scroll the image up )
// 'region' is the part of the image to scroll - currently only
// the top, bottom and height of 'region' are taken into account,
// the left and right are ignored.
void scrollImage(int lines, const QRect &screenWindowRegion);
void calcGeometry();
void propagateSize();
void updateImageSize();
void makeImage();
void paintFilters(QPainter &painter);
// returns a region covering all of the areas of the widget which contain
// a hotspot
QRegion hotSpotRegion() const;
// returns the position of the cursor in columns and lines
QPoint cursorPosition() const;
// returns true if the cursor's position is on display.
bool isCursorOnDisplay() const;
// redraws the cursor
void updateCursor();
bool handleShortcutOverrideEvent(QKeyEvent *keyEvent);
void doPaste(QString text, bool appendReturn);
void processMidButtonClick(QMouseEvent *ev);
QPoint findLineStart(const QPoint &pnt);
QPoint findLineEnd(const QPoint &pnt);
QPoint findWordStart(const QPoint &pnt);
QPoint findWordEnd(const QPoint &pnt);
// Uses the current settings for trimming whitespace and preserving linebreaks to create a proper flag value for Screen
Screen::DecodingOptions currentDecodingOptions();
// Boilerplate setup for MessageWidget
KMessageWidget* createMessageWidget(const QString &text);
int loc(int x, int y) const;
// the window onto the terminal screen which this display
// is currently showing.
QPointer<ScreenWindow> _screenWindow;
bool _bellMasked;
QVBoxLayout *_verticalLayout;
bool _fixedFont; // has fixed pitch
int _fontHeight; // height
int _fontWidth; // width
int _fontAscent; // ascend
bool _boldIntense; // Whether intense colors should be rendered with bold font
int _lines; // the number of lines that can be displayed in the widget
int _columns; // the number of columns that can be displayed in the widget
int _usedLines; // the number of lines that are actually being used, this will be less
// than 'lines' if the character image provided with setImage() is smaller
// than the maximum image size which can be displayed
int _usedColumns; // the number of columns that are actually being used, this will be less
// than 'columns' if the character image provided with setImage() is smaller
// than the maximum image size which can be displayed
QRect _contentRect;
Character *_image; // [lines][columns]
// only the area [usedLines][usedColumns] in the image contains valid data
int _imageSize;
QVector<LineProperty> _lineProperties;
ColorEntry _colorTable[TABLE_COLORS];
uint _randomSeed;
bool _resizing;
bool _showTerminalSizeHint;
bool _bidiEnabled;
bool _usesMouseTracking;
bool _alternateScrolling;
bool _bracketedPasteMode;
QPoint _iPntSel; // initial selection point
QPoint _pntSel; // current selection point
QPoint _tripleSelBegin; // help avoid flicker
int _actSel; // selection state
bool _wordSelectionMode;
bool _lineSelectionMode;
bool _preserveLineBreaks;
bool _columnSelectionMode;
bool _autoCopySelectedText;
bool _copyTextAsHTML;
Enum::MiddleClickPasteModeEnum _middleClickPasteMode;
QScrollBar *_scrollBar;
Enum::ScrollBarPositionEnum _scrollbarLocation;
bool _scrollFullPage;
QString _wordCharacters;
int _bellMode;
bool _allowBlinkingText; // allow text to blink
bool _allowBlinkingCursor; // allow cursor to blink
bool _textBlinking; // text is blinking, hide it when drawing
bool _cursorBlinking; // cursor is blinking, hide it when drawing
bool _hasTextBlinker; // has characters to blink
QTimer *_blinkTextTimer;
QTimer *_blinkCursorTimer;
Qt::KeyboardModifiers _urlHintsModifiers;
bool _showUrlHint;
bool _openLinksByDirectClick; // Open URL and hosts by single mouse click
bool _ctrlRequiredForDrag; // require Ctrl key for drag selected text
bool _dropUrlsAsText; // always paste URLs as text without showing copy/move menu
Enum::TripleClickModeEnum _tripleClickMode;
bool _possibleTripleClick; // is set in mouseDoubleClickEvent and deleted
// after QApplication::doubleClickInterval() delay
QLabel *_resizeWidget;
QTimer *_resizeTimer;
bool _flowControlWarningEnabled;
//widgets related to the warning message that appears when the user presses Ctrl+S to suspend
//terminal output - informing them what has happened and how to resume output
KMessageWidget *_outputSuspendedMessageWidget;
uint _lineSpacing;
QSize _size;
QRgb _blendColor;
ColorSchemeWallpaper::Ptr _wallpaper;
// list of filters currently applied to the display. used for links and
// search highlight
TerminalImageFilterChain *_filterChain;
QRegion _mouseOverHotspotArea;
bool _filterUpdateRequired;
Enum::CursorShapeEnum _cursorShape;
// cursor color. If it is invalid (by default) then the foreground
// color of the character under the cursor is used
QColor _cursorColor;
struct InputMethodData {
QString preeditString;
QRect previousPreeditRect;
};
InputMethodData _inputMethodData;
bool _antialiasText; // do we anti-alias or not
bool _useFontLineCharacters;
bool _printerFriendly; // are we currently painting to a printer in black/white mode
//the delay in milliseconds between redrawing blinking text
static const int TEXT_BLINK_DELAY = 500;
//the duration of the size hint in milliseconds
static const int SIZE_HINT_DURATION = 1000;
SessionController *_sessionController;
bool _trimLeadingSpaces; // trim leading spaces in selected text
bool _trimTrailingSpaces; // trim trailing spaces in selected text
bool _mouseWheelZoom; // enable mouse wheel zooming or not
int _margin; // the contents margin
bool _centerContents; // center the contents between margins
KMessageWidget *_readOnlyMessageWidget; // Message shown at the top when read-only mode gets activated
// Needed to know whether the mode really changed between update calls
bool _readOnly;
qreal _opacity;
ScrollState _scrollWheelState;
friend class TerminalDisplayAccessible;
};
class AutoScrollHandler : public QObject
{
Q_OBJECT
public:
explicit AutoScrollHandler(QWidget *parent);
protected:
void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE;
bool eventFilter(QObject *watched, QEvent *event) Q_DECL_OVERRIDE;
private:
QWidget *widget() const
{
return static_cast<QWidget *>(parent());
}
int _timerId;
};
}
#endif // TERMINALDISPLAY_H