Mercurial > hg > octave-lyh
diff gui/src/terminal/TerminalDisplay.cpp @ 13506:c70511cf64ee
Reformatted to GNU Style.
author | Jacob Dawid <jacob.dawid@googlemail.com> |
---|---|
date | Sun, 17 Jul 2011 22:59:28 +0200 |
parents | 86d6c3b90ad7 |
children | 7eb8cd35454c |
line wrap: on
line diff
--- a/gui/src/terminal/TerminalDisplay.cpp +++ b/gui/src/terminal/TerminalDisplay.cpp @@ -62,30 +62,38 @@ // gamma correction for the dim colors to compensate for bright X screens. // It contains the 8 ansiterm/xterm colors in 2 intensities. { - // Fixme: could add faint colors here, also. - // normal - ColorEntry(QColor(0x00,0x00,0x00), 0), ColorEntry( QColor(0xB2,0xB2,0xB2), 1), // Dfore, Dback - ColorEntry(QColor(0x00,0x00,0x00), 0), ColorEntry( QColor(0xB2,0x18,0x18), 0), // Black, Red - ColorEntry(QColor(0x18,0xB2,0x18), 0), ColorEntry( QColor(0xB2,0x68,0x18), 0), // Green, Yellow - ColorEntry(QColor(0x18,0x18,0xB2), 0), ColorEntry( QColor(0xB2,0x18,0xB2), 0), // Blue, Magenta - ColorEntry(QColor(0x18,0xB2,0xB2), 0), ColorEntry( QColor(0xB2,0xB2,0xB2), 0), // Cyan, White - // intensiv - ColorEntry(QColor(0x00,0x00,0x00), 0), ColorEntry( QColor(0xFF,0xFF,0xFF), 1), - ColorEntry(QColor(0x68,0x68,0x68), 0), ColorEntry( QColor(0xFF,0x54,0x54), 0), - ColorEntry(QColor(0x54,0xFF,0x54), 0), ColorEntry( QColor(0xFF,0xFF,0x54), 0), - ColorEntry(QColor(0x54,0x54,0xFF), 0), ColorEntry( QColor(0xFF,0x54,0xFF), 0), - ColorEntry(QColor(0x54,0xFF,0xFF), 0), ColorEntry( QColor(0xFF,0xFF,0xFF), 0) + // Fixme: could add faint colors here, also. + // normal + ColorEntry (QColor (0x00, 0x00, 0x00), 0), ColorEntry (QColor (0xB2, 0xB2, 0xB2), 1), // Dfore, Dback + ColorEntry (QColor (0x00, 0x00, 0x00), 0), ColorEntry (QColor (0xB2, 0x18, 0x18), 0), // Black, Red + ColorEntry (QColor (0x18, 0xB2, 0x18), 0), ColorEntry (QColor (0xB2, 0x68, 0x18), 0), // Green, Yellow + ColorEntry (QColor (0x18, 0x18, 0xB2), 0), ColorEntry (QColor (0xB2, 0x18, 0xB2), 0), // Blue, Magenta + ColorEntry (QColor (0x18, 0xB2, 0xB2), 0), ColorEntry (QColor (0xB2, 0xB2, 0xB2), 0), // Cyan, White + // intensiv + ColorEntry (QColor (0x00, 0x00, 0x00), 0), + ColorEntry (QColor (0xFF, 0xFF, 0xFF), 1), + ColorEntry (QColor (0x68, 0x68, 0x68), 0), + ColorEntry (QColor (0xFF, 0x54, 0x54), 0), + ColorEntry (QColor (0x54, 0xFF, 0x54), 0), + ColorEntry (QColor (0xFF, 0xFF, 0x54), 0), + ColorEntry (QColor (0x54, 0x54, 0xFF), 0), + ColorEntry (QColor (0xFF, 0x54, 0xFF), 0), + ColorEntry (QColor (0x54, 0xFF, 0xFF), 0), + ColorEntry (QColor (0xFF, 0xFF, 0xFF), 0) }; // scroll increment used when dragging selection at top/bottom of window. // static -bool TerminalDisplay::_antialiasText = true; -bool TerminalDisplay::HAVE_TRANSPARENCY = false; +bool + TerminalDisplay::_antialiasText = true; +bool + TerminalDisplay::HAVE_TRANSPARENCY = false; // we use this to force QPainter to display text in LTR mode // more information can be found in: http://unicode.org/reports/tr9/ -const QChar LTR_OVERRIDE_CHAR( 0x202D ); +const QChar +LTR_OVERRIDE_CHAR (0x202D); /* ------------------------------------------------------------------------- */ /* */ @@ -101,59 +109,71 @@ IBMPC (rgb) Black Blue Green Cyan Red Magenta Yellow White */ -ScreenWindow* TerminalDisplay::screenWindow() const +ScreenWindow * +TerminalDisplay::screenWindow () const { - return _screenWindow; + return _screenWindow; } -void TerminalDisplay::setScreenWindow(ScreenWindow* window) + +void +TerminalDisplay::setScreenWindow (ScreenWindow * window) { - // disconnect existing screen window if any - if ( _screenWindow ) + // disconnect existing screen window if any + if (_screenWindow) { - disconnect( _screenWindow , 0 , this , 0 ); + disconnect (_screenWindow, 0, this, 0); } - _screenWindow = window; - - if ( window ) + _screenWindow = window; + + if (window) { - // TODO: Determine if this is an issue. - //#warning "The order here is not specified - does it matter whether updateImage or updateLineProperties comes first?" - connect( _screenWindow , SIGNAL(outputChanged()) , this , SLOT(updateLineProperties()) ); - connect( _screenWindow , SIGNAL(outputChanged()) , this , SLOT(updateImage()) ); - window->setWindowLines(_lines); + // TODO: Determine if this is an issue. + //#warning "The order here is not specified - does it matter whether updateImage or updateLineProperties comes first?" + connect (_screenWindow, SIGNAL (outputChanged ()), this, + SLOT (updateLineProperties ())); + connect (_screenWindow, SIGNAL (outputChanged ()), this, + SLOT (updateImage ())); + window->setWindowLines (_lines); } } -const ColorEntry* TerminalDisplay::colorTable() const +const ColorEntry * +TerminalDisplay::colorTable () const { - return _colorTable; + return _colorTable; } -void TerminalDisplay::setBackgroundColor(const QColor& color) + +void +TerminalDisplay::setBackgroundColor (const QColor & color) { - _colorTable[DEFAULT_BACK_COLOR].color = color; - QPalette p = palette(); - p.setColor( backgroundRole(), color ); - setPalette( p ); - - // Avoid propagating the palette change to the scroll bar - _scrollBar->setPalette( QApplication::palette() ); - - update(); + _colorTable[DEFAULT_BACK_COLOR].color = color; + QPalette p = palette (); + p.setColor (backgroundRole (), color); + setPalette (p); + + // Avoid propagating the palette change to the scroll bar + _scrollBar->setPalette (QApplication::palette ()); + + update (); } -void TerminalDisplay::setForegroundColor(const QColor& color) + +void +TerminalDisplay::setForegroundColor (const QColor & color) { - _colorTable[DEFAULT_FORE_COLOR].color = color; - - update(); + _colorTable[DEFAULT_FORE_COLOR].color = color; + + update (); } -void TerminalDisplay::setColorTable(const ColorEntry table[]) + +void +TerminalDisplay::setColorTable (const ColorEntry table[]) { - for (int i = 0; i < TABLE_COLORS; i++) - _colorTable[i] = table[i]; - - setBackgroundColor(_colorTable[DEFAULT_BACK_COLOR].color); + for (int i = 0; i < TABLE_COLORS; i++) + _colorTable[i] = table[i]; + + setBackgroundColor (_colorTable[DEFAULT_BACK_COLOR].color); } /* ------------------------------------------------------------------------- */ @@ -174,87 +194,96 @@ QCodec. */ -static inline bool isLineChar(quint16 c) { return ((c & 0xFF80) == 0x2500);} -static inline bool isLineCharString(const QString& string) +static inline bool +isLineChar (quint16 c) { - return (string.length() > 0) && (isLineChar(string.at(0).unicode())); + return ((c & 0xFF80) == 0x2500); +} + +static inline bool +isLineCharString (const QString & string) +{ + return (string.length () > 0) && (isLineChar (string.at (0).unicode ())); } // assert for i in [0..31] : vt100extended(vt100_graphics[i]) == i. -unsigned short vt100_graphics[32] = -{ // 0/8 1/9 2/10 3/11 4/12 5/13 6/14 7/15 +unsigned short vt100_graphics[32] = { // 0/8 1/9 2/10 3/11 4/12 5/13 6/14 7/15 0x0020, 0x25C6, 0x2592, 0x2409, 0x240c, 0x240d, 0x240a, 0x00b0, 0x00b1, 0x2424, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, 0xF800, 0xF801, 0x2500, 0xF803, 0xF804, 0x251c, 0x2524, 0x2534, 0x252c, 0x2502, 0x2264, 0x2265, 0x03C0, 0x2260, 0x00A3, 0x00b7 }; -void TerminalDisplay::fontChange(const QFont&) +void +TerminalDisplay::fontChange (const QFont &) { - QFontMetrics fm(font()); - _fontHeight = fm.height() + _lineSpacing; - - // waba TerminalDisplay 1.123: - // "Base character width on widest ASCII character. This prevents too wide - // characters in the presence of double wide (e.g. Japanese) characters." - // Get the width from representative normal width characters - _fontWidth = qRound((double)fm.width(REPCHAR)/(double)strlen(REPCHAR)); - - _fixedFont = true; - - int fw = fm.width(REPCHAR[0]); - for(unsigned int i=1; i< strlen(REPCHAR); i++) + QFontMetrics fm (font ()); + _fontHeight = fm.height () + _lineSpacing; + + // waba TerminalDisplay 1.123: + // "Base character width on widest ASCII character. This prevents too wide + // characters in the presence of double wide (e.g. Japanese) characters." + // Get the width from representative normal width characters + _fontWidth = + qRound ((double) fm.width (REPCHAR) / (double) strlen (REPCHAR)); + + _fixedFont = true; + + int fw = fm.width (REPCHAR[0]); + for (unsigned int i = 1; i < strlen (REPCHAR); i++) { - if (fw != fm.width(REPCHAR[i])) - { - _fixedFont = false; - break; - } + if (fw != fm.width (REPCHAR[i])) + { + _fixedFont = false; + break; + } } - if (_fontWidth < 1) - _fontWidth=1; - - _fontAscent = fm.ascent(); - - emit changedFontMetricSignal( _fontHeight, _fontWidth ); - propagateSize(); - update(); + if (_fontWidth < 1) + _fontWidth = 1; + + _fontAscent = fm.ascent (); + + emit changedFontMetricSignal (_fontHeight, _fontWidth); + propagateSize (); + update (); } -void TerminalDisplay::setVTFont(const QFont& f) +void +TerminalDisplay::setVTFont (const QFont & f) { - QFont font = f; - - QFontMetrics metrics(font); - - if ( !QFontInfo(font).fixedPitch() ) + QFont font = f; + + QFontMetrics metrics (font); + + if (!QFontInfo (font).fixedPitch ()) { - //kWarning() << "Using an unsupported variable-width font in the terminal. This may produce display errors."; + //kWarning() << "Using an unsupported variable-width font in the terminal. This may produce display errors."; } - if ( metrics.height() < height() && metrics.maxWidth() < width() ) + if (metrics.height () < height () && metrics.maxWidth () < width ()) { - // hint that text should be drawn without anti-aliasing. - // depending on the user's font configuration, this may not be respected - if (!_antialiasText) - font.setStyleStrategy( QFont::NoAntialias ); - - // experimental optimization. Konsole assumes that the terminal is using a - // mono-spaced font, in which case kerning information should have an effect. - // Disabling kerning saves some computation when rendering text. - font.setKerning(false); - - QWidget::setFont(font); - fontChange(font); + // hint that text should be drawn without anti-aliasing. + // depending on the user's font configuration, this may not be respected + if (!_antialiasText) + font.setStyleStrategy (QFont::NoAntialias); + + // experimental optimization. Konsole assumes that the terminal is using a + // mono-spaced font, in which case kerning information should have an effect. + // Disabling kerning saves some computation when rendering text. + font.setKerning (false); + + QWidget::setFont (font); + fontChange (font); } } -void TerminalDisplay::setFont(const QFont &) +void +TerminalDisplay::setFont (const QFont &) { - // ignore font change request if not coming from konsole itself + // ignore font change request if not coming from konsole itself } /* ------------------------------------------------------------------------- */ @@ -263,116 +292,88 @@ /* */ /* ------------------------------------------------------------------------- */ -TerminalDisplay::TerminalDisplay(QWidget *parent) - :QWidget(parent) - ,_screenWindow(0) - ,_allowBell(true) - ,_gridLayout(0) - ,_fontHeight(1) - ,_fontWidth(1) - ,_fontAscent(1) - ,_boldIntense(true) - ,_lines(1) - ,_columns(1) - ,_usedLines(1) - ,_usedColumns(1) - ,_contentHeight(1) - ,_contentWidth(1) - ,_image(0) - ,_randomSeed(0) - ,_resizing(false) - ,_terminalSizeHint(false) - ,_terminalSizeStartup(true) - ,_bidiEnabled(false) - ,_actSel(0) - ,_wordSelectionMode(false) - ,_lineSelectionMode(false) - ,_preserveLineBreaks(false) - ,_columnSelectionMode(false) - ,_scrollbarLocation(NoScrollBar) - ,_wordCharacters(":@-./_~") - ,_bellMode(SystemBeepBell) - ,_blinking(false) - ,_hasBlinker(false) - ,_cursorBlinking(false) - ,_hasBlinkingCursor(false) - ,_allowBlinkingText(true) - ,_ctrlDrag(true) - ,_tripleClickMode(SelectWholeLine) - ,_isFixedSize(false) - ,_possibleTripleClick(false) - ,_resizeWidget(0) - ,_resizeTimer(0) - ,_flowControlWarningEnabled(false) - ,_outputSuspendedLabel(0) - ,_lineSpacing(0) - ,_colorsInverted(false) - ,_blendColor(qRgba(0,0,0,0xff)) - ,_filterChain(new TerminalImageFilterChain()) - ,_cursorShape(BlockCursor) +TerminalDisplay::TerminalDisplay (QWidget * parent):QWidget (parent), _screenWindow (0), _allowBell (true), _gridLayout (0), +_fontHeight (1), _fontWidth (1), _fontAscent (1), _boldIntense (true), +_lines (1), _columns (1), _usedLines (1), _usedColumns (1), +_contentHeight (1), _contentWidth (1), _image (0), _randomSeed (0), +_resizing (false), _terminalSizeHint (false), _terminalSizeStartup (true), +_bidiEnabled (false), _actSel (0), _wordSelectionMode (false), +_lineSelectionMode (false), _preserveLineBreaks (false), +_columnSelectionMode (false), _scrollbarLocation (NoScrollBar), +_wordCharacters (":@-./_~"), _bellMode (SystemBeepBell), _blinking (false), +_hasBlinker (false), _cursorBlinking (false), _hasBlinkingCursor (false), +_allowBlinkingText (true), _ctrlDrag (true), +_tripleClickMode (SelectWholeLine), _isFixedSize (false), +_possibleTripleClick (false), _resizeWidget (0), _resizeTimer (0), +_flowControlWarningEnabled (false), _outputSuspendedLabel (0), +_lineSpacing (0), _colorsInverted (false), +_blendColor (qRgba (0, 0, 0, 0xff)), +_filterChain (new TerminalImageFilterChain ()), _cursorShape (BlockCursor) { - // terminal applications are not designed with Right-To-Left in mind, - // so the layout is forced to Left-To-Right - setLayoutDirection(Qt::LeftToRight); - - // The offsets are not yet calculated. - // Do not calculate these too often to be more smoothly when resizing - // konsole in opaque mode. - _topMargin = DEFAULT_TOP_MARGIN; - _leftMargin = DEFAULT_LEFT_MARGIN; - - // create scroll bar for scrolling output up and down - // set the scroll bar's slider to occupy the whole area of the scroll bar initially - _scrollBar = new QScrollBar(this); - setScroll(0,0); - _scrollBar->setCursor( Qt::ArrowCursor ); - connect(_scrollBar, SIGNAL(valueChanged(int)), this, - SLOT(scrollBarPositionChanged(int))); - - // setup timers for blinking cursor and text - _blinkTimer = new QTimer(this); - connect(_blinkTimer, SIGNAL(timeout()), this, SLOT(blinkEvent())); - _blinkCursorTimer = new QTimer(this); - connect(_blinkCursorTimer, SIGNAL(timeout()), this, SLOT(blinkCursorEvent())); - - //KCursor::setAutoHideCursor( this, true ); - - setUsesMouse(true); - setColorTable(base_color_table); - setMouseTracking(true); - - // Enable drag and drop - setAcceptDrops(true); // attempt - dragInfo.state = diNone; - - setFocusPolicy( Qt::WheelFocus ); - - // enable input method support - setAttribute(Qt::WA_InputMethodEnabled, true); - - // this is an important optimization, it tells Qt - // that TerminalDisplay will handle repainting its entire area. - setAttribute(Qt::WA_OpaquePaintEvent); - - _gridLayout = new QGridLayout(this); - _gridLayout->setContentsMargins(0, 0, 0, 0); - - setLayout( _gridLayout ); - - new AutoScrollHandler(this); + // terminal applications are not designed with Right-To-Left in mind, + // so the layout is forced to Left-To-Right + setLayoutDirection (Qt::LeftToRight); + + // The offsets are not yet calculated. + // Do not calculate these too often to be more smoothly when resizing + // konsole in opaque mode. + _topMargin = DEFAULT_TOP_MARGIN; + _leftMargin = DEFAULT_LEFT_MARGIN; + + // create scroll bar for scrolling output up and down + // set the scroll bar's slider to occupy the whole area of the scroll bar initially + _scrollBar = new QScrollBar (this); + setScroll (0, 0); + _scrollBar->setCursor (Qt::ArrowCursor); + connect (_scrollBar, SIGNAL (valueChanged (int)), this, + SLOT (scrollBarPositionChanged (int))); + + // setup timers for blinking cursor and text + _blinkTimer = new QTimer (this); + connect (_blinkTimer, SIGNAL (timeout ()), this, SLOT (blinkEvent ())); + _blinkCursorTimer = new QTimer (this); + connect (_blinkCursorTimer, SIGNAL (timeout ()), this, + SLOT (blinkCursorEvent ())); + + //KCursor::setAutoHideCursor( this, true ); + + setUsesMouse (true); + setColorTable (base_color_table); + setMouseTracking (true); + + // Enable drag and drop + setAcceptDrops (true); // attempt + dragInfo.state = diNone; + + setFocusPolicy (Qt::WheelFocus); + + // enable input method support + setAttribute (Qt::WA_InputMethodEnabled, true); + + // this is an important optimization, it tells Qt + // that TerminalDisplay will handle repainting its entire area. + setAttribute (Qt::WA_OpaquePaintEvent); + + _gridLayout = new QGridLayout (this); + _gridLayout->setContentsMargins (0, 0, 0, 0); + + setLayout (_gridLayout); + + new + AutoScrollHandler (this); } -TerminalDisplay::~TerminalDisplay() +TerminalDisplay::~TerminalDisplay () { - disconnect(_blinkTimer); - disconnect(_blinkCursorTimer); - qApp->removeEventFilter( this ); - - delete[] _image; - - delete _gridLayout; - delete _outputSuspendedLabel; - delete _filterChain; + disconnect (_blinkTimer); + disconnect (_blinkCursorTimer); + qApp->removeEventFilter (this); + + delete[]_image; + + delete _gridLayout; + delete _outputSuspendedLabel; + delete _filterChain; } /* ------------------------------------------------------------------------- */ @@ -402,352 +403,382 @@ enum LineEncode { - TopL = (1<<1), - TopC = (1<<2), - TopR = (1<<3), - - LeftT = (1<<5), - Int11 = (1<<6), - Int12 = (1<<7), - Int13 = (1<<8), - RightT = (1<<9), - - LeftC = (1<<10), - Int21 = (1<<11), - Int22 = (1<<12), - Int23 = (1<<13), - RightC = (1<<14), - - LeftB = (1<<15), - Int31 = (1<<16), - Int32 = (1<<17), - Int33 = (1<<18), - RightB = (1<<19), - - BotL = (1<<21), - BotC = (1<<22), - BotR = (1<<23) + TopL = (1 << 1), + TopC = (1 << 2), + TopR = (1 << 3), + + LeftT = (1 << 5), + Int11 = (1 << 6), + Int12 = (1 << 7), + Int13 = (1 << 8), + RightT = (1 << 9), + + LeftC = (1 << 10), + Int21 = (1 << 11), + Int22 = (1 << 12), + Int23 = (1 << 13), + RightC = (1 << 14), + + LeftB = (1 << 15), + Int31 = (1 << 16), + Int32 = (1 << 17), + Int33 = (1 << 18), + RightB = (1 << 19), + + BotL = (1 << 21), + BotC = (1 << 22), + BotR = (1 << 23) }; #include "LineFont.h" -static void drawLineChar(QPainter& paint, int x, int y, int w, int h, uchar code) +static void +drawLineChar (QPainter & paint, int x, int y, int w, int h, uchar code) { - //Calculate cell midpoints, end points. - int cx = x + w/2; - int cy = y + h/2; - int ex = x + w - 1; - int ey = y + h - 1; - - quint32 toDraw = LineChars[code]; - - //Top _lines: - if (toDraw & TopL) - paint.drawLine(cx-1, y, cx-1, cy-2); - if (toDraw & TopC) - paint.drawLine(cx, y, cx, cy-2); - if (toDraw & TopR) - paint.drawLine(cx+1, y, cx+1, cy-2); - - //Bot _lines: - if (toDraw & BotL) - paint.drawLine(cx-1, cy+2, cx-1, ey); - if (toDraw & BotC) - paint.drawLine(cx, cy+2, cx, ey); - if (toDraw & BotR) - paint.drawLine(cx+1, cy+2, cx+1, ey); - - //Left _lines: - if (toDraw & LeftT) - paint.drawLine(x, cy-1, cx-2, cy-1); - if (toDraw & LeftC) - paint.drawLine(x, cy, cx-2, cy); - if (toDraw & LeftB) - paint.drawLine(x, cy+1, cx-2, cy+1); - - //Right _lines: - if (toDraw & RightT) - paint.drawLine(cx+2, cy-1, ex, cy-1); - if (toDraw & RightC) - paint.drawLine(cx+2, cy, ex, cy); - if (toDraw & RightB) - paint.drawLine(cx+2, cy+1, ex, cy+1); - - //Intersection points. - if (toDraw & Int11) - paint.drawPoint(cx-1, cy-1); - if (toDraw & Int12) - paint.drawPoint(cx, cy-1); - if (toDraw & Int13) - paint.drawPoint(cx+1, cy-1); - - if (toDraw & Int21) - paint.drawPoint(cx-1, cy); - if (toDraw & Int22) - paint.drawPoint(cx, cy); - if (toDraw & Int23) - paint.drawPoint(cx+1, cy); - - if (toDraw & Int31) - paint.drawPoint(cx-1, cy+1); - if (toDraw & Int32) - paint.drawPoint(cx, cy+1); - if (toDraw & Int33) - paint.drawPoint(cx+1, cy+1); + //Calculate cell midpoints, end points. + int cx = x + w / 2; + int cy = y + h / 2; + int ex = x + w - 1; + int ey = y + h - 1; + + quint32 toDraw = LineChars[code]; + + //Top _lines: + if (toDraw & TopL) + paint.drawLine (cx - 1, y, cx - 1, cy - 2); + if (toDraw & TopC) + paint.drawLine (cx, y, cx, cy - 2); + if (toDraw & TopR) + paint.drawLine (cx + 1, y, cx + 1, cy - 2); + + //Bot _lines: + if (toDraw & BotL) + paint.drawLine (cx - 1, cy + 2, cx - 1, ey); + if (toDraw & BotC) + paint.drawLine (cx, cy + 2, cx, ey); + if (toDraw & BotR) + paint.drawLine (cx + 1, cy + 2, cx + 1, ey); + + //Left _lines: + if (toDraw & LeftT) + paint.drawLine (x, cy - 1, cx - 2, cy - 1); + if (toDraw & LeftC) + paint.drawLine (x, cy, cx - 2, cy); + if (toDraw & LeftB) + paint.drawLine (x, cy + 1, cx - 2, cy + 1); + + //Right _lines: + if (toDraw & RightT) + paint.drawLine (cx + 2, cy - 1, ex, cy - 1); + if (toDraw & RightC) + paint.drawLine (cx + 2, cy, ex, cy); + if (toDraw & RightB) + paint.drawLine (cx + 2, cy + 1, ex, cy + 1); + + //Intersection points. + if (toDraw & Int11) + paint.drawPoint (cx - 1, cy - 1); + if (toDraw & Int12) + paint.drawPoint (cx, cy - 1); + if (toDraw & Int13) + paint.drawPoint (cx + 1, cy - 1); + + if (toDraw & Int21) + paint.drawPoint (cx - 1, cy); + if (toDraw & Int22) + paint.drawPoint (cx, cy); + if (toDraw & Int23) + paint.drawPoint (cx + 1, cy); + + if (toDraw & Int31) + paint.drawPoint (cx - 1, cy + 1); + if (toDraw & Int32) + paint.drawPoint (cx, cy + 1); + if (toDraw & Int33) + paint.drawPoint (cx + 1, cy + 1); } -void TerminalDisplay::drawLineCharString( QPainter& painter, int x, int y, const QString& str, - const Character* attributes) +void +TerminalDisplay::drawLineCharString (QPainter & painter, int x, int y, + const QString & str, + const Character * attributes) { - const QPen& currentPen = painter.pen(); - - if ( (attributes->rendition & RE_BOLD) && _boldIntense ) - { - QPen boldPen(currentPen); - boldPen.setWidth(3); - painter.setPen( boldPen ); - } - - for (int i=0 ; i < str.length(); i++) + const QPen & currentPen = painter.pen (); + + if ((attributes->rendition & RE_BOLD) && _boldIntense) { - uchar code = str[i].cell(); - if (LineChars[code]) - drawLineChar(painter, x + (_fontWidth*i), y, _fontWidth, _fontHeight, code); + QPen boldPen (currentPen); + boldPen.setWidth (3); + painter.setPen (boldPen); } - painter.setPen( currentPen ); + for (int i = 0; i < str.length (); i++) + { + uchar code = str[i].cell (); + if (LineChars[code]) + drawLineChar (painter, x + (_fontWidth * i), y, _fontWidth, + _fontHeight, code); + } + + painter.setPen (currentPen); } -void TerminalDisplay::setKeyboardCursorShape(KeyboardCursorShape shape) -{ - _cursorShape = shape; -} -TerminalDisplay::KeyboardCursorShape TerminalDisplay::keyboardCursorShape() const -{ - return _cursorShape; -} -void TerminalDisplay::setKeyboardCursorColor(bool useForegroundColor, const QColor& color) +void +TerminalDisplay::setKeyboardCursorShape (KeyboardCursorShape shape) { - if (useForegroundColor) - _cursorColor = QColor(); // an invalid color means that - // the foreground color of the - // current character should - // be used - - else - _cursorColor = color; + _cursorShape = shape; } -QColor TerminalDisplay::keyboardCursorColor() const + +TerminalDisplay::KeyboardCursorShape TerminalDisplay::keyboardCursorShape () const { - return _cursorColor; + return _cursorShape; } -void TerminalDisplay::setOpacity(qreal opacity) +void +TerminalDisplay::setKeyboardCursorColor (bool useForegroundColor, + const QColor & color) { - QColor color(_blendColor); - color.setAlphaF(opacity); - - // enable automatic background filling to prevent the display - // flickering if there is no transparency - /*if ( color.alpha() == 255 ) - { - setAutoFillBackground(true); - } - else - { - setAutoFillBackground(false); - }*/ - - _blendColor = color.rgba(); + if (useForegroundColor) + _cursorColor = QColor (); // an invalid color means that + // the foreground color of the + // current character should + // be used + + else + _cursorColor = color; } -void TerminalDisplay::drawBackground(QPainter& painter, const QRect& rect, const QColor& backgroundColor, bool useOpacitySetting ) +QColor +TerminalDisplay::keyboardCursorColor () const +{ + return _cursorColor; +} + +void +TerminalDisplay::setOpacity (qreal opacity) { - // the area of the widget showing the contents of the terminal display is drawn - // using the background color from the color scheme set with setColorTable() - // - // the area of the widget behind the scroll-bar is drawn using the background - // brush from the scroll-bar's palette, to give the effect of the scroll-bar - // being outside of the terminal display and visual consistency with other KDE - // applications. - // - QRect scrollBarArea = _scrollBar->isVisible() ? - rect.intersected(_scrollBar->geometry()) : - QRect(); - QRegion contentsRegion = QRegion(rect).subtracted(scrollBarArea); - QRect contentsRect = contentsRegion.boundingRect(); - - if ( HAVE_TRANSPARENCY && qAlpha(_blendColor) < 0xff && useOpacitySetting ) - { - QColor color(backgroundColor); - color.setAlpha(qAlpha(_blendColor)); - - painter.save(); - painter.setCompositionMode(QPainter::CompositionMode_Source); - painter.fillRect(contentsRect, color); - painter.restore(); - } - else - painter.fillRect(contentsRect, backgroundColor); - - painter.fillRect(scrollBarArea,_scrollBar->palette().background()); + QColor color (_blendColor); + color.setAlphaF (opacity); + + // enable automatic background filling to prevent the display + // flickering if there is no transparency + /*if ( color.alpha() == 255 ) + { + setAutoFillBackground(true); + } + else + { + setAutoFillBackground(false); + } */ + + _blendColor = color.rgba (); } -void TerminalDisplay::drawCursor(QPainter& painter, - const QRect& rect, - const QColor& foregroundColor, - const QColor& /*backgroundColor*/, - bool& invertCharacterColor) +void +TerminalDisplay::drawBackground (QPainter & painter, const QRect & rect, + const QColor & backgroundColor, + bool useOpacitySetting) { - QRect cursorRect = rect; - cursorRect.setHeight(_fontHeight - _lineSpacing - 1); - - if (!_cursorBlinking) + // the area of the widget showing the contents of the terminal display is drawn + // using the background color from the color scheme set with setColorTable() + // + // the area of the widget behind the scroll-bar is drawn using the background + // brush from the scroll-bar's palette, to give the effect of the scroll-bar + // being outside of the terminal display and visual consistency with other KDE + // applications. + // + QRect scrollBarArea = _scrollBar->isVisible ()? + rect.intersected (_scrollBar->geometry ()) : QRect (); + QRegion contentsRegion = QRegion (rect).subtracted (scrollBarArea); + QRect contentsRect = contentsRegion.boundingRect (); + + if (HAVE_TRANSPARENCY && qAlpha (_blendColor) < 0xff && useOpacitySetting) { - if ( _cursorColor.isValid() ) - painter.setPen(_cursorColor); - else - painter.setPen(foregroundColor); - - if ( _cursorShape == BlockCursor ) - { - // draw the cursor outline, adjusting the area so that - // it is draw entirely inside 'rect' - int penWidth = qMax(1,painter.pen().width()); - - painter.drawRect(cursorRect.adjusted(penWidth/2, - penWidth/2, - - penWidth/2 - penWidth%2, - - penWidth/2 - penWidth%2)); - if ( hasFocus() ) - { - painter.fillRect(cursorRect, _cursorColor.isValid() ? _cursorColor : foregroundColor); - - if ( !_cursorColor.isValid() ) - { - // invert the colour used to draw the text to ensure that the character at - // the cursor position is readable - invertCharacterColor = true; - } - } - } - else if ( _cursorShape == UnderlineCursor ) - painter.drawLine(cursorRect.left(), - cursorRect.bottom(), - cursorRect.right(), - cursorRect.bottom()); - else if ( _cursorShape == IBeamCursor ) - painter.drawLine(cursorRect.left(), - cursorRect.top(), - cursorRect.left(), - cursorRect.bottom()); + QColor color (backgroundColor); + color.setAlpha (qAlpha (_blendColor)); + + painter.save (); + painter.setCompositionMode (QPainter::CompositionMode_Source); + painter.fillRect (contentsRect, color); + painter.restore (); + } + else + painter.fillRect (contentsRect, backgroundColor); + + painter.fillRect (scrollBarArea, _scrollBar->palette ().background ()); +} + +void +TerminalDisplay::drawCursor (QPainter & painter, + const QRect & rect, + const QColor & foregroundColor, + const QColor & /*backgroundColor */ , + bool & invertCharacterColor) +{ + QRect cursorRect = rect; + cursorRect.setHeight (_fontHeight - _lineSpacing - 1); + + if (!_cursorBlinking) + { + if (_cursorColor.isValid ()) + painter.setPen (_cursorColor); + else + painter.setPen (foregroundColor); + + if (_cursorShape == BlockCursor) + { + // draw the cursor outline, adjusting the area so that + // it is draw entirely inside 'rect' + int penWidth = qMax (1, painter.pen ().width ()); + + painter.drawRect (cursorRect.adjusted (penWidth / 2, + penWidth / 2, + -penWidth / 2 - penWidth % 2, + -penWidth / 2 - + penWidth % 2)); + if (hasFocus ()) + { + painter.fillRect (cursorRect, + _cursorColor. + isValid ()? _cursorColor : foregroundColor); + + if (!_cursorColor.isValid ()) + { + // invert the colour used to draw the text to ensure that the character at + // the cursor position is readable + invertCharacterColor = true; + } + } + } + else if (_cursorShape == UnderlineCursor) + painter.drawLine (cursorRect.left (), + cursorRect.bottom (), + cursorRect.right (), cursorRect.bottom ()); + else if (_cursorShape == IBeamCursor) + painter.drawLine (cursorRect.left (), + cursorRect.top (), + cursorRect.left (), cursorRect.bottom ()); } } -void TerminalDisplay::drawCharacters(QPainter& painter, - const QRect& rect, - const QString& text, - const Character* style, - bool invertCharacterColor) +void +TerminalDisplay::drawCharacters (QPainter & painter, + const QRect & rect, + const QString & text, + const Character * style, + bool invertCharacterColor) { - // don't draw text which is currently blinking - if ( _blinking && (style->rendition & RE_BLINK) ) - return; - - // setup bold and underline - bool useBold; - ColorEntry::FontWeight weight = style->fontWeight(_colorTable); - if (weight == ColorEntry::UseCurrentFormat) - useBold = ((style->rendition & RE_BOLD) && _boldIntense) || font().bold(); - else - useBold = (weight == ColorEntry::Bold) ? true : false; - bool useUnderline = style->rendition & RE_UNDERLINE || font().underline(); - - QFont font = painter.font(); - if ( font.bold() != useBold - || font.underline() != useUnderline ) + // don't draw text which is currently blinking + if (_blinking && (style->rendition & RE_BLINK)) + return; + + // setup bold and underline + bool useBold; + ColorEntry::FontWeight weight = style->fontWeight (_colorTable); + if (weight == ColorEntry::UseCurrentFormat) + useBold = ((style->rendition & RE_BOLD) && _boldIntense) + || font ().bold (); + else + useBold = (weight == ColorEntry::Bold) ? true : false; + bool useUnderline = style->rendition & RE_UNDERLINE || font ().underline (); + + QFont font = painter.font (); + if (font.bold () != useBold || font.underline () != useUnderline) { - font.setBold(useBold); - font.setUnderline(useUnderline); - painter.setFont(font); + font.setBold (useBold); + font.setUnderline (useUnderline); + painter.setFont (font); } - // setup pen - const CharacterColor& textColor = ( invertCharacterColor ? style->backgroundColor : style->foregroundColor ); - const QColor color = textColor.color(_colorTable); - QPen pen = painter.pen(); - if ( pen.color() != color ) + // setup pen + const CharacterColor & textColor = + (invertCharacterColor ? style->backgroundColor : style->foregroundColor); + const QColor color = textColor.color (_colorTable); + QPen pen = painter.pen (); + if (pen.color () != color) { - pen.setColor(color); - painter.setPen(color); + pen.setColor (color); + painter.setPen (color); } - // draw text - if ( isLineCharString(text) ) - drawLineCharString(painter,rect.x(),rect.y(),text,style); - else + // draw text + if (isLineCharString (text)) + drawLineCharString (painter, rect.x (), rect.y (), text, style); + else { - // the drawText(rect,flags,string) overload is used here with null flags - // instead of drawText(rect,string) because the (rect,string) overload causes - // the application's default layout direction to be used instead of - // the widget-specific layout direction, which should always be - // Qt::LeftToRight for this widget - // This was discussed in: http://lists.kde.org/?t=120552223600002&r=1&w=2 - if (_bidiEnabled) - painter.drawText(rect,0,text); - else - painter.drawText(rect,0,LTR_OVERRIDE_CHAR+text); + // the drawText(rect,flags,string) overload is used here with null flags + // instead of drawText(rect,string) because the (rect,string) overload causes + // the application's default layout direction to be used instead of + // the widget-specific layout direction, which should always be + // Qt::LeftToRight for this widget + // This was discussed in: http://lists.kde.org/?t=120552223600002&r=1&w=2 + if (_bidiEnabled) + painter.drawText (rect, 0, text); + else + painter.drawText (rect, 0, LTR_OVERRIDE_CHAR + text); } } -void TerminalDisplay::drawTextFragment(QPainter& painter , - const QRect& rect, - const QString& text, - const Character* style) +void +TerminalDisplay::drawTextFragment (QPainter & painter, + const QRect & rect, + const QString & text, + const Character * style) { - painter.save(); - - // setup painter - const QColor foregroundColor = style->foregroundColor.color(_colorTable); - const QColor backgroundColor = style->backgroundColor.color(_colorTable); - - // draw background if different from the display's background color - if ( backgroundColor != palette().background().color() ) - drawBackground(painter,rect,backgroundColor, - false /* do not use transparency */); - - // draw cursor shape if the current character is the cursor - // this may alter the foreground and background colors - bool invertCharacterColor = false; - if ( style->rendition & RE_CURSOR ) - drawCursor(painter,rect,foregroundColor,backgroundColor,invertCharacterColor); - - // draw text - drawCharacters(painter,rect,text,style,invertCharacterColor); - - painter.restore(); + painter.save (); + + // setup painter + const QColor foregroundColor = style->foregroundColor.color (_colorTable); + const QColor backgroundColor = style->backgroundColor.color (_colorTable); + + // draw background if different from the display's background color + if (backgroundColor != palette ().background ().color ()) + drawBackground (painter, rect, backgroundColor, + false /* do not use transparency */ ); + + // draw cursor shape if the current character is the cursor + // this may alter the foreground and background colors + bool invertCharacterColor = false; + if (style->rendition & RE_CURSOR) + drawCursor (painter, rect, foregroundColor, backgroundColor, + invertCharacterColor); + + // draw text + drawCharacters (painter, rect, text, style, invertCharacterColor); + + painter.restore (); } -void TerminalDisplay::setRandomSeed(uint randomSeed) { _randomSeed = randomSeed; } -uint TerminalDisplay::randomSeed() const { return _randomSeed; } +void +TerminalDisplay::setRandomSeed (uint randomSeed) +{ + _randomSeed = randomSeed; +} + +uint +TerminalDisplay::randomSeed () const +{ + return _randomSeed; +} #if 0 /*! Set XIM Position */ -void TerminalDisplay::setCursorPos(const int curx, const int cury) +void +TerminalDisplay::setCursorPos (const int curx, const int cury) { - QPoint tL = contentsRect().topLeft(); - int tLx = tL.x(); - int tLy = tL.y(); - - int xpos, ypos; - ypos = _topMargin + tLy + _fontHeight*(cury-1) + _fontAscent; - xpos = _leftMargin + tLx + _fontWidth*curx; - _cursorLine = cury; - _cursorCol = curx; + QPoint tL = contentsRect ().topLeft (); + int tLx = tL.x (); + int tLy = tL.y (); + + int xpos, ypos; + ypos = _topMargin + tLy + _fontHeight * (cury - 1) + _fontAscent; + xpos = _leftMargin + tLx + _fontWidth * curx; + _cursorLine = cury; + _cursorCol = curx; } #endif @@ -759,775 +790,846 @@ // display is much cheaper than re-rendering all the text for the // part of the image which has moved up or down. // Instead only new lines have to be drawn -void TerminalDisplay::scrollImage(int lines , const QRect& screenWindowRegion) +void +TerminalDisplay::scrollImage (int lines, const QRect & screenWindowRegion) { - // if the flow control warning is enabled this will interfere with the - // scrolling optimizations and cause artifacts. the simple solution here - // is to just disable the optimization whilst it is visible - if ( _outputSuspendedLabel && _outputSuspendedLabel->isVisible() ) - return; - - // constrain the region to the display - // the bottom of the region is capped to the number of lines in the display's - // internal image - 2, so that the height of 'region' is strictly less - // than the height of the internal image. - QRect region = screenWindowRegion; - region.setBottom( qMin(region.bottom(),this->_lines-2) ); - - // return if there is nothing to do - if ( lines == 0 - || _image == 0 - || !region.isValid() - || (region.top() + abs(lines)) >= region.bottom() - || this->_lines <= region.height() ) return; - - // hide terminal size label to prevent it being scrolled - if (_resizeWidget && _resizeWidget->isVisible()) - _resizeWidget->hide(); - - // Note: With Qt 4.4 the left edge of the scrolled area must be at 0 - // to get the correct (newly exposed) part of the widget repainted. - // - // The right edge must be before the left edge of the scroll bar to - // avoid triggering a repaint of the entire widget, the distance is - // given by SCROLLBAR_CONTENT_GAP - // - // Set the QT_FLUSH_PAINT environment variable to '1' before starting the - // application to monitor repainting. - // - int scrollBarWidth = _scrollBar->isHidden() ? 0 : _scrollBar->width(); - const int SCROLLBAR_CONTENT_GAP = 1; - QRect scrollRect; - if ( _scrollbarLocation == ScrollBarLeft ) + // if the flow control warning is enabled this will interfere with the + // scrolling optimizations and cause artifacts. the simple solution here + // is to just disable the optimization whilst it is visible + if (_outputSuspendedLabel && _outputSuspendedLabel->isVisible ()) + return; + + // constrain the region to the display + // the bottom of the region is capped to the number of lines in the display's + // internal image - 2, so that the height of 'region' is strictly less + // than the height of the internal image. + QRect region = screenWindowRegion; + region.setBottom (qMin (region.bottom (), this->_lines - 2)); + + // return if there is nothing to do + if (lines == 0 + || _image == 0 + || !region.isValid () + || (region.top () + abs (lines)) >= region.bottom () + || this->_lines <= region.height ()) + return; + + // hide terminal size label to prevent it being scrolled + if (_resizeWidget && _resizeWidget->isVisible ()) + _resizeWidget->hide (); + + // Note: With Qt 4.4 the left edge of the scrolled area must be at 0 + // to get the correct (newly exposed) part of the widget repainted. + // + // The right edge must be before the left edge of the scroll bar to + // avoid triggering a repaint of the entire widget, the distance is + // given by SCROLLBAR_CONTENT_GAP + // + // Set the QT_FLUSH_PAINT environment variable to '1' before starting the + // application to monitor repainting. + // + int scrollBarWidth = _scrollBar->isHidden ()? 0 : _scrollBar->width (); + const int SCROLLBAR_CONTENT_GAP = 1; + QRect scrollRect; + if (_scrollbarLocation == ScrollBarLeft) { - scrollRect.setLeft(scrollBarWidth+SCROLLBAR_CONTENT_GAP); - scrollRect.setRight(width()); + scrollRect.setLeft (scrollBarWidth + SCROLLBAR_CONTENT_GAP); + scrollRect.setRight (width ()); } - else + else { - scrollRect.setLeft(0); - scrollRect.setRight(width() - scrollBarWidth - SCROLLBAR_CONTENT_GAP); + scrollRect.setLeft (0); + scrollRect.setRight (width () - scrollBarWidth - SCROLLBAR_CONTENT_GAP); } - void* firstCharPos = &_image[ region.top() * this->_columns ]; - void* lastCharPos = &_image[ (region.top() + abs(lines)) * this->_columns ]; - - int top = _topMargin + (region.top() * _fontHeight); - int linesToMove = region.height() - abs(lines); - int bytesToMove = linesToMove * - this->_columns * - sizeof(Character); - - Q_ASSERT( linesToMove > 0 ); - Q_ASSERT( bytesToMove > 0 ); - - //scroll internal image - if ( lines > 0 ) + void *firstCharPos = &_image[region.top () * this->_columns]; + void *lastCharPos = &_image[(region.top () + abs (lines)) * this->_columns]; + + int top = _topMargin + (region.top () * _fontHeight); + int linesToMove = region.height () - abs (lines); + int bytesToMove = linesToMove * this->_columns * sizeof (Character); + + Q_ASSERT (linesToMove > 0); + Q_ASSERT (bytesToMove > 0); + + //scroll internal image + if (lines > 0) { - // check that the memory areas that we are going to move are valid - Q_ASSERT( (char*)lastCharPos + bytesToMove < - (char*)(_image + (this->_lines * this->_columns)) ); - - Q_ASSERT( (lines*this->_columns) < _imageSize ); - - //scroll internal image down - memmove( firstCharPos , lastCharPos , bytesToMove ); - - //set region of display to scroll - scrollRect.setTop(top); + // check that the memory areas that we are going to move are valid + Q_ASSERT ((char *) lastCharPos + bytesToMove < + (char *) (_image + (this->_lines * this->_columns))); + + Q_ASSERT ((lines * this->_columns) < _imageSize); + + //scroll internal image down + memmove (firstCharPos, lastCharPos, bytesToMove); + + //set region of display to scroll + scrollRect.setTop (top); } - else + else { - // check that the memory areas that we are going to move are valid - Q_ASSERT( (char*)firstCharPos + bytesToMove < - (char*)(_image + (this->_lines * this->_columns)) ); - - //scroll internal image up - memmove( lastCharPos , firstCharPos , bytesToMove ); - - //set region of the display to scroll - scrollRect.setTop(top + abs(lines) * _fontHeight); + // check that the memory areas that we are going to move are valid + Q_ASSERT ((char *) firstCharPos + bytesToMove < + (char *) (_image + (this->_lines * this->_columns))); + + //scroll internal image up + memmove (lastCharPos, firstCharPos, bytesToMove); + + //set region of the display to scroll + scrollRect.setTop (top + abs (lines) * _fontHeight); } - scrollRect.setHeight(linesToMove * _fontHeight ); - - Q_ASSERT(scrollRect.isValid() && !scrollRect.isEmpty()); - - //scroll the display vertically to match internal _image - scroll( 0 , _fontHeight * (-lines) , scrollRect ); + scrollRect.setHeight (linesToMove * _fontHeight); + + Q_ASSERT (scrollRect.isValid () && !scrollRect.isEmpty ()); + + //scroll the display vertically to match internal _image + scroll (0, _fontHeight * (-lines), scrollRect); } -QRegion TerminalDisplay::hotSpotRegion() const +QRegion +TerminalDisplay::hotSpotRegion () const { - QRegion region; - foreach( Filter::HotSpot* hotSpot , _filterChain->hotSpots() ) - { - QRect r; - if (hotSpot->startLine()==hotSpot->endLine()) { - r.setLeft(hotSpot->startColumn()); - r.setTop(hotSpot->startLine()); - r.setRight(hotSpot->endColumn()); - r.setBottom(hotSpot->endLine()); - region |= imageToWidget(r);; - } else { - r.setLeft(hotSpot->startColumn()); - r.setTop(hotSpot->startLine()); - r.setRight(_columns); - r.setBottom(hotSpot->startLine()); - region |= imageToWidget(r);; - for ( int line = hotSpot->startLine()+1 ; line < hotSpot->endLine() ; line++ ) { - r.setLeft(0); - r.setTop(line); - r.setRight(_columns); - r.setBottom(line); - region |= imageToWidget(r);; - } - r.setLeft(0); - r.setTop(hotSpot->endLine()); - r.setRight(hotSpot->endColumn()); - r.setBottom(hotSpot->endLine()); - region |= imageToWidget(r);; - } - } - return region; + QRegion region; + foreach (Filter::HotSpot * hotSpot, _filterChain->hotSpots ()) + { + QRect r; + if (hotSpot->startLine () == hotSpot->endLine ()) + { + r.setLeft (hotSpot->startColumn ()); + r.setTop (hotSpot->startLine ()); + r.setRight (hotSpot->endColumn ()); + r.setBottom (hotSpot->endLine ()); + region |= imageToWidget (r);; + } + else + { + r.setLeft (hotSpot->startColumn ()); + r.setTop (hotSpot->startLine ()); + r.setRight (_columns); + r.setBottom (hotSpot->startLine ()); + region |= imageToWidget (r);; + for (int line = hotSpot->startLine () + 1; line < hotSpot->endLine (); + line++) + { + r.setLeft (0); + r.setTop (line); + r.setRight (_columns); + r.setBottom (line); + region |= imageToWidget (r);; + } + r.setLeft (0); + r.setTop (hotSpot->endLine ()); + r.setRight (hotSpot->endColumn ()); + r.setBottom (hotSpot->endLine ()); + region |= imageToWidget (r);; + } + } + return region; } -void TerminalDisplay::processFilters() +void +TerminalDisplay::processFilters () { - if (!_screenWindow) - return; - - QRegion preUpdateHotSpots = hotSpotRegion(); - - // use _screenWindow->getImage() here rather than _image because - // other classes may call processFilters() when this display's - // ScreenWindow emits a scrolled() signal - which will happen before - // updateImage() is called on the display and therefore _image is - // out of date at this point - _filterChain->setImage( _screenWindow->getImage(), - _screenWindow->windowLines(), - _screenWindow->windowColumns(), - _screenWindow->getLineProperties() ); - _filterChain->process(); - - QRegion postUpdateHotSpots = hotSpotRegion(); - - update( preUpdateHotSpots | postUpdateHotSpots ); + if (!_screenWindow) + return; + + QRegion preUpdateHotSpots = hotSpotRegion (); + + // use _screenWindow->getImage() here rather than _image because + // other classes may call processFilters() when this display's + // ScreenWindow emits a scrolled() signal - which will happen before + // updateImage() is called on the display and therefore _image is + // out of date at this point + _filterChain->setImage (_screenWindow->getImage (), + _screenWindow->windowLines (), + _screenWindow->windowColumns (), + _screenWindow->getLineProperties ()); + _filterChain->process (); + + QRegion postUpdateHotSpots = hotSpotRegion (); + + update (preUpdateHotSpots | postUpdateHotSpots); } -void TerminalDisplay::updateImage() +void +TerminalDisplay::updateImage () { - if ( !_screenWindow ) - return; - - // optimization - scroll the existing image where possible and - // avoid expensive text drawing for parts of the image that - // can simply be moved up or down - scrollImage( _screenWindow->scrollCount() , - _screenWindow->scrollRegion() ); - _screenWindow->resetScrollCount(); - - if (!_image) { - // Create _image. - // The emitted changedContentSizeSignal also leads to getImage being recreated, so do this first. - updateImageSize(); + if (!_screenWindow) + return; + + // optimization - scroll the existing image where possible and + // avoid expensive text drawing for parts of the image that + // can simply be moved up or down + scrollImage (_screenWindow->scrollCount (), _screenWindow->scrollRegion ()); + _screenWindow->resetScrollCount (); + + if (!_image) + { + // Create _image. + // The emitted changedContentSizeSignal also leads to getImage being recreated, so do this first. + updateImageSize (); } - Character* const newimg = _screenWindow->getImage(); - int lines = _screenWindow->windowLines(); - int columns = _screenWindow->windowColumns(); - - setScroll( _screenWindow->currentLine() , _screenWindow->lineCount() ); - - Q_ASSERT( this->_usedLines <= this->_lines ); - Q_ASSERT( this->_usedColumns <= this->_columns ); - - int y,x,len; - - QPoint tL = contentsRect().topLeft(); - int tLx = tL.x(); - int tLy = tL.y(); - _hasBlinker = false; - - CharacterColor cf; // undefined - CharacterColor _clipboard; // undefined - int cr = -1; // undefined - - const int linesToUpdate = qMin(this->_lines, qMax(0,lines )); - const int columnsToUpdate = qMin(this->_columns,qMax(0,columns)); - - QChar *disstrU = new QChar[columnsToUpdate]; - char *dirtyMask = new char[columnsToUpdate+2]; - QRegion dirtyRegion; - - // debugging variable, this records the number of lines that are found to - // be 'dirty' ( ie. have changed from the old _image to the new _image ) and - // which therefore need to be repainted - int dirtyLineCount = 0; - - for (y = 0; y < linesToUpdate; ++y) + Character *const newimg = _screenWindow->getImage (); + int lines = _screenWindow->windowLines (); + int columns = _screenWindow->windowColumns (); + + setScroll (_screenWindow->currentLine (), _screenWindow->lineCount ()); + + Q_ASSERT (this->_usedLines <= this->_lines); + Q_ASSERT (this->_usedColumns <= this->_columns); + + int y, x, len; + + QPoint tL = contentsRect ().topLeft (); + int tLx = tL.x (); + int tLy = tL.y (); + _hasBlinker = false; + + CharacterColor cf; // undefined + CharacterColor _clipboard; // undefined + int cr = -1; // undefined + + const int linesToUpdate = qMin (this->_lines, qMax (0, lines)); + const int columnsToUpdate = qMin (this->_columns, qMax (0, columns)); + + QChar *disstrU = new QChar[columnsToUpdate]; + char *dirtyMask = new char[columnsToUpdate + 2]; + QRegion dirtyRegion; + + // debugging variable, this records the number of lines that are found to + // be 'dirty' ( ie. have changed from the old _image to the new _image ) and + // which therefore need to be repainted + int dirtyLineCount = 0; + + for (y = 0; y < linesToUpdate; ++y) { - const Character* currentLine = &_image[y*this->_columns]; - const Character* const newLine = &newimg[y*columns]; - - bool updateLine = false; - - // The dirty mask indicates which characters need repainting. We also - // mark surrounding neighbours dirty, in case the character exceeds - // its cell boundaries - memset(dirtyMask, 0, columnsToUpdate+2); - - for( x = 0 ; x < columnsToUpdate ; ++x) - { - if ( newLine[x] != currentLine[x] ) - { - dirtyMask[x] = true; - } - } - - if (!_resizing) // not while _resizing, we're expecting a paintEvent - for (x = 0; x < columnsToUpdate; ++x) - { - _hasBlinker |= (newLine[x].rendition & RE_BLINK); - - // Start drawing if this character or the next one differs. - // We also take the next one into account to handle the situation - // where characters exceed their cell width. - if (dirtyMask[x]) - { - quint16 c = newLine[x+0].character; - if ( !c ) - continue; - int p = 0; - disstrU[p++] = c; //fontMap(c); - bool lineDraw = isLineChar(c); - bool doubleWidth = (x+1 == columnsToUpdate) ? false : (newLine[x+1].character == 0); - cr = newLine[x].rendition; - _clipboard = newLine[x].backgroundColor; - if (newLine[x].foregroundColor != cf) cf = newLine[x].foregroundColor; - int lln = columnsToUpdate - x; - for (len = 1; len < lln; ++len) - { - const Character& ch = newLine[x+len]; - - if (!ch.character) - continue; // Skip trailing part of multi-col chars. - - bool nextIsDoubleWidth = (x+len+1 == columnsToUpdate) ? false : (newLine[x+len+1].character == 0); - - if ( ch.foregroundColor != cf || - ch.backgroundColor != _clipboard || - ch.rendition != cr || - !dirtyMask[x+len] || - isLineChar(c) != lineDraw || - nextIsDoubleWidth != doubleWidth ) - break; - - disstrU[p++] = c; //fontMap(c); - } - - QString unistr(disstrU, p); - - bool saveFixedFont = _fixedFont; - if (lineDraw) - _fixedFont = false; - if (doubleWidth) - _fixedFont = false; - - updateLine = true; - - _fixedFont = saveFixedFont; - x += len - 1; - } - - } - - //both the top and bottom halves of double height _lines must always be redrawn - //although both top and bottom halves contain the same characters, only - //the top one is actually - //drawn. - if (_lineProperties.count() > y) - updateLine |= (_lineProperties[y] & LINE_DOUBLEHEIGHT); - - // if the characters on the line are different in the old and the new _image - // then this line must be repainted. - if (updateLine) - { - dirtyLineCount++; - - // add the area occupied by this line to the region which needs to be - // repainted - QRect dirtyRect = QRect( _leftMargin+tLx , - _topMargin+tLy+_fontHeight*y , - _fontWidth * columnsToUpdate , - _fontHeight ); - - dirtyRegion |= dirtyRect; - } - - // replace the line of characters in the old _image with the - // current line of the new _image - memcpy((void*)currentLine,(const void*)newLine,columnsToUpdate*sizeof(Character)); + const Character *currentLine = &_image[y * this->_columns]; + const Character *const newLine = &newimg[y * columns]; + + bool updateLine = false; + + // The dirty mask indicates which characters need repainting. We also + // mark surrounding neighbours dirty, in case the character exceeds + // its cell boundaries + memset (dirtyMask, 0, columnsToUpdate + 2); + + for (x = 0; x < columnsToUpdate; ++x) + { + if (newLine[x] != currentLine[x]) + { + dirtyMask[x] = true; + } + } + + if (!_resizing) // not while _resizing, we're expecting a paintEvent + for (x = 0; x < columnsToUpdate; ++x) + { + _hasBlinker |= (newLine[x].rendition & RE_BLINK); + + // Start drawing if this character or the next one differs. + // We also take the next one into account to handle the situation + // where characters exceed their cell width. + if (dirtyMask[x]) + { + quint16 c = newLine[x + 0].character; + if (!c) + continue; + int p = 0; + disstrU[p++] = c; //fontMap(c); + bool lineDraw = isLineChar (c); + bool doubleWidth = + (x + 1 == + columnsToUpdate) ? false : (newLine[x + 1].character == 0); + cr = newLine[x].rendition; + _clipboard = newLine[x].backgroundColor; + if (newLine[x].foregroundColor != cf) + cf = newLine[x].foregroundColor; + int lln = columnsToUpdate - x; + for (len = 1; len < lln; ++len) + { + const Character & ch = newLine[x + len]; + + if (!ch.character) + continue; // Skip trailing part of multi-col chars. + + bool nextIsDoubleWidth = + (x + len + 1 == + columnsToUpdate) ? false : (newLine[x + len + + 1].character == 0); + + if (ch.foregroundColor != cf || + ch.backgroundColor != _clipboard || + ch.rendition != cr || + !dirtyMask[x + len] || + isLineChar (c) != lineDraw || + nextIsDoubleWidth != doubleWidth) + break; + + disstrU[p++] = c; //fontMap(c); + } + + QString unistr (disstrU, p); + + bool saveFixedFont = _fixedFont; + if (lineDraw) + _fixedFont = false; + if (doubleWidth) + _fixedFont = false; + + updateLine = true; + + _fixedFont = saveFixedFont; + x += len - 1; + } + + } + + //both the top and bottom halves of double height _lines must always be redrawn + //although both top and bottom halves contain the same characters, only + //the top one is actually + //drawn. + if (_lineProperties.count () > y) + updateLine |= (_lineProperties[y] & LINE_DOUBLEHEIGHT); + + // if the characters on the line are different in the old and the new _image + // then this line must be repainted. + if (updateLine) + { + dirtyLineCount++; + + // add the area occupied by this line to the region which needs to be + // repainted + QRect dirtyRect = QRect (_leftMargin + tLx, + _topMargin + tLy + _fontHeight * y, + _fontWidth * columnsToUpdate, + _fontHeight); + + dirtyRegion |= dirtyRect; + } + + // replace the line of characters in the old _image with the + // current line of the new _image + memcpy ((void *) currentLine, (const void *) newLine, + columnsToUpdate * sizeof (Character)); } - // if the new _image is smaller than the previous _image, then ensure that the area - // outside the new _image is cleared - if ( linesToUpdate < _usedLines ) + // if the new _image is smaller than the previous _image, then ensure that the area + // outside the new _image is cleared + if (linesToUpdate < _usedLines) { - dirtyRegion |= QRect( _leftMargin+tLx , - _topMargin+tLy+_fontHeight*linesToUpdate , - _fontWidth * this->_columns , - _fontHeight * (_usedLines-linesToUpdate) ); + dirtyRegion |= QRect (_leftMargin + tLx, + _topMargin + tLy + _fontHeight * linesToUpdate, + _fontWidth * this->_columns, + _fontHeight * (_usedLines - linesToUpdate)); } - _usedLines = linesToUpdate; - - if ( columnsToUpdate < _usedColumns ) + _usedLines = linesToUpdate; + + if (columnsToUpdate < _usedColumns) { - dirtyRegion |= QRect( _leftMargin+tLx+columnsToUpdate*_fontWidth , - _topMargin+tLy , - _fontWidth * (_usedColumns-columnsToUpdate) , - _fontHeight * this->_lines ); + dirtyRegion |= QRect (_leftMargin + tLx + columnsToUpdate * _fontWidth, + _topMargin + tLy, + _fontWidth * (_usedColumns - columnsToUpdate), + _fontHeight * this->_lines); } - _usedColumns = columnsToUpdate; - - dirtyRegion |= _inputMethodData.previousPreeditRect; - - // update the parts of the display which have changed - update(dirtyRegion); - - if ( _hasBlinker && !_blinkTimer->isActive()) _blinkTimer->start( TEXT_BLINK_DELAY ); - if (!_hasBlinker && _blinkTimer->isActive()) { _blinkTimer->stop(); _blinking = false; } - delete[] dirtyMask; - delete[] disstrU; + _usedColumns = columnsToUpdate; + + dirtyRegion |= _inputMethodData.previousPreeditRect; + + // update the parts of the display which have changed + update (dirtyRegion); + + if (_hasBlinker && !_blinkTimer->isActive ()) + _blinkTimer->start (TEXT_BLINK_DELAY); + if (!_hasBlinker && _blinkTimer->isActive ()) + { + _blinkTimer->stop (); + _blinking = false; + } + delete[]dirtyMask; + delete[]disstrU; } -void TerminalDisplay::showResizeNotification() +void +TerminalDisplay::showResizeNotification () { - if (_terminalSizeHint && isVisible()) + if (_terminalSizeHint && isVisible ()) { - if (_terminalSizeStartup) { - _terminalSizeStartup=false; - return; - } - if (!_resizeWidget) - { - _resizeWidget = new QLabel(QString("Size: XXX x XXX"), this); - _resizeWidget->setMinimumWidth(_resizeWidget->fontMetrics().width(QString("Size: XXX x XXX"))); - _resizeWidget->setMinimumHeight(_resizeWidget->sizeHint().height()); - _resizeWidget->setAlignment(Qt::AlignCenter); - - _resizeWidget->setStyleSheet("background-color:palette(window);border-style:solid;border-width:1px;border-color:palette(dark)"); - - _resizeTimer = new QTimer(this); - _resizeTimer->setSingleShot(true); - connect(_resizeTimer, SIGNAL(timeout()), _resizeWidget, SLOT(hide())); - } - QString sizeStr = QString("Size: %1 x %2").arg(_columns).arg(_lines); - _resizeWidget->setText(sizeStr); - _resizeWidget->move((width()-_resizeWidget->width())/2, - (height()-_resizeWidget->height())/2+20); - _resizeWidget->show(); - _resizeTimer->start(1000); + if (_terminalSizeStartup) + { + _terminalSizeStartup = false; + return; + } + if (!_resizeWidget) + { + _resizeWidget = new QLabel (QString ("Size: XXX x XXX"), this); + _resizeWidget->setMinimumWidth (_resizeWidget->fontMetrics (). + width (QString + ("Size: XXX x XXX"))); + _resizeWidget->setMinimumHeight (_resizeWidget->sizeHint (). + height ()); + _resizeWidget->setAlignment (Qt::AlignCenter); + + _resizeWidget-> + setStyleSheet + ("background-color:palette(window);border-style:solid;border-width:1px;border-color:palette(dark)"); + + _resizeTimer = new QTimer (this); + _resizeTimer->setSingleShot (true); + connect (_resizeTimer, SIGNAL (timeout ()), _resizeWidget, + SLOT (hide ())); + } + QString sizeStr = QString ("Size: %1 x %2").arg (_columns).arg (_lines); + _resizeWidget->setText (sizeStr); + _resizeWidget->move ((width () - _resizeWidget->width ()) / 2, + (height () - _resizeWidget->height ()) / 2 + 20); + _resizeWidget->show (); + _resizeTimer->start (1000); + } +} + +void +TerminalDisplay::setBlinkingCursor (bool blink) +{ + _hasBlinkingCursor = blink; + + if (blink && !_blinkCursorTimer->isActive ()) + _blinkCursorTimer->start (QApplication::cursorFlashTime () / 2); + + if (!blink && _blinkCursorTimer->isActive ()) + { + _blinkCursorTimer->stop (); + if (_cursorBlinking) + blinkCursorEvent (); + else + _cursorBlinking = false; } } -void TerminalDisplay::setBlinkingCursor(bool blink) +void +TerminalDisplay::setBlinkingTextEnabled (bool blink) { - _hasBlinkingCursor=blink; - - if (blink && !_blinkCursorTimer->isActive()) - _blinkCursorTimer->start(QApplication::cursorFlashTime() / 2); - - if (!blink && _blinkCursorTimer->isActive()) + _allowBlinkingText = blink; + + if (blink && !_blinkTimer->isActive ()) + _blinkTimer->start (TEXT_BLINK_DELAY); + + if (!blink && _blinkTimer->isActive ()) { - _blinkCursorTimer->stop(); - if (_cursorBlinking) - blinkCursorEvent(); - else - _cursorBlinking = false; - } -} - -void TerminalDisplay::setBlinkingTextEnabled(bool blink) -{ - _allowBlinkingText = blink; - - if (blink && !_blinkTimer->isActive()) - _blinkTimer->start(TEXT_BLINK_DELAY); - - if (!blink && _blinkTimer->isActive()) - { - _blinkTimer->stop(); - _blinking = false; + _blinkTimer->stop (); + _blinking = false; } } -void TerminalDisplay::focusOutEvent(QFocusEvent*) +void +TerminalDisplay::focusOutEvent (QFocusEvent *) { - // trigger a repaint of the cursor so that it is both visible (in case - // it was hidden during blinking) - // and drawn in a focused out state - _cursorBlinking = false; - updateCursor(); - - _blinkCursorTimer->stop(); - if (_blinking) - blinkEvent(); - - _blinkTimer->stop(); + // trigger a repaint of the cursor so that it is both visible (in case + // it was hidden during blinking) + // and drawn in a focused out state + _cursorBlinking = false; + updateCursor (); + + _blinkCursorTimer->stop (); + if (_blinking) + blinkEvent (); + + _blinkTimer->stop (); } -void TerminalDisplay::focusInEvent(QFocusEvent*) + +void +TerminalDisplay::focusInEvent (QFocusEvent *) { - if (_hasBlinkingCursor) + if (_hasBlinkingCursor) { - _blinkCursorTimer->start(); + _blinkCursorTimer->start (); } - updateCursor(); - - if (_hasBlinker) - _blinkTimer->start(); + updateCursor (); + + if (_hasBlinker) + _blinkTimer->start (); } -void TerminalDisplay::paintEvent( QPaintEvent* pe ) +void +TerminalDisplay::paintEvent (QPaintEvent * pe) { - QPainter paint(this); - - foreach (const QRect &rect, (pe->region() & contentsRect()).rects()) - { - drawBackground(paint,rect,palette().background().color(), - true /* use opacity setting */); - drawContents(paint, rect); - } - drawInputMethodPreeditString(paint,preeditRect()); - paintFilters(paint); + QPainter paint (this); + + foreach (const QRect & rect, (pe->region () & contentsRect ()).rects ()) + { + drawBackground (paint, rect, palette ().background ().color (), + true /* use opacity setting */ ); + drawContents (paint, rect); + } + drawInputMethodPreeditString (paint, preeditRect ()); + paintFilters (paint); } -QPoint TerminalDisplay::cursorPosition() const +QPoint +TerminalDisplay::cursorPosition () const { - if (_screenWindow) - return _screenWindow->cursorPosition(); - else - return QPoint(0,0); + if (_screenWindow) + return _screenWindow->cursorPosition (); + else + return QPoint (0, 0); } -QRect TerminalDisplay::preeditRect() const +QRect +TerminalDisplay::preeditRect () const { - const int preeditLength = string_width(_inputMethodData.preeditString); - - if ( preeditLength == 0 ) - return QRect(); - - return QRect(_leftMargin + _fontWidth*cursorPosition().x(), - _topMargin + _fontHeight*cursorPosition().y(), - _fontWidth*preeditLength, - _fontHeight); -} - -void TerminalDisplay::drawInputMethodPreeditString(QPainter& painter , const QRect& rect) + const int preeditLength = string_width (_inputMethodData.preeditString); + + if (preeditLength == 0) + return QRect (); + + return QRect (_leftMargin + _fontWidth * cursorPosition ().x (), + _topMargin + _fontHeight * cursorPosition ().y (), + _fontWidth * preeditLength, _fontHeight); +} + +void +TerminalDisplay::drawInputMethodPreeditString (QPainter & painter, + const QRect & rect) { - if ( _inputMethodData.preeditString.isEmpty() ) - return; - - const QPoint cursorPos = cursorPosition(); - - bool invertColors = false; - const QColor background = _colorTable[DEFAULT_BACK_COLOR].color; - const QColor foreground = _colorTable[DEFAULT_FORE_COLOR].color; - const Character* style = &_image[loc(cursorPos.x(),cursorPos.y())]; - - drawBackground(painter,rect,background,true); - drawCursor(painter,rect,foreground,background,invertColors); - drawCharacters(painter,rect,_inputMethodData.preeditString,style,invertColors); - - _inputMethodData.previousPreeditRect = rect; + if (_inputMethodData.preeditString.isEmpty ()) + return; + + const QPoint cursorPos = cursorPosition (); + + bool invertColors = false; + const QColor background = _colorTable[DEFAULT_BACK_COLOR].color; + const QColor foreground = _colorTable[DEFAULT_FORE_COLOR].color; + const Character *style = &_image[loc (cursorPos.x (), cursorPos.y ())]; + + drawBackground (painter, rect, background, true); + drawCursor (painter, rect, foreground, background, invertColors); + drawCharacters (painter, rect, _inputMethodData.preeditString, style, + invertColors); + + _inputMethodData.previousPreeditRect = rect; } -FilterChain* TerminalDisplay::filterChain() const +FilterChain * +TerminalDisplay::filterChain () const { - return _filterChain; + return _filterChain; } -void TerminalDisplay::paintFilters(QPainter& painter) +void +TerminalDisplay::paintFilters (QPainter & painter) { - // get color of character under mouse and use it to draw - // lines for filters - QPoint cursorPos = mapFromGlobal(QCursor::pos()); - int cursorLine; - int cursorColumn; - int scrollBarWidth = (_scrollbarLocation == ScrollBarLeft) ? _scrollBar->width() : 0; - - getCharacterPosition( cursorPos , cursorLine , cursorColumn ); - Character cursorCharacter = _image[loc(cursorColumn,cursorLine)]; - - painter.setPen( QPen(cursorCharacter.foregroundColor.color(colorTable())) ); - - // iterate over hotspots identified by the display's currently active filters - // and draw appropriate visuals to indicate the presence of the hotspot - - QList<Filter::HotSpot*> spots = _filterChain->hotSpots(); - QListIterator<Filter::HotSpot*> iter(spots); - while (iter.hasNext()) + // get color of character under mouse and use it to draw + // lines for filters + QPoint cursorPos = mapFromGlobal (QCursor::pos ()); + int cursorLine; + int cursorColumn; + int scrollBarWidth = + (_scrollbarLocation == ScrollBarLeft) ? _scrollBar->width () : 0; + + getCharacterPosition (cursorPos, cursorLine, cursorColumn); + Character cursorCharacter = _image[loc (cursorColumn, cursorLine)]; + + painter. + setPen (QPen (cursorCharacter.foregroundColor.color (colorTable ()))); + + // iterate over hotspots identified by the display's currently active filters + // and draw appropriate visuals to indicate the presence of the hotspot + + QList < Filter::HotSpot * >spots = _filterChain->hotSpots (); + QListIterator < Filter::HotSpot * >iter (spots); + while (iter.hasNext ()) { - Filter::HotSpot* spot = iter.next(); - - QRegion region; - if ( spot->type() == Filter::HotSpot::Link ) { - QRect r; - if (spot->startLine()==spot->endLine()) { - r.setCoords( spot->startColumn()*_fontWidth + 1 + scrollBarWidth, - spot->startLine()*_fontHeight + 1, - (spot->endColumn()-1)*_fontWidth - 1 + scrollBarWidth, - (spot->endLine()+1)*_fontHeight - 1 ); - region |= r; - } else { - r.setCoords( spot->startColumn()*_fontWidth + 1 + scrollBarWidth, - spot->startLine()*_fontHeight + 1, - (_columns-1)*_fontWidth - 1 + scrollBarWidth, - (spot->startLine()+1)*_fontHeight - 1 ); - region |= r; - for ( int line = spot->startLine()+1 ; line < spot->endLine() ; line++ ) { - r.setCoords( 0*_fontWidth + 1 + scrollBarWidth, - line*_fontHeight + 1, - (_columns-1)*_fontWidth - 1 + scrollBarWidth, - (line+1)*_fontHeight - 1 ); - region |= r; - } - r.setCoords( 0*_fontWidth + 1 + scrollBarWidth, - spot->endLine()*_fontHeight + 1, - (spot->endColumn()-1)*_fontWidth - 1 + scrollBarWidth, - (spot->endLine()+1)*_fontHeight - 1 ); - region |= r; - } - } - - for ( int line = spot->startLine() ; line <= spot->endLine() ; line++ ) - { - int startColumn = 0; - int endColumn = _columns-1; // TODO use number of _columns which are actually - // occupied on this line rather than the width of the - // display in _columns - - // ignore whitespace at the end of the lines - while ( QChar(_image[loc(endColumn,line)].character).isSpace() && endColumn > 0 ) - endColumn--; - - // increment here because the column which we want to set 'endColumn' to - // is the first whitespace character at the end of the line - endColumn++; - - if ( line == spot->startLine() ) - startColumn = spot->startColumn(); - if ( line == spot->endLine() ) - endColumn = spot->endColumn(); - - // subtract one pixel from - // the right and bottom so that - // we do not overdraw adjacent - // hotspots - // - // subtracting one pixel from all sides also prevents an edge case where - // moving the mouse outside a link could still leave it underlined - // because the check below for the position of the cursor - // finds it on the border of the target area - QRect r; - r.setCoords( startColumn*_fontWidth + 1 + scrollBarWidth, - line*_fontHeight + 1, - endColumn*_fontWidth - 1 + scrollBarWidth, - (line+1)*_fontHeight - 1 ); - // Underline link hotspots - if ( spot->type() == Filter::HotSpot::Link ) - { - QFontMetrics metrics(font()); - - // find the baseline (which is the invisible line that the characters in the font sit on, - // with some having tails dangling below) - int baseline = r.bottom() - metrics.descent(); - // find the position of the underline below that - int underlinePos = baseline + metrics.underlinePos(); - if ( region.contains( mapFromGlobal(QCursor::pos()) ) ){ - painter.drawLine( r.left() , underlinePos , - r.right() , underlinePos ); - } - } - // Marker hotspots simply have a transparent rectanglular shape - // drawn on top of them - else if ( spot->type() == Filter::HotSpot::Marker ) - { - //TODO - Do not use a hardcoded colour for this - painter.fillRect(r,QBrush(QColor(255,0,0,120))); - } - } + Filter::HotSpot * spot = iter.next (); + + QRegion region; + if (spot->type () == Filter::HotSpot::Link) + { + QRect r; + if (spot->startLine () == spot->endLine ()) + { + r.setCoords (spot->startColumn () * _fontWidth + 1 + + scrollBarWidth, + spot->startLine () * _fontHeight + 1, + (spot->endColumn () - 1) * _fontWidth - 1 + + scrollBarWidth, + (spot->endLine () + 1) * _fontHeight - 1); + region |= r; + } + else + { + r.setCoords (spot->startColumn () * _fontWidth + 1 + + scrollBarWidth, + spot->startLine () * _fontHeight + 1, + (_columns - 1) * _fontWidth - 1 + scrollBarWidth, + (spot->startLine () + 1) * _fontHeight - 1); + region |= r; + for (int line = spot->startLine () + 1; line < spot->endLine (); + line++) + { + r.setCoords (0 * _fontWidth + 1 + scrollBarWidth, + line * _fontHeight + 1, + (_columns - 1) * _fontWidth - 1 + + scrollBarWidth, (line + 1) * _fontHeight - 1); + region |= r; + } + r.setCoords (0 * _fontWidth + 1 + scrollBarWidth, + spot->endLine () * _fontHeight + 1, + (spot->endColumn () - 1) * _fontWidth - 1 + + scrollBarWidth, + (spot->endLine () + 1) * _fontHeight - 1); + region |= r; + } + } + + for (int line = spot->startLine (); line <= spot->endLine (); line++) + { + int startColumn = 0; + int endColumn = _columns - 1; // TODO use number of _columns which are actually + // occupied on this line rather than the width of the + // display in _columns + + // ignore whitespace at the end of the lines + while (QChar (_image[loc (endColumn, line)].character).isSpace () + && endColumn > 0) + endColumn--; + + // increment here because the column which we want to set 'endColumn' to + // is the first whitespace character at the end of the line + endColumn++; + + if (line == spot->startLine ()) + startColumn = spot->startColumn (); + if (line == spot->endLine ()) + endColumn = spot->endColumn (); + + // subtract one pixel from + // the right and bottom so that + // we do not overdraw adjacent + // hotspots + // + // subtracting one pixel from all sides also prevents an edge case where + // moving the mouse outside a link could still leave it underlined + // because the check below for the position of the cursor + // finds it on the border of the target area + QRect r; + r.setCoords (startColumn * _fontWidth + 1 + scrollBarWidth, + line * _fontHeight + 1, + endColumn * _fontWidth - 1 + scrollBarWidth, + (line + 1) * _fontHeight - 1); + // Underline link hotspots + if (spot->type () == Filter::HotSpot::Link) + { + QFontMetrics metrics (font ()); + + // find the baseline (which is the invisible line that the characters in the font sit on, + // with some having tails dangling below) + int baseline = r.bottom () - metrics.descent (); + // find the position of the underline below that + int underlinePos = baseline + metrics.underlinePos (); + if (region.contains (mapFromGlobal (QCursor::pos ()))) + { + painter.drawLine (r.left (), underlinePos, + r.right (), underlinePos); + } + } + // Marker hotspots simply have a transparent rectanglular shape + // drawn on top of them + else if (spot->type () == Filter::HotSpot::Marker) + { + //TODO - Do not use a hardcoded colour for this + painter.fillRect (r, QBrush (QColor (255, 0, 0, 120))); + } + } } } -void TerminalDisplay::drawContents(QPainter &paint, const QRect &rect) + +void +TerminalDisplay::drawContents (QPainter & paint, const QRect & rect) { - QPoint tL = contentsRect().topLeft(); - int tLx = tL.x(); - int tLy = tL.y(); - - int lux = qMin(_usedColumns-1, qMax(0,(rect.left() - tLx - _leftMargin ) / _fontWidth)); - int luy = qMin(_usedLines-1, qMax(0,(rect.top() - tLy - _topMargin ) / _fontHeight)); - int rlx = qMin(_usedColumns-1, qMax(0,(rect.right() - tLx - _leftMargin ) / _fontWidth)); - int rly = qMin(_usedLines-1, qMax(0,(rect.bottom() - tLy - _topMargin ) / _fontHeight)); - - const int bufferSize = _usedColumns; - QString unistr; - unistr.reserve(bufferSize); - for (int y = luy; y <= rly; y++) + QPoint tL = contentsRect ().topLeft (); + int tLx = tL.x (); + int tLy = tL.y (); + + int lux = + qMin (_usedColumns - 1, + qMax (0, (rect.left () - tLx - _leftMargin) / _fontWidth)); + int luy = + qMin (_usedLines - 1, + qMax (0, (rect.top () - tLy - _topMargin) / _fontHeight)); + int rlx = + qMin (_usedColumns - 1, + qMax (0, (rect.right () - tLx - _leftMargin) / _fontWidth)); + int rly = + qMin (_usedLines - 1, + qMax (0, (rect.bottom () - tLy - _topMargin) / _fontHeight)); + + const int bufferSize = _usedColumns; + QString unistr; + unistr.reserve (bufferSize); + for (int y = luy; y <= rly; y++) { - quint16 c = _image[loc(lux,y)].character; - int x = lux; - if(!c && x) - x--; // Search for start of multi-column character - for (; x <= rlx; x++) - { - int len = 1; - int p = 0; - - // reset our buffer to the maximal size - unistr.resize(bufferSize); - QChar *disstrU = unistr.data(); - - // is this a single character or a sequence of characters ? - if ( _image[loc(x,y)].rendition & RE_EXTENDED_CHAR ) - { - // sequence of characters - ushort extendedCharLength = 0; - ushort* chars = ExtendedCharTable::instance - .lookupExtendedChar(_image[loc(x,y)].charSequence,extendedCharLength); - for ( int index = 0 ; index < extendedCharLength ; index++ ) - { - Q_ASSERT( p < bufferSize ); - disstrU[p++] = chars[index]; - } - } - else - { - // single character - c = _image[loc(x,y)].character; - if (c) - { - Q_ASSERT( p < bufferSize ); - disstrU[p++] = c; //fontMap(c); - } - } - - bool lineDraw = isLineChar(c); - bool doubleWidth = (_image[ qMin(loc(x,y)+1,_imageSize) ].character == 0); - CharacterColor currentForeground = _image[loc(x,y)].foregroundColor; - CharacterColor currentBackground = _image[loc(x,y)].backgroundColor; - quint8 currentRendition = _image[loc(x,y)].rendition; - - while (x+len <= rlx && - _image[loc(x+len,y)].foregroundColor == currentForeground && - _image[loc(x+len,y)].backgroundColor == currentBackground && - _image[loc(x+len,y)].rendition == currentRendition && - (_image[ qMin(loc(x+len,y)+1,_imageSize) ].character == 0) == doubleWidth && - isLineChar( c = _image[loc(x+len,y)].character) == lineDraw) // Assignment! - { - if (c) - disstrU[p++] = c; //fontMap(c); - if (doubleWidth) // assert((_image[loc(x+len,y)+1].character == 0)), see above if condition - len++; // Skip trailing part of multi-column character - len++; - } - if ((x+len < _usedColumns) && (!_image[loc(x+len,y)].character)) - len++; // Adjust for trailing part of multi-column character - - bool save__fixedFont = _fixedFont; - if (lineDraw) - _fixedFont = false; - if (doubleWidth) - _fixedFont = false; - unistr.resize(p); - - // Create a text scaling matrix for double width and double height lines. - QMatrix textScale; - - if (y < _lineProperties.size()) - { - if (_lineProperties[y] & LINE_DOUBLEWIDTH) - textScale.scale(2,1); - - if (_lineProperties[y] & LINE_DOUBLEHEIGHT) - textScale.scale(1,2); - } - - //Apply text scaling matrix. - paint.setWorldMatrix(textScale, true); - - //calculate the area in which the text will be drawn - QRect textArea = QRect( _leftMargin+tLx+_fontWidth*x , _topMargin+tLy+_fontHeight*y , _fontWidth*len , _fontHeight); - - //move the calculated area to take account of scaling applied to the painter. - //the position of the area from the origin (0,0) is scaled - //by the opposite of whatever - //transformation has been applied to the painter. this ensures that - //painting does actually start from textArea.topLeft() - //(instead of textArea.topLeft() * painter-scale) - textArea.moveTopLeft( textScale.inverted().map(textArea.topLeft()) ); - - //paint text fragment - drawTextFragment( paint, - textArea, - unistr, - &_image[loc(x,y)] ); //, - //0, - //!_isPrinting ); - - _fixedFont = save__fixedFont; - - //reset back to single-width, single-height _lines - paint.setWorldMatrix(textScale.inverted(), true); - - if (y < _lineProperties.size()-1) - { - //double-height _lines are represented by two adjacent _lines - //containing the same characters - //both _lines will have the LINE_DOUBLEHEIGHT attribute. - //If the current line has the LINE_DOUBLEHEIGHT attribute, - //we can therefore skip the next line - if (_lineProperties[y] & LINE_DOUBLEHEIGHT) - y++; - } - - x += len - 1; - } + quint16 c = _image[loc (lux, y)].character; + int x = lux; + if (!c && x) + x--; // Search for start of multi-column character + for (; x <= rlx; x++) + { + int len = 1; + int p = 0; + + // reset our buffer to the maximal size + unistr.resize (bufferSize); + QChar *disstrU = unistr.data (); + + // is this a single character or a sequence of characters ? + if (_image[loc (x, y)].rendition & RE_EXTENDED_CHAR) + { + // sequence of characters + ushort extendedCharLength = 0; + ushort *chars = + ExtendedCharTable::instance. + lookupExtendedChar (_image[loc (x, y)].charSequence, + extendedCharLength); + for (int index = 0; index < extendedCharLength; index++) + { + Q_ASSERT (p < bufferSize); + disstrU[p++] = chars[index]; + } + } + else + { + // single character + c = _image[loc (x, y)].character; + if (c) + { + Q_ASSERT (p < bufferSize); + disstrU[p++] = c; //fontMap(c); + } + } + + bool lineDraw = isLineChar (c); + bool doubleWidth = + (_image[qMin (loc (x, y) + 1, _imageSize)].character == 0); + CharacterColor currentForeground = + _image[loc (x, y)].foregroundColor; + CharacterColor currentBackground = + _image[loc (x, y)].backgroundColor; + quint8 currentRendition = _image[loc (x, y)].rendition; + + while (x + len <= rlx && _image[loc (x + len, y)].foregroundColor == currentForeground && _image[loc (x + len, y)].backgroundColor == currentBackground && _image[loc (x + len, y)].rendition == currentRendition && (_image[qMin (loc (x + len, y) + 1, _imageSize)].character == 0) == doubleWidth && isLineChar (c = _image[loc (x + len, y)].character) == lineDraw) // Assignment! + { + if (c) + disstrU[p++] = c; //fontMap(c); + if (doubleWidth) // assert((_image[loc(x+len,y)+1].character == 0)), see above if condition + len++; // Skip trailing part of multi-column character + len++; + } + if ((x + len < _usedColumns) + && (!_image[loc (x + len, y)].character)) + len++; // Adjust for trailing part of multi-column character + + bool save__fixedFont = _fixedFont; + if (lineDraw) + _fixedFont = false; + if (doubleWidth) + _fixedFont = false; + unistr.resize (p); + + // Create a text scaling matrix for double width and double height lines. + QMatrix textScale; + + if (y < _lineProperties.size ()) + { + if (_lineProperties[y] & LINE_DOUBLEWIDTH) + textScale.scale (2, 1); + + if (_lineProperties[y] & LINE_DOUBLEHEIGHT) + textScale.scale (1, 2); + } + + //Apply text scaling matrix. + paint.setWorldMatrix (textScale, true); + + //calculate the area in which the text will be drawn + QRect textArea = + QRect (_leftMargin + tLx + _fontWidth * x, + _topMargin + tLy + _fontHeight * y, _fontWidth * len, + _fontHeight); + + //move the calculated area to take account of scaling applied to the painter. + //the position of the area from the origin (0,0) is scaled + //by the opposite of whatever + //transformation has been applied to the painter. this ensures that + //painting does actually start from textArea.topLeft() + //(instead of textArea.topLeft() * painter-scale) + textArea.moveTopLeft (textScale.inverted (). + map (textArea.topLeft ())); + + //paint text fragment + drawTextFragment (paint, textArea, unistr, &_image[loc (x, y)]); //, + //0, + //!_isPrinting ); + + _fixedFont = save__fixedFont; + + //reset back to single-width, single-height _lines + paint.setWorldMatrix (textScale.inverted (), true); + + if (y < _lineProperties.size () - 1) + { + //double-height _lines are represented by two adjacent _lines + //containing the same characters + //both _lines will have the LINE_DOUBLEHEIGHT attribute. + //If the current line has the LINE_DOUBLEHEIGHT attribute, + //we can therefore skip the next line + if (_lineProperties[y] & LINE_DOUBLEHEIGHT) + y++; + } + + x += len - 1; + } } } -void TerminalDisplay::blinkEvent() +void +TerminalDisplay::blinkEvent () { - if (!_allowBlinkingText) return; - - _blinking = !_blinking; - - //TODO: Optimize to only repaint the areas of the widget - // where there is blinking text - // rather than repainting the whole widget. - update(); + if (!_allowBlinkingText) + return; + + _blinking = !_blinking; + + //TODO: Optimize to only repaint the areas of the widget + // where there is blinking text + // rather than repainting the whole widget. + update (); } -QRect TerminalDisplay::imageToWidget(const QRect& imageArea) const +QRect +TerminalDisplay::imageToWidget (const QRect & imageArea) const { - QRect result; - result.setLeft( _leftMargin + _fontWidth * imageArea.left() ); - result.setTop( _topMargin + _fontHeight * imageArea.top() ); - result.setWidth( _fontWidth * imageArea.width() ); - result.setHeight( _fontHeight * imageArea.height() ); - - return result; + QRect result; + result.setLeft (_leftMargin + _fontWidth * imageArea.left ()); + result.setTop (_topMargin + _fontHeight * imageArea.top ()); + result.setWidth (_fontWidth * imageArea.width ()); + result.setHeight (_fontHeight * imageArea.height ()); + + return result; } -void TerminalDisplay::updateCursor() +void +TerminalDisplay::updateCursor () { - QRect cursorRect = imageToWidget( QRect(cursorPosition(),QSize(1,1)) ); - update(cursorRect); + QRect cursorRect = imageToWidget (QRect (cursorPosition (), QSize (1, 1))); + update (cursorRect); } -void TerminalDisplay::blinkCursorEvent() +void +TerminalDisplay::blinkCursorEvent () { - _cursorBlinking = !_cursorBlinking; - updateCursor(); + _cursorBlinking = !_cursorBlinking; + updateCursor (); } /* ------------------------------------------------------------------------- */ @@ -1536,59 +1638,63 @@ /* */ /* ------------------------------------------------------------------------- */ -void TerminalDisplay::resizeEvent(QResizeEvent*) +void +TerminalDisplay::resizeEvent (QResizeEvent *) { - updateImageSize(); + updateImageSize (); } -void TerminalDisplay::propagateSize() +void +TerminalDisplay::propagateSize () { - if (_isFixedSize) + if (_isFixedSize) { - setSize(_columns, _lines); - QWidget::setFixedSize(sizeHint()); - parentWidget()->adjustSize(); - parentWidget()->setFixedSize(parentWidget()->sizeHint()); - return; + setSize (_columns, _lines); + QWidget::setFixedSize (sizeHint ()); + parentWidget ()->adjustSize (); + parentWidget ()->setFixedSize (parentWidget ()->sizeHint ()); + return; } - if (_image) - updateImageSize(); + if (_image) + updateImageSize (); } -void TerminalDisplay::updateImageSize() +void +TerminalDisplay::updateImageSize () { - Character* oldimg = _image; - int oldlin = _lines; - int oldcol = _columns; - - makeImage(); - - // copy the old image to reduce flicker - int lines = qMin(oldlin,_lines); - int columns = qMin(oldcol,_columns); - - if (oldimg) + Character *oldimg = _image; + int oldlin = _lines; + int oldcol = _columns; + + makeImage (); + + // copy the old image to reduce flicker + int lines = qMin (oldlin, _lines); + int columns = qMin (oldcol, _columns); + + if (oldimg) { - for (int line = 0; line < lines; line++) - { - memcpy((void*)&_image[_columns*line], - (void*)&oldimg[oldcol*line],columns*sizeof(Character)); - } - delete[] oldimg; + for (int line = 0; line < lines; line++) + { + memcpy ((void *) &_image[_columns * line], + (void *) &oldimg[oldcol * line], + columns * sizeof (Character)); + } + delete[]oldimg; } - if (_screenWindow) - _screenWindow->setWindowLines(_lines); - - _resizing = (oldlin!=_lines) || (oldcol!=_columns); - - if ( _resizing ) + if (_screenWindow) + _screenWindow->setWindowLines (_lines); + + _resizing = (oldlin != _lines) || (oldcol != _columns); + + if (_resizing) { - showResizeNotification(); - emit changedContentSizeSignal(_contentHeight, _contentWidth); // expose resizeEvent + showResizeNotification (); + emit changedContentSizeSignal (_contentHeight, _contentWidth); // expose resizeEvent } - _resizing = false; + _resizing = false; } //showEvent and hideEvent are reimplemented here so that it appears to other classes that the @@ -1596,13 +1702,16 @@ // //TODO: Perhaps it would be better to have separate signals for show and hide instead of using //the same signal as the one for a content size change -void TerminalDisplay::showEvent(QShowEvent*) +void +TerminalDisplay::showEvent (QShowEvent *) { - emit changedContentSizeSignal(_contentHeight,_contentWidth); + emit changedContentSizeSignal (_contentHeight, _contentWidth); } -void TerminalDisplay::hideEvent(QHideEvent*) + +void +TerminalDisplay::hideEvent (QHideEvent *) { - emit changedContentSizeSignal(_contentHeight,_contentWidth); + emit changedContentSizeSignal (_contentHeight, _contentWidth); } /* ------------------------------------------------------------------------- */ @@ -1611,787 +1720,898 @@ /* */ /* ------------------------------------------------------------------------- */ -void TerminalDisplay::scrollBarPositionChanged(int) +void +TerminalDisplay::scrollBarPositionChanged (int) { - if ( !_screenWindow ) - return; - - _screenWindow->scrollTo( _scrollBar->value() ); - - // if the thumb has been moved to the bottom of the _scrollBar then set - // the display to automatically track new output, - // that is, scroll down automatically - // to how new _lines as they are added - const bool atEndOfOutput = (_scrollBar->value() == _scrollBar->maximum()); - _screenWindow->setTrackOutput( atEndOfOutput ); - - updateImage(); + if (!_screenWindow) + return; + + _screenWindow->scrollTo (_scrollBar->value ()); + + // if the thumb has been moved to the bottom of the _scrollBar then set + // the display to automatically track new output, + // that is, scroll down automatically + // to how new _lines as they are added + const bool atEndOfOutput = (_scrollBar->value () == _scrollBar->maximum ()); + _screenWindow->setTrackOutput (atEndOfOutput); + + updateImage (); } -void TerminalDisplay::setScroll(int cursor, int slines) +void +TerminalDisplay::setScroll (int cursor, int slines) { - // update _scrollBar if the range or value has changed, - // otherwise return - // - // setting the range or value of a _scrollBar will always trigger - // a repaint, so it should be avoided if it is not necessary - if ( _scrollBar->minimum() == 0 && - _scrollBar->maximum() == (slines - _lines) && - _scrollBar->value() == cursor ) + // update _scrollBar if the range or value has changed, + // otherwise return + // + // setting the range or value of a _scrollBar will always trigger + // a repaint, so it should be avoided if it is not necessary + if (_scrollBar->minimum () == 0 && + _scrollBar->maximum () == (slines - _lines) && + _scrollBar->value () == cursor) { - return; + return; } - disconnect(_scrollBar, SIGNAL(valueChanged(int)), this, SLOT(scrollBarPositionChanged(int))); - _scrollBar->setRange(0,slines - _lines); - _scrollBar->setSingleStep(1); - _scrollBar->setPageStep(_lines); - _scrollBar->setValue(cursor); - connect(_scrollBar, SIGNAL(valueChanged(int)), this, SLOT(scrollBarPositionChanged(int))); + disconnect (_scrollBar, SIGNAL (valueChanged (int)), this, + SLOT (scrollBarPositionChanged (int))); + _scrollBar->setRange (0, slines - _lines); + _scrollBar->setSingleStep (1); + _scrollBar->setPageStep (_lines); + _scrollBar->setValue (cursor); + connect (_scrollBar, SIGNAL (valueChanged (int)), this, + SLOT (scrollBarPositionChanged (int))); } -void TerminalDisplay::setScrollBarPosition(ScrollBarPosition position) +void +TerminalDisplay::setScrollBarPosition (ScrollBarPosition position) { - if (_scrollbarLocation == position) - return; - - if ( position == NoScrollBar ) - _scrollBar->hide(); - else - _scrollBar->show(); - - _topMargin = _leftMargin = 1; - _scrollbarLocation = position; - - propagateSize(); - update(); + if (_scrollbarLocation == position) + return; + + if (position == NoScrollBar) + _scrollBar->hide (); + else + _scrollBar->show (); + + _topMargin = _leftMargin = 1; + _scrollbarLocation = position; + + propagateSize (); + update (); } -void TerminalDisplay::mousePressEvent(QMouseEvent* ev) +void +TerminalDisplay::mousePressEvent (QMouseEvent * ev) { - if ( _possibleTripleClick && (ev->button()==Qt::LeftButton) ) { - mouseTripleClickEvent(ev); - return; + if (_possibleTripleClick && (ev->button () == Qt::LeftButton)) + { + mouseTripleClickEvent (ev); + return; } - if ( !contentsRect().contains(ev->pos()) ) return; - - if ( !_screenWindow ) return; - - int charLine; - int charColumn; - getCharacterPosition(ev->pos(),charLine,charColumn); - QPoint pos = QPoint(charColumn,charLine); - - if ( ev->button() == Qt::LeftButton) + if (!contentsRect ().contains (ev->pos ())) + return; + + if (!_screenWindow) + return; + + int charLine; + int charColumn; + getCharacterPosition (ev->pos (), charLine, charColumn); + QPoint pos = QPoint (charColumn, charLine); + + if (ev->button () == Qt::LeftButton) { - _lineSelectionMode = false; - _wordSelectionMode = false; - - emit isBusySelecting(true); // Keep it steady... - // Drag only when the Control key is hold - bool selected = false; - - // The receiver of the testIsSelected() signal will adjust - // 'selected' accordingly. - //emit testIsSelected(pos.x(), pos.y(), selected); - - selected = _screenWindow->isSelected(pos.x(),pos.y()); - - if ((!_ctrlDrag || ev->modifiers() & Qt::ControlModifier) && selected ) { - // The user clicked inside selected text - dragInfo.state = diPending; - dragInfo.start = ev->pos(); - } - else { - // No reason to ever start a drag event - dragInfo.state = diNone; - - _preserveLineBreaks = !( ( ev->modifiers() & Qt::ControlModifier ) && !(ev->modifiers() & Qt::AltModifier) ); - _columnSelectionMode = (ev->modifiers() & Qt::AltModifier) && (ev->modifiers() & Qt::ControlModifier); - - if (_mouseMarks || (ev->modifiers() & Qt::ShiftModifier)) - { - _screenWindow->clearSelection(); - - //emit clearSelectionSignal(); - pos.ry() += _scrollBar->value(); - _iPntSel = _pntSel = pos; - _actSel = 1; // left mouse button pressed but nothing selected yet. - - } - else - { - emit mouseSignal( 0, charColumn + 1, charLine + 1 +_scrollBar->value() -_scrollBar->maximum() , 0); - } - } + _lineSelectionMode = false; + _wordSelectionMode = false; + + emit isBusySelecting (true); // Keep it steady... + // Drag only when the Control key is hold + bool selected = false; + + // The receiver of the testIsSelected() signal will adjust + // 'selected' accordingly. + //emit testIsSelected(pos.x(), pos.y(), selected); + + selected = _screenWindow->isSelected (pos.x (), pos.y ()); + + if ((!_ctrlDrag || ev->modifiers () & Qt::ControlModifier) && selected) + { + // The user clicked inside selected text + dragInfo.state = diPending; + dragInfo.start = ev->pos (); + } + else + { + // No reason to ever start a drag event + dragInfo.state = diNone; + + _preserveLineBreaks = !((ev->modifiers () & Qt::ControlModifier) + && !(ev->modifiers () & Qt::AltModifier)); + _columnSelectionMode = (ev->modifiers () & Qt::AltModifier) + && (ev->modifiers () & Qt::ControlModifier); + + if (_mouseMarks || (ev->modifiers () & Qt::ShiftModifier)) + { + _screenWindow->clearSelection (); + + //emit clearSelectionSignal(); + pos.ry () += _scrollBar->value (); + _iPntSel = _pntSel = pos; + _actSel = 1; // left mouse button pressed but nothing selected yet. + + } + else + { + emit mouseSignal (0, charColumn + 1, + charLine + 1 + _scrollBar->value () - + _scrollBar->maximum (), 0); + } + } } - else if ( ev->button() == Qt::MidButton ) + else if (ev->button () == Qt::MidButton) { - if ( _mouseMarks || (!_mouseMarks && (ev->modifiers() & Qt::ShiftModifier)) ) - emitSelection(true,ev->modifiers() & Qt::ControlModifier); - else - emit mouseSignal( 1, charColumn +1, charLine +1 +_scrollBar->value() -_scrollBar->maximum() , 0); + if (_mouseMarks + || (!_mouseMarks && (ev->modifiers () & Qt::ShiftModifier))) + emitSelection (true, ev->modifiers () & Qt::ControlModifier); + else + emit mouseSignal (1, charColumn + 1, + charLine + 1 + _scrollBar->value () - + _scrollBar->maximum (), 0); } - else if ( ev->button() == Qt::RightButton ) + else if (ev->button () == Qt::RightButton) { - if (_mouseMarks || (ev->modifiers() & Qt::ShiftModifier)) - emit configureRequest(ev->pos()); - else - emit mouseSignal( 2, charColumn +1, charLine +1 +_scrollBar->value() -_scrollBar->maximum() , 0); + if (_mouseMarks || (ev->modifiers () & Qt::ShiftModifier)) + emit configureRequest (ev->pos ()); + else + emit mouseSignal (2, charColumn + 1, + charLine + 1 + _scrollBar->value () - + _scrollBar->maximum (), 0); } } -QList<QAction*> TerminalDisplay::filterActions(const QPoint& position) +QList < QAction * >TerminalDisplay::filterActions (const QPoint & position) { - int charLine, charColumn; - getCharacterPosition(position,charLine,charColumn); - - Filter::HotSpot* spot = _filterChain->hotSpotAt(charLine,charColumn); - - return spot ? spot->actions() : QList<QAction*>(); + int + charLine, + charColumn; + getCharacterPosition (position, charLine, charColumn); + + Filter::HotSpot * spot = _filterChain->hotSpotAt (charLine, charColumn); + + return spot ? spot->actions () : QList < QAction * >(); } -void TerminalDisplay::mouseMoveEvent(QMouseEvent* ev) +void +TerminalDisplay::mouseMoveEvent (QMouseEvent * ev) { - int charLine = 0; - int charColumn = 0; - int scrollBarWidth = (_scrollbarLocation == ScrollBarLeft) ? _scrollBar->width() : 0; - - getCharacterPosition(ev->pos(),charLine,charColumn); - - // handle filters - // change link hot-spot appearance on mouse-over - Filter::HotSpot* spot = _filterChain->hotSpotAt(charLine,charColumn); - if ( spot && spot->type() == Filter::HotSpot::Link) + int charLine = 0; + int charColumn = 0; + int scrollBarWidth = + (_scrollbarLocation == ScrollBarLeft) ? _scrollBar->width () : 0; + + getCharacterPosition (ev->pos (), charLine, charColumn); + + // handle filters + // change link hot-spot appearance on mouse-over + Filter::HotSpot * spot = _filterChain->hotSpotAt (charLine, charColumn); + if (spot && spot->type () == Filter::HotSpot::Link) { - QRegion previousHotspotArea = _mouseOverHotspotArea; - _mouseOverHotspotArea = QRegion(); - QRect r; - if (spot->startLine()==spot->endLine()) { - r.setCoords( spot->startColumn()*_fontWidth + scrollBarWidth, - spot->startLine()*_fontHeight, - spot->endColumn()*_fontWidth + scrollBarWidth, - (spot->endLine()+1)*_fontHeight - 1 ); - _mouseOverHotspotArea |= r; - } else { - r.setCoords( spot->startColumn()*_fontWidth + scrollBarWidth, - spot->startLine()*_fontHeight, - _columns*_fontWidth - 1 + scrollBarWidth, - (spot->startLine()+1)*_fontHeight ); - _mouseOverHotspotArea |= r; - for ( int line = spot->startLine()+1 ; line < spot->endLine() ; line++ ) { - r.setCoords( 0*_fontWidth + scrollBarWidth, - line*_fontHeight, - _columns*_fontWidth + scrollBarWidth, - (line+1)*_fontHeight ); - _mouseOverHotspotArea |= r; - } - r.setCoords( 0*_fontWidth + scrollBarWidth, - spot->endLine()*_fontHeight, - spot->endColumn()*_fontWidth + scrollBarWidth, - (spot->endLine()+1)*_fontHeight ); - _mouseOverHotspotArea |= r; - } - // display tooltips when mousing over links - // TODO: Extend this to work with filter types other than links - const QString& tooltip = spot->tooltip(); - if ( !tooltip.isEmpty() ) - { - QToolTip::showText( mapToGlobal(ev->pos()) , tooltip , this , _mouseOverHotspotArea.boundingRect() ); - } - - update( _mouseOverHotspotArea | previousHotspotArea ); + QRegion previousHotspotArea = _mouseOverHotspotArea; + _mouseOverHotspotArea = QRegion (); + QRect r; + if (spot->startLine () == spot->endLine ()) + { + r.setCoords (spot->startColumn () * _fontWidth + scrollBarWidth, + spot->startLine () * _fontHeight, + spot->endColumn () * _fontWidth + scrollBarWidth, + (spot->endLine () + 1) * _fontHeight - 1); + _mouseOverHotspotArea |= r; + } + else + { + r.setCoords (spot->startColumn () * _fontWidth + scrollBarWidth, + spot->startLine () * _fontHeight, + _columns * _fontWidth - 1 + scrollBarWidth, + (spot->startLine () + 1) * _fontHeight); + _mouseOverHotspotArea |= r; + for (int line = spot->startLine () + 1; line < spot->endLine (); + line++) + { + r.setCoords (0 * _fontWidth + scrollBarWidth, + line * _fontHeight, + _columns * _fontWidth + scrollBarWidth, + (line + 1) * _fontHeight); + _mouseOverHotspotArea |= r; + } + r.setCoords (0 * _fontWidth + scrollBarWidth, + spot->endLine () * _fontHeight, + spot->endColumn () * _fontWidth + scrollBarWidth, + (spot->endLine () + 1) * _fontHeight); + _mouseOverHotspotArea |= r; + } + // display tooltips when mousing over links + // TODO: Extend this to work with filter types other than links + const QString & tooltip = spot->tooltip (); + if (!tooltip.isEmpty ()) + { + QToolTip::showText (mapToGlobal (ev->pos ()), tooltip, this, + _mouseOverHotspotArea.boundingRect ()); + } + + update (_mouseOverHotspotArea | previousHotspotArea); } - else if ( !_mouseOverHotspotArea.isEmpty() ) + else if (!_mouseOverHotspotArea.isEmpty ()) { - update( _mouseOverHotspotArea ); - // set hotspot area to an invalid rectangle - _mouseOverHotspotArea = QRegion(); + update (_mouseOverHotspotArea); + // set hotspot area to an invalid rectangle + _mouseOverHotspotArea = QRegion (); } - // for auto-hiding the cursor, we need mouseTracking - if (ev->buttons() == Qt::NoButton ) return; - - // if the terminal is interested in mouse movements - // then emit a mouse movement signal, unless the shift - // key is being held down, which overrides this. - if (!_mouseMarks && !(ev->modifiers() & Qt::ShiftModifier)) + // for auto-hiding the cursor, we need mouseTracking + if (ev->buttons () == Qt::NoButton) + return; + + // if the terminal is interested in mouse movements + // then emit a mouse movement signal, unless the shift + // key is being held down, which overrides this. + if (!_mouseMarks && !(ev->modifiers () & Qt::ShiftModifier)) { - int button = 3; - if (ev->buttons() & Qt::LeftButton) - button = 0; - if (ev->buttons() & Qt::MidButton) - button = 1; - if (ev->buttons() & Qt::RightButton) - button = 2; - - - emit mouseSignal( button, - charColumn + 1, - charLine + 1 +_scrollBar->value() -_scrollBar->maximum(), - 1 ); - - return; + int button = 3; + if (ev->buttons () & Qt::LeftButton) + button = 0; + if (ev->buttons () & Qt::MidButton) + button = 1; + if (ev->buttons () & Qt::RightButton) + button = 2; + + + emit mouseSignal (button, + charColumn + 1, + charLine + 1 + _scrollBar->value () - + _scrollBar->maximum (), 1); + + return; } - if (dragInfo.state == diPending) + if (dragInfo.state == diPending) { - // we had a mouse down, but haven't confirmed a drag yet - // if the mouse has moved sufficiently, we will confirm - - int distance = 10; //KGlobalSettings::dndEventDelay(); - if ( ev->x() > dragInfo.start.x() + distance || ev->x() < dragInfo.start.x() - distance || - ev->y() > dragInfo.start.y() + distance || ev->y() < dragInfo.start.y() - distance) - { - // we've left the drag square, we can start a real drag operation now - emit isBusySelecting(false); // Ok.. we can breath again. - - _screenWindow->clearSelection(); - doDrag(); - } - return; + // we had a mouse down, but haven't confirmed a drag yet + // if the mouse has moved sufficiently, we will confirm + + int distance = 10; //KGlobalSettings::dndEventDelay(); + if (ev->x () > dragInfo.start.x () + distance + || ev->x () < dragInfo.start.x () - distance + || ev->y () > dragInfo.start.y () + distance + || ev->y () < dragInfo.start.y () - distance) + { + // we've left the drag square, we can start a real drag operation now + emit isBusySelecting (false); // Ok.. we can breath again. + + _screenWindow->clearSelection (); + doDrag (); + } + return; } - else if (dragInfo.state == diDragging) + else if (dragInfo.state == diDragging) { - // this isn't technically needed because mouseMoveEvent is suppressed during - // Qt drag operations, replaced by dragMoveEvent - return; + // this isn't technically needed because mouseMoveEvent is suppressed during + // Qt drag operations, replaced by dragMoveEvent + return; } - if (_actSel == 0) return; - - // don't extend selection while pasting - if (ev->buttons() & Qt::MidButton) return; - - extendSelection( ev->pos() ); + if (_actSel == 0) + return; + + // don't extend selection while pasting + if (ev->buttons () & Qt::MidButton) + return; + + extendSelection (ev->pos ()); } -void TerminalDisplay::extendSelection( const QPoint& position ) +void +TerminalDisplay::extendSelection (const QPoint & position) { - QPoint pos = position; - - if ( !_screenWindow ) - return; - - //if ( !contentsRect().contains(ev->pos()) ) return; - QPoint tL = contentsRect().topLeft(); - int tLx = tL.x(); - int tLy = tL.y(); - int scroll = _scrollBar->value(); - - // we're in the process of moving the mouse with the left button pressed - // the mouse cursor will kept caught within the bounds of the text in - // this widget. - - int linesBeyondWidget = 0; - - QRect textBounds(tLx + _leftMargin, - tLy + _topMargin, - _usedColumns*_fontWidth-1, - _usedLines*_fontHeight-1); - - // Adjust position within text area bounds. - QPoint oldpos = pos; - - pos.setX( qBound(textBounds.left(),pos.x(),textBounds.right()) ); - pos.setY( qBound(textBounds.top(),pos.y(),textBounds.bottom()) ); - - if ( oldpos.y() > textBounds.bottom() ) + QPoint pos = position; + + if (!_screenWindow) + return; + + //if ( !contentsRect().contains(ev->pos()) ) return; + QPoint tL = contentsRect ().topLeft (); + int tLx = tL.x (); + int tLy = tL.y (); + int scroll = _scrollBar->value (); + + // we're in the process of moving the mouse with the left button pressed + // the mouse cursor will kept caught within the bounds of the text in + // this widget. + + int linesBeyondWidget = 0; + + QRect textBounds (tLx + _leftMargin, + tLy + _topMargin, + _usedColumns * _fontWidth - 1, + _usedLines * _fontHeight - 1); + + // Adjust position within text area bounds. + QPoint oldpos = pos; + + pos.setX (qBound (textBounds.left (), pos.x (), textBounds.right ())); + pos.setY (qBound (textBounds.top (), pos.y (), textBounds.bottom ())); + + if (oldpos.y () > textBounds.bottom ()) + { + linesBeyondWidget = (oldpos.y () - textBounds.bottom ()) / _fontHeight; + _scrollBar->setValue (_scrollBar->value () + linesBeyondWidget + 1); // scrollforward + } + if (oldpos.y () < textBounds.top ()) { - linesBeyondWidget = (oldpos.y()-textBounds.bottom()) / _fontHeight; - _scrollBar->setValue(_scrollBar->value()+linesBeyondWidget+1); // scrollforward - } - if ( oldpos.y() < textBounds.top() ) - { - linesBeyondWidget = (textBounds.top()-oldpos.y()) / _fontHeight; - _scrollBar->setValue(_scrollBar->value()-linesBeyondWidget-1); // history + linesBeyondWidget = (textBounds.top () - oldpos.y ()) / _fontHeight; + _scrollBar->setValue (_scrollBar->value () - linesBeyondWidget - 1); // history } - int charColumn = 0; - int charLine = 0; - getCharacterPosition(pos,charLine,charColumn); - - QPoint here = QPoint(charColumn,charLine); //QPoint((pos.x()-tLx-_leftMargin+(_fontWidth/2))/_fontWidth,(pos.y()-tLy-_topMargin)/_fontHeight); - QPoint ohere; - QPoint _iPntSelCorr = _iPntSel; - _iPntSelCorr.ry() -= _scrollBar->value(); - QPoint _pntSelCorr = _pntSel; - _pntSelCorr.ry() -= _scrollBar->value(); - bool swapping = false; - - if ( _wordSelectionMode ) + int charColumn = 0; + int charLine = 0; + getCharacterPosition (pos, charLine, charColumn); + + QPoint here = QPoint (charColumn, charLine); //QPoint((pos.x()-tLx-_leftMargin+(_fontWidth/2))/_fontWidth,(pos.y()-tLy-_topMargin)/_fontHeight); + QPoint ohere; + QPoint _iPntSelCorr = _iPntSel; + _iPntSelCorr.ry () -= _scrollBar->value (); + QPoint _pntSelCorr = _pntSel; + _pntSelCorr.ry () -= _scrollBar->value (); + bool swapping = false; + + if (_wordSelectionMode) { - // Extend to word boundaries - int i; - QChar selClass; - - bool left_not_right = ( here.y() < _iPntSelCorr.y() || - ( here.y() == _iPntSelCorr.y() && here.x() < _iPntSelCorr.x() ) ); - bool old_left_not_right = ( _pntSelCorr.y() < _iPntSelCorr.y() || - ( _pntSelCorr.y() == _iPntSelCorr.y() && _pntSelCorr.x() < _iPntSelCorr.x() ) ); - swapping = left_not_right != old_left_not_right; - - // Find left (left_not_right ? from here : from start) - QPoint left = left_not_right ? here : _iPntSelCorr; - i = loc(left.x(),left.y()); - if (i>=0 && i<=_imageSize) { - selClass = charClass(_image[i].character); - while ( ((left.x()>0) || (left.y()>0 && (_lineProperties[left.y()-1] & LINE_WRAPPED) )) - && charClass(_image[i-1].character) == selClass ) - { i--; if (left.x()>0) left.rx()--; else {left.rx()=_usedColumns-1; left.ry()--;} } - } - - // Find left (left_not_right ? from start : from here) - QPoint right = left_not_right ? _iPntSelCorr : here; - i = loc(right.x(),right.y()); - if (i>=0 && i<=_imageSize) { - selClass = charClass(_image[i].character); - while( ((right.x()<_usedColumns-1) || (right.y()<_usedLines-1 && (_lineProperties[right.y()] & LINE_WRAPPED) )) - && charClass(_image[i+1].character) == selClass ) - { i++; if (right.x()<_usedColumns-1) right.rx()++; else {right.rx()=0; right.ry()++; } } - } - - // Pick which is start (ohere) and which is extension (here) - if ( left_not_right ) - { - here = left; ohere = right; - } - else - { - here = right; ohere = left; - } - ohere.rx()++; + // Extend to word boundaries + int i; + QChar selClass; + + bool left_not_right = (here.y () < _iPntSelCorr.y () || + (here.y () == _iPntSelCorr.y () + && here.x () < _iPntSelCorr.x ())); + bool old_left_not_right = (_pntSelCorr.y () < _iPntSelCorr.y () + || (_pntSelCorr.y () == _iPntSelCorr.y () + && _pntSelCorr.x () < + _iPntSelCorr.x ())); + swapping = left_not_right != old_left_not_right; + + // Find left (left_not_right ? from here : from start) + QPoint left = left_not_right ? here : _iPntSelCorr; + i = loc (left.x (), left.y ()); + if (i >= 0 && i <= _imageSize) + { + selClass = charClass (_image[i].character); + while (((left.x () > 0) + || (left.y () > 0 + && (_lineProperties[left.y () - 1] & LINE_WRAPPED))) + && charClass (_image[i - 1].character) == selClass) + { + i--; + if (left.x () > 0) + left.rx ()--; + else + { + left.rx () = _usedColumns - 1; + left.ry ()--; + } + } + } + + // Find left (left_not_right ? from start : from here) + QPoint right = left_not_right ? _iPntSelCorr : here; + i = loc (right.x (), right.y ()); + if (i >= 0 && i <= _imageSize) + { + selClass = charClass (_image[i].character); + while (((right.x () < _usedColumns - 1) + || (right.y () < _usedLines - 1 + && (_lineProperties[right.y ()] & LINE_WRAPPED))) + && charClass (_image[i + 1].character) == selClass) + { + i++; + if (right.x () < _usedColumns - 1) + right.rx ()++; + else + { + right.rx () = 0; + right.ry ()++; + } + } + } + + // Pick which is start (ohere) and which is extension (here) + if (left_not_right) + { + here = left; + ohere = right; + } + else + { + here = right; + ohere = left; + } + ohere.rx ()++; } - if ( _lineSelectionMode ) + if (_lineSelectionMode) { - // Extend to complete line - bool above_not_below = ( here.y() < _iPntSelCorr.y() ); - - QPoint above = above_not_below ? here : _iPntSelCorr; - QPoint below = above_not_below ? _iPntSelCorr : here; - - while (above.y()>0 && (_lineProperties[above.y()-1] & LINE_WRAPPED) ) - above.ry()--; - while (below.y()<_usedLines-1 && (_lineProperties[below.y()] & LINE_WRAPPED) ) - below.ry()++; - - above.setX(0); - below.setX(_usedColumns-1); - - // Pick which is start (ohere) and which is extension (here) - if ( above_not_below ) - { - here = above; ohere = below; - } - else - { - here = below; ohere = above; - } - - QPoint newSelBegin = QPoint( ohere.x(), ohere.y() ); - swapping = !(_tripleSelBegin==newSelBegin); - _tripleSelBegin = newSelBegin; - - ohere.rx()++; + // Extend to complete line + bool above_not_below = (here.y () < _iPntSelCorr.y ()); + + QPoint above = above_not_below ? here : _iPntSelCorr; + QPoint below = above_not_below ? _iPntSelCorr : here; + + while (above.y () > 0 + && (_lineProperties[above.y () - 1] & LINE_WRAPPED)) + above.ry ()--; + while (below.y () < _usedLines - 1 + && (_lineProperties[below.y ()] & LINE_WRAPPED)) + below.ry ()++; + + above.setX (0); + below.setX (_usedColumns - 1); + + // Pick which is start (ohere) and which is extension (here) + if (above_not_below) + { + here = above; + ohere = below; + } + else + { + here = below; + ohere = above; + } + + QPoint newSelBegin = QPoint (ohere.x (), ohere.y ()); + swapping = !(_tripleSelBegin == newSelBegin); + _tripleSelBegin = newSelBegin; + + ohere.rx ()++; } - int offset = 0; - if ( !_wordSelectionMode && !_lineSelectionMode ) + int offset = 0; + if (!_wordSelectionMode && !_lineSelectionMode) { - int i; - QChar selClass; - - bool left_not_right = ( here.y() < _iPntSelCorr.y() || - ( here.y() == _iPntSelCorr.y() && here.x() < _iPntSelCorr.x() ) ); - bool old_left_not_right = ( _pntSelCorr.y() < _iPntSelCorr.y() || - ( _pntSelCorr.y() == _iPntSelCorr.y() && _pntSelCorr.x() < _iPntSelCorr.x() ) ); - swapping = left_not_right != old_left_not_right; - - // Find left (left_not_right ? from here : from start) - QPoint left = left_not_right ? here : _iPntSelCorr; - - // Find left (left_not_right ? from start : from here) - QPoint right = left_not_right ? _iPntSelCorr : here; - if ( right.x() > 0 && !_columnSelectionMode ) - { - i = loc(right.x(),right.y()); - if (i>=0 && i<=_imageSize) { - selClass = charClass(_image[i-1].character); - /* if (selClass == ' ') - { - while ( right.x() < _usedColumns-1 && charClass(_image[i+1].character) == selClass && (right.y()<_usedLines-1) && - !(_lineProperties[right.y()] & LINE_WRAPPED)) - { i++; right.rx()++; } - if (right.x() < _usedColumns-1) - right = left_not_right ? _iPntSelCorr : here; - else - right.rx()++; // will be balanced later because of offset=-1; - }*/ - } - } - - // Pick which is start (ohere) and which is extension (here) - if ( left_not_right ) - { - here = left; ohere = right; offset = 0; - } - else - { - here = right; ohere = left; offset = -1; - } + int i; + QChar selClass; + + bool left_not_right = (here.y () < _iPntSelCorr.y () || + (here.y () == _iPntSelCorr.y () + && here.x () < _iPntSelCorr.x ())); + bool old_left_not_right = (_pntSelCorr.y () < _iPntSelCorr.y () + || (_pntSelCorr.y () == _iPntSelCorr.y () + && _pntSelCorr.x () < + _iPntSelCorr.x ())); + swapping = left_not_right != old_left_not_right; + + // Find left (left_not_right ? from here : from start) + QPoint left = left_not_right ? here : _iPntSelCorr; + + // Find left (left_not_right ? from start : from here) + QPoint right = left_not_right ? _iPntSelCorr : here; + if (right.x () > 0 && !_columnSelectionMode) + { + i = loc (right.x (), right.y ()); + if (i >= 0 && i <= _imageSize) + { + selClass = charClass (_image[i - 1].character); + /* if (selClass == ' ') + { + while ( right.x() < _usedColumns-1 && charClass(_image[i+1].character) == selClass && (right.y()<_usedLines-1) && + !(_lineProperties[right.y()] & LINE_WRAPPED)) + { i++; right.rx()++; } + if (right.x() < _usedColumns-1) + right = left_not_right ? _iPntSelCorr : here; + else + right.rx()++; // will be balanced later because of offset=-1; + } */ + } + } + + // Pick which is start (ohere) and which is extension (here) + if (left_not_right) + { + here = left; + ohere = right; + offset = 0; + } + else + { + here = right; + ohere = left; + offset = -1; + } } - if ((here == _pntSelCorr) && (scroll == _scrollBar->value())) return; // not moved - - if (here == ohere) return; // It's not left, it's not right. - - if ( _actSel < 2 || swapping ) + if ((here == _pntSelCorr) && (scroll == _scrollBar->value ())) + return; // not moved + + if (here == ohere) + return; // It's not left, it's not right. + + if (_actSel < 2 || swapping) { - if ( _columnSelectionMode && !_lineSelectionMode && !_wordSelectionMode ) - { - _screenWindow->setSelectionStart( ohere.x() , ohere.y() , true ); - } - else - { - _screenWindow->setSelectionStart( ohere.x()-1-offset , ohere.y() , false ); - } + if (_columnSelectionMode && !_lineSelectionMode && !_wordSelectionMode) + { + _screenWindow->setSelectionStart (ohere.x (), ohere.y (), true); + } + else + { + _screenWindow->setSelectionStart (ohere.x () - 1 - offset, + ohere.y (), false); + } } - _actSel = 2; // within selection - _pntSel = here; - _pntSel.ry() += _scrollBar->value(); - - if ( _columnSelectionMode && !_lineSelectionMode && !_wordSelectionMode ) + _actSel = 2; // within selection + _pntSel = here; + _pntSel.ry () += _scrollBar->value (); + + if (_columnSelectionMode && !_lineSelectionMode && !_wordSelectionMode) { - _screenWindow->setSelectionEnd( here.x() , here.y() ); + _screenWindow->setSelectionEnd (here.x (), here.y ()); } - else + else { - _screenWindow->setSelectionEnd( here.x()+offset , here.y() ); + _screenWindow->setSelectionEnd (here.x () + offset, here.y ()); } } -void TerminalDisplay::mouseReleaseEvent(QMouseEvent* ev) +void +TerminalDisplay::mouseReleaseEvent (QMouseEvent * ev) { - if ( !_screenWindow ) - return; - - int charLine; - int charColumn; - getCharacterPosition(ev->pos(),charLine,charColumn); - - if ( ev->button() == Qt::LeftButton) + if (!_screenWindow) + return; + + int charLine; + int charColumn; + getCharacterPosition (ev->pos (), charLine, charColumn); + + if (ev->button () == Qt::LeftButton) { - emit isBusySelecting(false); - if(dragInfo.state == diPending) - { - // We had a drag event pending but never confirmed. Kill selection - _screenWindow->clearSelection(); - //emit clearSelectionSignal(); - } - else - { - if ( _actSel > 1 ) - { - setSelection( _screenWindow->selectedText(_preserveLineBreaks) ); - } - - _actSel = 0; - - //FIXME: emits a release event even if the mouse is - // outside the range. The procedure used in `mouseMoveEvent' - // applies here, too. - - if (!_mouseMarks && !(ev->modifiers() & Qt::ShiftModifier)) - emit mouseSignal( 3, // release - charColumn + 1, - charLine + 1 +_scrollBar->value() -_scrollBar->maximum() , 0); - } - dragInfo.state = diNone; + emit isBusySelecting (false); + if (dragInfo.state == diPending) + { + // We had a drag event pending but never confirmed. Kill selection + _screenWindow->clearSelection (); + //emit clearSelectionSignal(); + } + else + { + if (_actSel > 1) + { + setSelection (_screenWindow-> + selectedText (_preserveLineBreaks)); + } + + _actSel = 0; + + //FIXME: emits a release event even if the mouse is + // outside the range. The procedure used in `mouseMoveEvent' + // applies here, too. + + if (!_mouseMarks && !(ev->modifiers () & Qt::ShiftModifier)) + emit mouseSignal (3, // release + charColumn + 1, + charLine + 1 + _scrollBar->value () - + _scrollBar->maximum (), 0); + } + dragInfo.state = diNone; } - if ( !_mouseMarks && - ((ev->button() == Qt::RightButton && !(ev->modifiers() & Qt::ShiftModifier)) - || ev->button() == Qt::MidButton) ) + if (!_mouseMarks && + ((ev->button () == Qt::RightButton + && !(ev->modifiers () & Qt::ShiftModifier)) + || ev->button () == Qt::MidButton)) { - emit mouseSignal( 3, - charColumn + 1, - charLine + 1 +_scrollBar->value() -_scrollBar->maximum() , - 0); + emit mouseSignal (3, + charColumn + 1, + charLine + 1 + _scrollBar->value () - + _scrollBar->maximum (), 0); } } -void TerminalDisplay::getCharacterPosition(const QPoint& widgetPoint,int& line,int& column) const -{ - column = (widgetPoint.x() + _fontWidth/2 -contentsRect().left()-_leftMargin) / _fontWidth; - line = (widgetPoint.y()-contentsRect().top()-_topMargin) / _fontHeight; - - if ( line < 0 ) - line = 0; - if ( column < 0 ) - column = 0; - - if ( line >= _usedLines ) - line = _usedLines-1; - - // the column value returned can be equal to _usedColumns, which - // is the position just after the last character displayed in a line. - // - // this is required so that the user can select characters in the right-most - // column (or left-most for right-to-left input) - if ( column > _usedColumns ) - column = _usedColumns; -} - -void TerminalDisplay::updateLineProperties() -{ - if ( !_screenWindow ) - return; - - _lineProperties = _screenWindow->getLineProperties(); -} - -void TerminalDisplay::mouseDoubleClickEvent(QMouseEvent* ev) +void +TerminalDisplay::getCharacterPosition (const QPoint & widgetPoint, int &line, + int &column) const { - if ( ev->button() != Qt::LeftButton) return; - if ( !_screenWindow ) return; - - int charLine = 0; - int charColumn = 0; - - getCharacterPosition(ev->pos(),charLine,charColumn); - - QPoint pos(charColumn,charLine); - - // pass on double click as two clicks. - if (!_mouseMarks && !(ev->modifiers() & Qt::ShiftModifier)) - { - // Send just _ONE_ click event, since the first click of the double click - // was already sent by the click handler - emit mouseSignal( 0, - pos.x()+1, - pos.y()+1 +_scrollBar->value() -_scrollBar->maximum(), - 0 ); // left button - return; - } - - _screenWindow->clearSelection(); - QPoint bgnSel = pos; - QPoint endSel = pos; - int i = loc(bgnSel.x(),bgnSel.y()); - _iPntSel = bgnSel; - _iPntSel.ry() += _scrollBar->value(); - - _wordSelectionMode = true; - - // find word boundaries... - QChar selClass = charClass(_image[i].character); + column = + (widgetPoint.x () + _fontWidth / 2 - contentsRect ().left () - + _leftMargin) / _fontWidth; + line = + (widgetPoint.y () - contentsRect ().top () - _topMargin) / _fontHeight; + + if (line < 0) + line = 0; + if (column < 0) + column = 0; + + if (line >= _usedLines) + line = _usedLines - 1; + + // the column value returned can be equal to _usedColumns, which + // is the position just after the last character displayed in a line. + // + // this is required so that the user can select characters in the right-most + // column (or left-most for right-to-left input) + if (column > _usedColumns) + column = _usedColumns; +} + +void +TerminalDisplay::updateLineProperties () +{ + if (!_screenWindow) + return; + + _lineProperties = _screenWindow->getLineProperties (); +} + +void +TerminalDisplay::mouseDoubleClickEvent (QMouseEvent * ev) +{ + if (ev->button () != Qt::LeftButton) + return; + if (!_screenWindow) + return; + + int charLine = 0; + int charColumn = 0; + + getCharacterPosition (ev->pos (), charLine, charColumn); + + QPoint pos (charColumn, charLine); + + // pass on double click as two clicks. + if (!_mouseMarks && !(ev->modifiers () & Qt::ShiftModifier)) { - // find the start of the word - int x = bgnSel.x(); - while ( ((x>0) || (bgnSel.y()>0 && (_lineProperties[bgnSel.y()-1] & LINE_WRAPPED) )) - && charClass(_image[i-1].character) == selClass ) - { - i--; - if (x>0) - x--; - else - { - x=_usedColumns-1; - bgnSel.ry()--; - } - } - - bgnSel.setX(x); - _screenWindow->setSelectionStart( bgnSel.x() , bgnSel.y() , false ); - - // find the end of the word - i = loc( endSel.x(), endSel.y() ); - x = endSel.x(); - while( ((x<_usedColumns-1) || (endSel.y()<_usedLines-1 && (_lineProperties[endSel.y()] & LINE_WRAPPED) )) - && charClass(_image[i+1].character) == selClass ) - { - i++; - if (x<_usedColumns-1) - x++; - else - { - x=0; - endSel.ry()++; - } - } - - endSel.setX(x); - - // In word selection mode don't select @ (64) if at end of word. - if ( ( QChar( _image[i].character ) == '@' ) && ( ( endSel.x() - bgnSel.x() ) > 0 ) ) - endSel.setX( x - 1 ); - - - _actSel = 2; // within selection - - _screenWindow->setSelectionEnd( endSel.x() , endSel.y() ); - - setSelection( _screenWindow->selectedText(_preserveLineBreaks) ); + // Send just _ONE_ click event, since the first click of the double click + // was already sent by the click handler + emit mouseSignal (0, pos.x () + 1, pos.y () + 1 + _scrollBar->value () - _scrollBar->maximum (), 0); // left button + return; } - _possibleTripleClick=true; - - QTimer::singleShot(QApplication::doubleClickInterval(),this, - SLOT(tripleClickTimeout())); + _screenWindow->clearSelection (); + QPoint bgnSel = pos; + QPoint endSel = pos; + int i = loc (bgnSel.x (), bgnSel.y ()); + _iPntSel = bgnSel; + _iPntSel.ry () += _scrollBar->value (); + + _wordSelectionMode = true; + + // find word boundaries... + QChar selClass = charClass (_image[i].character); + { + // find the start of the word + int x = bgnSel.x (); + while (((x > 0) + || (bgnSel.y () > 0 + && (_lineProperties[bgnSel.y () - 1] & LINE_WRAPPED))) + && charClass (_image[i - 1].character) == selClass) + { + i--; + if (x > 0) + x--; + else + { + x = _usedColumns - 1; + bgnSel.ry ()--; + } + } + + bgnSel.setX (x); + _screenWindow->setSelectionStart (bgnSel.x (), bgnSel.y (), false); + + // find the end of the word + i = loc (endSel.x (), endSel.y ()); + x = endSel.x (); + while (((x < _usedColumns - 1) + || (endSel.y () < _usedLines - 1 + && (_lineProperties[endSel.y ()] & LINE_WRAPPED))) + && charClass (_image[i + 1].character) == selClass) + { + i++; + if (x < _usedColumns - 1) + x++; + else + { + x = 0; + endSel.ry ()++; + } + } + + endSel.setX (x); + + // In word selection mode don't select @ (64) if at end of word. + if ((QChar (_image[i].character) == '@') + && ((endSel.x () - bgnSel.x ()) > 0)) + endSel.setX (x - 1); + + + _actSel = 2; // within selection + + _screenWindow->setSelectionEnd (endSel.x (), endSel.y ()); + + setSelection (_screenWindow->selectedText (_preserveLineBreaks)); + } + + _possibleTripleClick = true; + + QTimer::singleShot (QApplication::doubleClickInterval (), this, + SLOT (tripleClickTimeout ())); } -void TerminalDisplay::wheelEvent( QWheelEvent* ev ) +void +TerminalDisplay::wheelEvent (QWheelEvent * ev) { - if (ev->orientation() != Qt::Vertical) - return; - - // if the terminal program is not interested mouse events - // then send the event to the scrollbar if the slider has room to move - // or otherwise send simulated up / down key presses to the terminal program - // for the benefit of programs such as 'less' - if ( _mouseMarks ) + if (ev->orientation () != Qt::Vertical) + return; + + // if the terminal program is not interested mouse events + // then send the event to the scrollbar if the slider has room to move + // or otherwise send simulated up / down key presses to the terminal program + // for the benefit of programs such as 'less' + if (_mouseMarks) { - bool canScroll = _scrollBar->maximum() > 0; - if (canScroll) - _scrollBar->event(ev); - else - { - // assume that each Up / Down key event will cause the terminal application - // to scroll by one line. - // - // to get a reasonable scrolling speed, scroll by one line for every 5 degrees - // of mouse wheel rotation. Mouse wheels typically move in steps of 15 degrees, - // giving a scroll of 3 lines - int key = ev->delta() > 0 ? Qt::Key_Up : Qt::Key_Down; - - // QWheelEvent::delta() gives rotation in eighths of a degree - int wheelDegrees = ev->delta() / 8; - int linesToScroll = abs(wheelDegrees) / 5; - - QKeyEvent keyScrollEvent(QEvent::KeyPress,key,Qt::NoModifier); - - for (int i=0;i<linesToScroll;i++) - emit keyPressedSignal(&keyScrollEvent); - } + bool canScroll = _scrollBar->maximum () > 0; + if (canScroll) + _scrollBar->event (ev); + else + { + // assume that each Up / Down key event will cause the terminal application + // to scroll by one line. + // + // to get a reasonable scrolling speed, scroll by one line for every 5 degrees + // of mouse wheel rotation. Mouse wheels typically move in steps of 15 degrees, + // giving a scroll of 3 lines + int key = ev->delta () > 0 ? Qt::Key_Up : Qt::Key_Down; + + // QWheelEvent::delta() gives rotation in eighths of a degree + int wheelDegrees = ev->delta () / 8; + int linesToScroll = abs (wheelDegrees) / 5; + + QKeyEvent keyScrollEvent (QEvent::KeyPress, key, Qt::NoModifier); + + for (int i = 0; i < linesToScroll; i++) + emit keyPressedSignal (&keyScrollEvent); + } } - else + else { - // terminal program wants notification of mouse activity - - int charLine; - int charColumn; - getCharacterPosition( ev->pos() , charLine , charColumn ); - - emit mouseSignal( ev->delta() > 0 ? 4 : 5, - charColumn + 1, - charLine + 1 +_scrollBar->value() -_scrollBar->maximum() , - 0); + // terminal program wants notification of mouse activity + + int charLine; + int charColumn; + getCharacterPosition (ev->pos (), charLine, charColumn); + + emit mouseSignal (ev->delta () > 0 ? 4 : 5, + charColumn + 1, + charLine + 1 + _scrollBar->value () - + _scrollBar->maximum (), 0); } } -void TerminalDisplay::tripleClickTimeout() +void +TerminalDisplay::tripleClickTimeout () { - _possibleTripleClick=false; + _possibleTripleClick = false; } -void TerminalDisplay::mouseTripleClickEvent(QMouseEvent* ev) +void +TerminalDisplay::mouseTripleClickEvent (QMouseEvent * ev) { - if ( !_screenWindow ) return; - - int charLine; - int charColumn; - getCharacterPosition(ev->pos(),charLine,charColumn); - _iPntSel = QPoint(charColumn,charLine); - - _screenWindow->clearSelection(); - - _lineSelectionMode = true; - _wordSelectionMode = false; - - _actSel = 2; // within selection - emit isBusySelecting(true); // Keep it steady... - - while (_iPntSel.y()>0 && (_lineProperties[_iPntSel.y()-1] & LINE_WRAPPED) ) - _iPntSel.ry()--; - - if (_tripleClickMode == SelectForwardsFromCursor) { - // find word boundary start - int i = loc(_iPntSel.x(),_iPntSel.y()); - QChar selClass = charClass(_image[i].character); - int x = _iPntSel.x(); - - while ( ((x>0) || - (_iPntSel.y()>0 && (_lineProperties[_iPntSel.y()-1] & LINE_WRAPPED) ) - ) - && charClass(_image[i-1].character) == selClass ) - { - i--; - if (x>0) - x--; - else - { - x=_columns-1; - _iPntSel.ry()--; - } - } - - _screenWindow->setSelectionStart( x , _iPntSel.y() , false ); - _tripleSelBegin = QPoint( x, _iPntSel.y() ); + if (!_screenWindow) + return; + + int charLine; + int charColumn; + getCharacterPosition (ev->pos (), charLine, charColumn); + _iPntSel = QPoint (charColumn, charLine); + + _screenWindow->clearSelection (); + + _lineSelectionMode = true; + _wordSelectionMode = false; + + _actSel = 2; // within selection + emit isBusySelecting (true); // Keep it steady... + + while (_iPntSel.y () > 0 + && (_lineProperties[_iPntSel.y () - 1] & LINE_WRAPPED)) + _iPntSel.ry ()--; + + if (_tripleClickMode == SelectForwardsFromCursor) + { + // find word boundary start + int i = loc (_iPntSel.x (), _iPntSel.y ()); + QChar selClass = charClass (_image[i].character); + int x = _iPntSel.x (); + + while (((x > 0) || + (_iPntSel.y () > 0 + && (_lineProperties[_iPntSel.y () - 1] & LINE_WRAPPED))) + && charClass (_image[i - 1].character) == selClass) + { + i--; + if (x > 0) + x--; + else + { + x = _columns - 1; + _iPntSel.ry ()--; + } + } + + _screenWindow->setSelectionStart (x, _iPntSel.y (), false); + _tripleSelBegin = QPoint (x, _iPntSel.y ()); } - else if (_tripleClickMode == SelectWholeLine) { - _screenWindow->setSelectionStart( 0 , _iPntSel.y() , false ); - _tripleSelBegin = QPoint( 0, _iPntSel.y() ); + else if (_tripleClickMode == SelectWholeLine) + { + _screenWindow->setSelectionStart (0, _iPntSel.y (), false); + _tripleSelBegin = QPoint (0, _iPntSel.y ()); } - while (_iPntSel.y()<_lines-1 && (_lineProperties[_iPntSel.y()] & LINE_WRAPPED) ) - _iPntSel.ry()++; - - _screenWindow->setSelectionEnd( _columns - 1 , _iPntSel.y() ); - - setSelection(_screenWindow->selectedText(_preserveLineBreaks)); - - _iPntSel.ry() += _scrollBar->value(); + while (_iPntSel.y () < _lines - 1 + && (_lineProperties[_iPntSel.y ()] & LINE_WRAPPED)) + _iPntSel.ry ()++; + + _screenWindow->setSelectionEnd (_columns - 1, _iPntSel.y ()); + + setSelection (_screenWindow->selectedText (_preserveLineBreaks)); + + _iPntSel.ry () += _scrollBar->value (); } -bool TerminalDisplay::focusNextPrevChild( bool next ) +bool +TerminalDisplay::focusNextPrevChild (bool next) { - if (next) - return false; // This disables changing the active part in konqueror - // when pressing Tab - return QWidget::focusNextPrevChild( next ); + if (next) + return false; // This disables changing the active part in konqueror + // when pressing Tab + return QWidget::focusNextPrevChild (next); } -QChar TerminalDisplay::charClass(QChar qch) const -{ - if ( qch.isSpace() ) return ' '; - - if ( qch.isLetterOrNumber() || _wordCharacters.contains(qch, Qt::CaseInsensitive ) ) - return 'a'; - - return qch; -} - -void TerminalDisplay::setWordCharacters(const QString& wc) +QChar +TerminalDisplay::charClass (QChar qch) const { - _wordCharacters = wc; + if (qch.isSpace ()) + return ' '; + + if (qch.isLetterOrNumber () + || _wordCharacters.contains (qch, Qt::CaseInsensitive)) + return 'a'; + + return qch; } -void TerminalDisplay::setUsesMouse(bool on) +void +TerminalDisplay::setWordCharacters (const QString & wc) { - _mouseMarks = on; - setCursor( _mouseMarks ? Qt::IBeamCursor : Qt::ArrowCursor ); + _wordCharacters = wc; } -bool TerminalDisplay::usesMouse() const + +void +TerminalDisplay::setUsesMouse (bool on) { - return _mouseMarks; + _mouseMarks = on; + setCursor (_mouseMarks ? Qt::IBeamCursor : Qt::ArrowCursor); +} + +bool +TerminalDisplay::usesMouse () const +{ + return _mouseMarks; } /* ------------------------------------------------------------------------- */ @@ -2402,49 +2622,55 @@ #undef KeyPress -void TerminalDisplay::emitSelection(bool useXselection,bool appendReturn) +void +TerminalDisplay::emitSelection (bool useXselection, bool appendReturn) { - if ( !_screenWindow ) - return; - - // Paste Clipboard by simulating keypress events - QString text = QApplication::clipboard()->text(useXselection ? QClipboard::Selection : - QClipboard::Clipboard); - if(appendReturn) - text.append("\r"); - if ( ! text.isEmpty() ) + if (!_screenWindow) + return; + + // Paste Clipboard by simulating keypress events + QString text = + QApplication::clipboard ()-> + text (useXselection ? QClipboard::Selection : QClipboard::Clipboard); + if (appendReturn) + text.append ("\r"); + if (!text.isEmpty ()) { - text.replace('\n', '\r'); - QKeyEvent e(QEvent::KeyPress, 0, Qt::NoModifier, text); - emit keyPressedSignal(&e); // expose as a big fat keypress event - - _screenWindow->clearSelection(); + text.replace ('\n', '\r'); + QKeyEvent e (QEvent::KeyPress, 0, Qt::NoModifier, text); + emit keyPressedSignal (&e); // expose as a big fat keypress event + + _screenWindow->clearSelection (); } } -void TerminalDisplay::setSelection(const QString& t) +void +TerminalDisplay::setSelection (const QString & t) { - QApplication::clipboard()->setText(t, QClipboard::Selection); + QApplication::clipboard ()->setText (t, QClipboard::Selection); } -void TerminalDisplay::copyClipboard() +void +TerminalDisplay::copyClipboard () { - if ( !_screenWindow ) - return; - - QString text = _screenWindow->selectedText(_preserveLineBreaks); - if (!text.isEmpty()) - QApplication::clipboard()->setText(text); + if (!_screenWindow) + return; + + QString text = _screenWindow->selectedText (_preserveLineBreaks); + if (!text.isEmpty ()) + QApplication::clipboard ()->setText (text); } -void TerminalDisplay::pasteClipboard() +void +TerminalDisplay::pasteClipboard () { - emitSelection(false,false); + emitSelection (false, false); } -void TerminalDisplay::pasteSelection() +void +TerminalDisplay::pasteSelection () { - emitSelection(true,false); + emitSelection (true, false); } /* ------------------------------------------------------------------------- */ @@ -2453,165 +2679,178 @@ /* */ /* ------------------------------------------------------------------------- */ -void TerminalDisplay::setFlowControlWarningEnabled( bool enable ) +void +TerminalDisplay::setFlowControlWarningEnabled (bool enable) +{ + _flowControlWarningEnabled = enable; + + // if the dialog is currently visible and the flow control warning has + // been disabled then hide the dialog + if (!enable) + outputSuspended (false); +} + +void +TerminalDisplay::keyPressEvent (QKeyEvent * event) { - _flowControlWarningEnabled = enable; - - // if the dialog is currently visible and the flow control warning has - // been disabled then hide the dialog - if (!enable) - outputSuspended(false); -} - -void TerminalDisplay::keyPressEvent( QKeyEvent* event ) -{ - bool emitKeyPressSignal = true; - - if(event->modifiers() == Qt::ControlModifier) + bool emitKeyPressSignal = true; + + if (event->modifiers () == Qt::ControlModifier) + { + switch (event->key ()) + { + case Qt::Key_C: + copyClipboard (); + break; + case Qt::Key_V: + pasteClipboard (); + break; + }; + } + else if (event->modifiers () == Qt::ShiftModifier) { - switch(event->key()) { - case Qt::Key_C: - copyClipboard(); - break; - case Qt::Key_V: - pasteClipboard(); - break; - }; - } else if ( event->modifiers() == Qt::ShiftModifier ) { - bool update = true; - - if ( event->key() == Qt::Key_PageUp ) - { - _screenWindow->scrollBy( ScreenWindow::ScrollPages , -1 ); - } - else if ( event->key() == Qt::Key_PageDown ) - { - _screenWindow->scrollBy( ScreenWindow::ScrollPages , 1 ); - } - else if ( event->key() == Qt::Key_Up ) - { - _screenWindow->scrollBy( ScreenWindow::ScrollLines , -1 ); - } - else if ( event->key() == Qt::Key_Down ) - { - _screenWindow->scrollBy( ScreenWindow::ScrollLines , 1 ); - } - else - update = false; - - if ( update ) - { - _screenWindow->setTrackOutput( _screenWindow->atEndOfOutput() ); - - updateLineProperties(); - updateImage(); - - // do not send key press to terminal - emitKeyPressSignal = false; - } + bool update = true; + + if (event->key () == Qt::Key_PageUp) + { + _screenWindow->scrollBy (ScreenWindow::ScrollPages, -1); + } + else if (event->key () == Qt::Key_PageDown) + { + _screenWindow->scrollBy (ScreenWindow::ScrollPages, 1); + } + else if (event->key () == Qt::Key_Up) + { + _screenWindow->scrollBy (ScreenWindow::ScrollLines, -1); + } + else if (event->key () == Qt::Key_Down) + { + _screenWindow->scrollBy (ScreenWindow::ScrollLines, 1); + } + else + update = false; + + if (update) + { + _screenWindow->setTrackOutput (_screenWindow->atEndOfOutput ()); + + updateLineProperties (); + updateImage (); + + // do not send key press to terminal + emitKeyPressSignal = false; + } } - _actSel=0; // Key stroke implies a screen update, so TerminalDisplay won't - // know where the current selection is. - - if (_hasBlinkingCursor) + _actSel = 0; // Key stroke implies a screen update, so TerminalDisplay won't + // know where the current selection is. + + if (_hasBlinkingCursor) { - _blinkCursorTimer->start(QApplication::cursorFlashTime() / 2); - if (_cursorBlinking) - blinkCursorEvent(); - else - _cursorBlinking = false; + _blinkCursorTimer->start (QApplication::cursorFlashTime () / 2); + if (_cursorBlinking) + blinkCursorEvent (); + else + _cursorBlinking = false; } - if ( emitKeyPressSignal ) - emit keyPressedSignal(event); - - event->accept(); + if (emitKeyPressSignal) + emit keyPressedSignal (event); + + event->accept (); } -void TerminalDisplay::inputMethodEvent( QInputMethodEvent* event ) +void +TerminalDisplay::inputMethodEvent (QInputMethodEvent * event) { - QKeyEvent keyEvent(QEvent::KeyPress,0,(Qt::KeyboardModifiers)Qt::NoModifier,event->commitString()); - emit keyPressedSignal(&keyEvent); - - _inputMethodData.preeditString = event->preeditString(); - update(preeditRect() | _inputMethodData.previousPreeditRect); - - event->accept(); + QKeyEvent keyEvent (QEvent::KeyPress, 0, + (Qt::KeyboardModifiers) Qt::NoModifier, + event->commitString ()); + emit keyPressedSignal (&keyEvent); + + _inputMethodData.preeditString = event->preeditString (); + update (preeditRect () | _inputMethodData.previousPreeditRect); + + event->accept (); } -QVariant TerminalDisplay::inputMethodQuery( Qt::InputMethodQuery query ) const + +QVariant +TerminalDisplay::inputMethodQuery (Qt::InputMethodQuery query) const { - const QPoint cursorPos = _screenWindow ? _screenWindow->cursorPosition() : QPoint(0,0); - switch ( query ) + const QPoint cursorPos = + _screenWindow ? _screenWindow->cursorPosition () : QPoint (0, 0); + switch (query) { case Qt::ImMicroFocus: - return imageToWidget(QRect(cursorPos.x(),cursorPos.y(),1,1)); - break; + return imageToWidget (QRect (cursorPos.x (), cursorPos.y (), 1, 1)); + break; case Qt::ImFont: - return font(); - break; + return font (); + break; case Qt::ImCursorPosition: - // return the cursor position within the current line - return cursorPos.x(); - break; + // return the cursor position within the current line + return cursorPos.x (); + break; case Qt::ImSurroundingText: - { - // return the text from the current line - QString lineText; - QTextStream stream(&lineText); - PlainTextDecoder decoder; - decoder.begin(&stream); - decoder.decodeLine(&_image[loc(0,cursorPos.y())],_usedColumns,_lineProperties[cursorPos.y()]); - decoder.end(); - return lineText; + { + // return the text from the current line + QString lineText; + QTextStream stream (&lineText); + PlainTextDecoder decoder; + decoder.begin (&stream); + decoder.decodeLine (&_image[loc (0, cursorPos.y ())], _usedColumns, + _lineProperties[cursorPos.y ()]); + decoder.end (); + return lineText; + } + break; + case Qt::ImCurrentSelection: + return QString (); + break; + default: + break; } - break; - case Qt::ImCurrentSelection: - return QString(); - break; - default: - break; - } - - return QVariant(); + + return QVariant (); } -bool TerminalDisplay::handleShortcutOverrideEvent(QKeyEvent* keyEvent) +bool +TerminalDisplay::handleShortcutOverrideEvent (QKeyEvent * keyEvent) { - int modifiers = keyEvent->modifiers(); - - // When a possible shortcut combination is pressed, - // emit the overrideShortcutCheck() signal to allow the host - // to decide whether the terminal should override it or not. - if (modifiers != Qt::NoModifier) + int modifiers = keyEvent->modifiers (); + + // When a possible shortcut combination is pressed, + // emit the overrideShortcutCheck() signal to allow the host + // to decide whether the terminal should override it or not. + if (modifiers != Qt::NoModifier) { - int modifierCount = 0; - unsigned int currentModifier = Qt::ShiftModifier; - - while (currentModifier <= Qt::KeypadModifier) - { - if (modifiers & currentModifier) - modifierCount++; - currentModifier <<= 1; - } - if (modifierCount < 2) - { - bool override = false; - emit overrideShortcutCheck(keyEvent,override); - if (override) - { - keyEvent->accept(); - return true; - } - } + int modifierCount = 0; + unsigned int currentModifier = Qt::ShiftModifier; + + while (currentModifier <= Qt::KeypadModifier) + { + if (modifiers & currentModifier) + modifierCount++; + currentModifier <<= 1; + } + if (modifierCount < 2) + { + bool override = false; + emit overrideShortcutCheck (keyEvent, override); + if (override) + { + keyEvent->accept (); + return true; + } + } } - // Override any of the following shortcuts because - // they are needed by the terminal - int keyCode = keyEvent->key() | modifiers; - switch ( keyCode ) + // Override any of the following shortcuts because + // they are needed by the terminal + int keyCode = keyEvent->key () | modifiers; + switch (keyCode) { - // list is taken from the QLineEdit::event() code + // list is taken from the QLineEdit::event() code case Qt::Key_Tab: case Qt::Key_Delete: case Qt::Key_Home: @@ -2619,187 +2858,208 @@ case Qt::Key_Backspace: case Qt::Key_Left: case Qt::Key_Right: - keyEvent->accept(); - return true; + keyEvent->accept (); + return true; } - return false; + return false; } -bool TerminalDisplay::event(QEvent* event) +bool +TerminalDisplay::event (QEvent * event) { - bool eventHandled = false; - switch (event->type()) + bool eventHandled = false; + switch (event->type ()) { case QEvent::ShortcutOverride: - eventHandled = handleShortcutOverrideEvent((QKeyEvent*)event); - break; + eventHandled = handleShortcutOverrideEvent ((QKeyEvent *) event); + break; case QEvent::PaletteChange: case QEvent::ApplicationPaletteChange: - _scrollBar->setPalette( QApplication::palette() ); - break; + _scrollBar->setPalette (QApplication::palette ()); + break; default: - break; + break; } - return eventHandled ? true : QWidget::event(event); + return eventHandled ? true : QWidget::event (event); } -void TerminalDisplay::setBellMode(int mode) +void +TerminalDisplay::setBellMode (int mode) { - _bellMode=mode; + _bellMode = mode; } -void TerminalDisplay::enableBell() +void +TerminalDisplay::enableBell () { - _allowBell = true; + _allowBell = true; } -void TerminalDisplay::bell(const QString& message) +void +TerminalDisplay::bell (const QString & message) { - Q_UNUSED(message); - if (_bellMode==NoBell) return; - - //limit the rate at which bells can occur - //...mainly for sound effects where rapid bells in sequence - //produce a horrible noise - if ( _allowBell ) + Q_UNUSED (message); + if (_bellMode == NoBell) + return; + + //limit the rate at which bells can occur + //...mainly for sound effects where rapid bells in sequence + //produce a horrible noise + if (_allowBell) { - _allowBell = false; - QTimer::singleShot(500,this,SLOT(enableBell())); - - if (_bellMode==SystemBeepBell) - { - // TODO: This will need added back in at some point - //KNotification::beep(); - } - else if (_bellMode==NotifyBell) - { - // TODO: This will need added back in at some point - //KNotification::event("BellVisible", message,QPixmap(),this); - } - else if (_bellMode==VisualBell) - { - swapColorTable(); - QTimer::singleShot(200,this,SLOT(swapColorTable())); - } + _allowBell = false; + QTimer::singleShot (500, this, SLOT (enableBell ())); + + if (_bellMode == SystemBeepBell) + { + // TODO: This will need added back in at some point + //KNotification::beep(); + } + else if (_bellMode == NotifyBell) + { + // TODO: This will need added back in at some point + //KNotification::event("BellVisible", message,QPixmap(),this); + } + else if (_bellMode == VisualBell) + { + swapColorTable (); + QTimer::singleShot (200, this, SLOT (swapColorTable ())); + } } } -void TerminalDisplay::swapColorTable() +void +TerminalDisplay::swapColorTable () { - ColorEntry color = _colorTable[1]; - _colorTable[1]=_colorTable[0]; - _colorTable[0]= color; - _colorsInverted = !_colorsInverted; - update(); + ColorEntry color = _colorTable[1]; + _colorTable[1] = _colorTable[0]; + _colorTable[0] = color; + _colorsInverted = !_colorsInverted; + update (); } -void TerminalDisplay::clearImage() +void +TerminalDisplay::clearImage () { - // We initialize _image[_imageSize] too. See makeImage() - for (int i = 0; i <= _imageSize; i++) + // We initialize _image[_imageSize] too. See makeImage() + for (int i = 0; i <= _imageSize; i++) { - _image[i].character = ' '; - _image[i].foregroundColor = CharacterColor(COLOR_SPACE_DEFAULT, - DEFAULT_FORE_COLOR); - _image[i].backgroundColor = CharacterColor(COLOR_SPACE_DEFAULT, - DEFAULT_BACK_COLOR); - _image[i].rendition = DEFAULT_RENDITION; + _image[i].character = ' '; + _image[i].foregroundColor = CharacterColor (COLOR_SPACE_DEFAULT, + DEFAULT_FORE_COLOR); + _image[i].backgroundColor = CharacterColor (COLOR_SPACE_DEFAULT, + DEFAULT_BACK_COLOR); + _image[i].rendition = DEFAULT_RENDITION; } } -void TerminalDisplay::calcGeometry() +void +TerminalDisplay::calcGeometry () { - _scrollBar->resize(_scrollBar->sizeHint().width(), contentsRect().height()); - switch(_scrollbarLocation) + _scrollBar->resize (_scrollBar->sizeHint ().width (), + contentsRect ().height ()); + switch (_scrollbarLocation) { - case NoScrollBar : - _leftMargin = DEFAULT_LEFT_MARGIN; - _contentWidth = contentsRect().width() - 2 * DEFAULT_LEFT_MARGIN; - break; - case ScrollBarLeft : - _leftMargin = DEFAULT_LEFT_MARGIN + _scrollBar->width(); - _contentWidth = contentsRect().width() - 2 * DEFAULT_LEFT_MARGIN - _scrollBar->width(); - _scrollBar->move(contentsRect().topLeft()); - break; + case NoScrollBar: + _leftMargin = DEFAULT_LEFT_MARGIN; + _contentWidth = contentsRect ().width () - 2 * DEFAULT_LEFT_MARGIN; + break; + case ScrollBarLeft: + _leftMargin = DEFAULT_LEFT_MARGIN + _scrollBar->width (); + _contentWidth = + contentsRect ().width () - 2 * DEFAULT_LEFT_MARGIN - + _scrollBar->width (); + _scrollBar->move (contentsRect ().topLeft ()); + break; case ScrollBarRight: - _leftMargin = DEFAULT_LEFT_MARGIN; - _contentWidth = contentsRect().width() - 2 * DEFAULT_LEFT_MARGIN - _scrollBar->width(); - _scrollBar->move(contentsRect().topRight() - QPoint(_scrollBar->width()-1,0)); - break; + _leftMargin = DEFAULT_LEFT_MARGIN; + _contentWidth = + contentsRect ().width () - 2 * DEFAULT_LEFT_MARGIN - + _scrollBar->width (); + _scrollBar->move (contentsRect ().topRight () - + QPoint (_scrollBar->width () - 1, 0)); + break; } - _topMargin = DEFAULT_TOP_MARGIN; - _contentHeight = contentsRect().height() - 2 * DEFAULT_TOP_MARGIN + /* mysterious */ 1; - - if (!_isFixedSize) + _topMargin = DEFAULT_TOP_MARGIN; + _contentHeight = + contentsRect ().height () - 2 * DEFAULT_TOP_MARGIN + /* mysterious */ 1; + + if (!_isFixedSize) { - // ensure that display is always at least one column wide - _columns = qMax(1,_contentWidth / _fontWidth); - _usedColumns = qMin(_usedColumns,_columns); - - // ensure that display is always at least one line high - _lines = qMax(1,_contentHeight / _fontHeight); - _usedLines = qMin(_usedLines,_lines); + // ensure that display is always at least one column wide + _columns = qMax (1, _contentWidth / _fontWidth); + _usedColumns = qMin (_usedColumns, _columns); + + // ensure that display is always at least one line high + _lines = qMax (1, _contentHeight / _fontHeight); + _usedLines = qMin (_usedLines, _lines); } } -void TerminalDisplay::makeImage() +void +TerminalDisplay::makeImage () { - calcGeometry(); - - // confirm that array will be of non-zero size, since the painting code - // assumes a non-zero array length - Q_ASSERT( _lines > 0 && _columns > 0 ); - Q_ASSERT( _usedLines <= _lines && _usedColumns <= _columns ); - - _imageSize=_lines*_columns; - - // We over-commit one character so that we can be more relaxed in dealing with - // certain boundary conditions: _image[_imageSize] is a valid but unused position - _image = new Character[_imageSize+1]; - - clearImage(); + calcGeometry (); + + // confirm that array will be of non-zero size, since the painting code + // assumes a non-zero array length + Q_ASSERT (_lines > 0 && _columns > 0); + Q_ASSERT (_usedLines <= _lines && _usedColumns <= _columns); + + _imageSize = _lines * _columns; + + // We over-commit one character so that we can be more relaxed in dealing with + // certain boundary conditions: _image[_imageSize] is a valid but unused position + _image = new Character[_imageSize + 1]; + + clearImage (); } // calculate the needed size, this must be synced with calcGeometry() -void TerminalDisplay::setSize(int columns, int lines) +void +TerminalDisplay::setSize (int columns, int lines) { - int scrollBarWidth = _scrollBar->isHidden() ? 0 : _scrollBar->sizeHint().width(); - int horizontalMargin = 2 * DEFAULT_LEFT_MARGIN; - int verticalMargin = 2 * DEFAULT_TOP_MARGIN; - - QSize newSize = QSize( horizontalMargin + scrollBarWidth + (columns * _fontWidth) , - verticalMargin + (lines * _fontHeight) ); - - if ( newSize != size() ) + int scrollBarWidth = + _scrollBar->isHidden ()? 0 : _scrollBar->sizeHint ().width (); + int horizontalMargin = 2 * DEFAULT_LEFT_MARGIN; + int verticalMargin = 2 * DEFAULT_TOP_MARGIN; + + QSize newSize = + QSize (horizontalMargin + scrollBarWidth + (columns * _fontWidth), + verticalMargin + (lines * _fontHeight)); + + if (newSize != size ()) { - _size = newSize; - updateGeometry(); + _size = newSize; + updateGeometry (); } } -void TerminalDisplay::setFixedSize(int cols, int lins) +void +TerminalDisplay::setFixedSize (int cols, int lins) { - _isFixedSize = true; - - //ensure that display is at least one line by one column in size - _columns = qMax(1,cols); - _lines = qMax(1,lins); - _usedColumns = qMin(_usedColumns,_columns); - _usedLines = qMin(_usedLines,_lines); - - if (_image) + _isFixedSize = true; + + //ensure that display is at least one line by one column in size + _columns = qMax (1, cols); + _lines = qMax (1, lins); + _usedColumns = qMin (_usedColumns, _columns); + _usedLines = qMin (_usedLines, _lines); + + if (_image) { - delete[] _image; - makeImage(); + delete[]_image; + makeImage (); } - setSize(cols, lins); - QWidget::setFixedSize(_size); + setSize (cols, lins); + QWidget::setFixedSize (_size); } -QSize TerminalDisplay::sizeHint() const +QSize +TerminalDisplay::sizeHint () const { - return _size; + return _size; } @@ -2809,168 +3069,176 @@ /* */ /* --------------------------------------------------------------------- */ -void TerminalDisplay::dragEnterEvent(QDragEnterEvent* event) +void +TerminalDisplay::dragEnterEvent (QDragEnterEvent * event) { - if (event->mimeData()->hasFormat("text/plain")) - event->acceptProposedAction(); + if (event->mimeData ()->hasFormat ("text/plain")) + event->acceptProposedAction (); } -void TerminalDisplay::dropEvent(QDropEvent* event) +void +TerminalDisplay::dropEvent (QDropEvent * event) { - //KUrl::List urls = KUrl::List::fromMimeData(event->mimeData()); - - QString dropText; - /* - if (!urls.isEmpty()) - { - for ( int i = 0 ; i < urls.count() ; i++ ) + //KUrl::List urls = KUrl::List::fromMimeData(event->mimeData()); + + QString dropText; + /* + if (!urls.isEmpty()) + { + for ( int i = 0 ; i < urls.count() ; i++ ) + { + KUrl url = KIO::NetAccess::mostLocalUrl( urls[i] , 0 ); + QString urlText; + + if (url.isLocalFile()) + urlText = url.path(); + else + urlText = url.url(); + + // in future it may be useful to be able to insert file names with drag-and-drop + // without quoting them (this only affects paths with spaces in) + urlText = KShell::quoteArg(urlText); + + dropText += urlText; + + if ( i != urls.count()-1 ) + dropText += ' '; + } + } + else + { + dropText = event->mimeData()->text(); + } + */ + + if (event->mimeData ()->hasFormat ("text/plain")) { - KUrl url = KIO::NetAccess::mostLocalUrl( urls[i] , 0 ); - QString urlText; - - if (url.isLocalFile()) - urlText = url.path(); - else - urlText = url.url(); - - // in future it may be useful to be able to insert file names with drag-and-drop - // without quoting them (this only affects paths with spaces in) - urlText = KShell::quoteArg(urlText); - - dropText += urlText; - - if ( i != urls.count()-1 ) - dropText += ' '; - } - } - else - { - dropText = event->mimeData()->text(); - } - */ - - if(event->mimeData()->hasFormat("text/plain")) - { - emit sendStringToEmu(dropText.toLocal8Bit()); + emit sendStringToEmu (dropText.toLocal8Bit ()); } } -void TerminalDisplay::doDrag() +void +TerminalDisplay::doDrag () { - dragInfo.state = diDragging; - dragInfo.dragObject = new QDrag(this); - QMimeData *mimeData = new QMimeData; - mimeData->setText(QApplication::clipboard()->text(QClipboard::Selection)); - dragInfo.dragObject->setMimeData(mimeData); - dragInfo.dragObject->start(Qt::CopyAction); - // Don't delete the QTextDrag object. Qt will delete it when it's done with it. + dragInfo.state = diDragging; + dragInfo.dragObject = new QDrag (this); + QMimeData *mimeData = new QMimeData; + mimeData->setText (QApplication::clipboard ()-> + text (QClipboard::Selection)); + dragInfo.dragObject->setMimeData (mimeData); + dragInfo.dragObject->start (Qt::CopyAction); + // Don't delete the QTextDrag object. Qt will delete it when it's done with it. } -void TerminalDisplay::outputSuspended(bool suspended) +void +TerminalDisplay::outputSuspended (bool suspended) { - //create the label when this function is first called - if (!_outputSuspendedLabel) + //create the label when this function is first called + if (!_outputSuspendedLabel) { - //This label includes a link to an English language website - //describing the 'flow control' (Xon/Xoff) feature found in almost - //all terminal emulators. - //If there isn't a suitable article available in the target language the link - //can simply be removed. - _outputSuspendedLabel = new QLabel( QString("<qt>Output has been " - "<a href=\"http://en.wikipedia.org/wiki/Flow_control\">suspended</a>" - " by pressing Ctrl+S." - " Press <b>Ctrl+Q</b> to resume.</qt>"), - this ); - - QPalette palette(_outputSuspendedLabel->palette()); - //KColorScheme::adjustBackground(palette,KColorScheme::NeutralBackground); - _outputSuspendedLabel->setPalette(palette); - _outputSuspendedLabel->setAutoFillBackground(true); - _outputSuspendedLabel->setBackgroundRole(QPalette::Base); - _outputSuspendedLabel->setFont(QApplication::font()); - _outputSuspendedLabel->setContentsMargins(5, 5, 5, 5); - - //enable activation of "Xon/Xoff" link in label - _outputSuspendedLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse | - Qt::LinksAccessibleByKeyboard); - _outputSuspendedLabel->setOpenExternalLinks(true); - _outputSuspendedLabel->setVisible(false); - - _gridLayout->addWidget(_outputSuspendedLabel); - _gridLayout->addItem( new QSpacerItem(0,0,QSizePolicy::Expanding, - QSizePolicy::Expanding), - 1,0); + //This label includes a link to an English language website + //describing the 'flow control' (Xon/Xoff) feature found in almost + //all terminal emulators. + //If there isn't a suitable article available in the target language the link + //can simply be removed. + _outputSuspendedLabel = new QLabel (QString ("<qt>Output has been " + "<a href=\"http://en.wikipedia.org/wiki/Flow_control\">suspended</a>" + " by pressing Ctrl+S." + " Press <b>Ctrl+Q</b> to resume.</qt>"), + this); + + QPalette palette (_outputSuspendedLabel->palette ()); + //KColorScheme::adjustBackground(palette,KColorScheme::NeutralBackground); + _outputSuspendedLabel->setPalette (palette); + _outputSuspendedLabel->setAutoFillBackground (true); + _outputSuspendedLabel->setBackgroundRole (QPalette::Base); + _outputSuspendedLabel->setFont (QApplication::font ()); + _outputSuspendedLabel->setContentsMargins (5, 5, 5, 5); + + //enable activation of "Xon/Xoff" link in label + _outputSuspendedLabel-> + setTextInteractionFlags (Qt::LinksAccessibleByMouse | Qt:: + LinksAccessibleByKeyboard); + _outputSuspendedLabel->setOpenExternalLinks (true); + _outputSuspendedLabel->setVisible (false); + + _gridLayout->addWidget (_outputSuspendedLabel); + _gridLayout->addItem (new QSpacerItem (0, 0, QSizePolicy::Expanding, + QSizePolicy::Expanding), 1, 0); } - _outputSuspendedLabel->setVisible(suspended); + _outputSuspendedLabel->setVisible (suspended); } -uint TerminalDisplay::lineSpacing() const -{ - return _lineSpacing; -} - -void TerminalDisplay::setLineSpacing(uint i) +uint +TerminalDisplay::lineSpacing () const { - _lineSpacing = i; - setVTFont(font()); // Trigger an update. + return _lineSpacing; } -AutoScrollHandler::AutoScrollHandler(QWidget* parent) - : QObject(parent) - , _timerId(0) +void +TerminalDisplay::setLineSpacing (uint i) { - //parent->installEventFilter(this); + _lineSpacing = i; + setVTFont (font ()); // Trigger an update. +} + +AutoScrollHandler::AutoScrollHandler (QWidget * parent):QObject (parent), +_timerId (0) +{ + //parent->installEventFilter(this); } -void AutoScrollHandler::timerEvent(QTimerEvent* event) + +void +AutoScrollHandler::timerEvent (QTimerEvent * event) { - if (event->timerId() != _timerId) - return; - - QMouseEvent mouseEvent( QEvent::MouseMove, - widget()->mapFromGlobal(QCursor::pos()), - Qt::NoButton, - Qt::LeftButton, - Qt::NoModifier); - - QApplication::sendEvent(widget(),&mouseEvent); + if (event->timerId () != _timerId) + return; + + QMouseEvent mouseEvent (QEvent::MouseMove, + widget ()->mapFromGlobal (QCursor::pos ()), + Qt::NoButton, Qt::LeftButton, Qt::NoModifier); + + QApplication::sendEvent (widget (), &mouseEvent); } -bool AutoScrollHandler::eventFilter(QObject* watched,QEvent* event) + +bool +AutoScrollHandler::eventFilter (QObject * watched, QEvent * event) { - Q_ASSERT( watched == parent() ); - Q_UNUSED( watched ); - - QMouseEvent* mouseEvent = (QMouseEvent*)event; - switch (event->type()) + Q_ASSERT (watched == parent ()); + Q_UNUSED (watched); + + QMouseEvent *mouseEvent = (QMouseEvent *) event; + switch (event->type ()) { case QEvent::MouseMove: - { - bool mouseInWidget = widget()->rect().contains(mouseEvent->pos()); - - if (mouseInWidget) - { - if (_timerId) - killTimer(_timerId); - _timerId = 0; - } - else - { - if (!_timerId && (mouseEvent->buttons() & Qt::LeftButton)) - _timerId = startTimer(100); - } - break; - } + { + bool mouseInWidget = widget ()->rect ().contains (mouseEvent->pos ()); + + if (mouseInWidget) + { + if (_timerId) + killTimer (_timerId); + _timerId = 0; + } + else + { + if (!_timerId && (mouseEvent->buttons () & Qt::LeftButton)) + _timerId = startTimer (100); + } + break; + } case QEvent::MouseButtonRelease: - if (_timerId && (mouseEvent->buttons() & ~Qt::LeftButton)) - { - killTimer(_timerId); - _timerId = 0; - } - break; + if (_timerId && (mouseEvent->buttons () & ~Qt::LeftButton)) + { + killTimer (_timerId); + _timerId = 0; + } + break; default: - break; + break; }; - return false; + return false; }