Mercurial > hg > octave-terminal
changeset 15669:a8ff19a82906 draft
Added copy&paste context menu in the unix implementation.
author | Jacob Dawid <jacob.dawid@googlemail.com> |
---|---|
date | Mon, 28 May 2012 02:14:59 +0200 |
parents | f2b81e8a4ab5 |
children | d79d1a3130c8 |
files | libqterminal/QTerminalInterface.h libqterminal/unix/QUnixTerminalImpl.cpp libqterminal/unix/TerminalView.cpp |
diffstat | 3 files changed, 403 insertions(+), 374 deletions(-) [+] |
line wrap: on
line diff
--- a/libqterminal/QTerminalInterface.h +++ b/libqterminal/QTerminalInterface.h @@ -24,12 +24,25 @@ #define QTERMINALINTERFACE_H #include <QWidget> +#include <QMenu> class QTerminalInterface : public QWidget { Q_OBJECT public: - QTerminalInterface(QWidget *parent = 0) : QWidget(parent) { } + QTerminalInterface(QWidget *parent = 0) : QWidget(parent) { + connect (this, SIGNAL(customContextMenuRequested(QPoint)), + this, SLOT(handleCustomContextMenuRequested(QPoint))); + + setContextMenuPolicy (Qt::CustomContextMenu); + + _contextMenu = new QMenu (this); + QAction *copyAction = _contextMenu->addAction ("Copy"); + QAction *pasteAction = _contextMenu->addAction ("Paste"); + + connect (copyAction, SIGNAL (triggered()), this, SLOT (copyClipboard())); + connect (pasteAction, SIGNAL (triggered()), this, SLOT (pasteClipboard())); + } virtual ~QTerminalInterface() { } virtual void setTerminalFont(const QFont& font) = 0; @@ -39,6 +52,14 @@ public slots: virtual void copyClipboard() = 0; virtual void pasteClipboard() = 0; + + virtual void handleCustomContextMenuRequested(QPoint at) { + _contextMenu->move (mapToGlobal(at)); + _contextMenu->show (); + } + +private: + QMenu *_contextMenu; }; #endif // QTERMINALINTERFACE_H
--- a/libqterminal/unix/QUnixTerminalImpl.cpp +++ b/libqterminal/unix/QUnixTerminalImpl.cpp @@ -35,11 +35,15 @@ m_terminalView = new TerminalView(this); m_terminalView->setBellMode(TerminalView::NotifyBell); m_terminalView->setTerminalSizeHint(true); + m_terminalView->setContextMenuPolicy(Qt::CustomContextMenu); m_terminalView->setTripleClickMode(TerminalView::SelectWholeLine); m_terminalView->setTerminalSizeStartup(true); m_terminalView->setSize(80, 40); m_terminalView->setScrollBarPosition(TerminalView::ScrollBarRight); + connect(m_terminalView, SIGNAL(customContextMenuRequested(QPoint)), + this, SLOT(handleCustomContextMenuRequested(QPoint))); + #ifdef Q_OS_MAC QFont font = QFont("Monaco"); font.setStyleHint(QFont::TypeWriter);
--- a/libqterminal/unix/TerminalView.cpp +++ b/libqterminal/unix/TerminalView.cpp @@ -1,9 +1,9 @@ /* This file is part of Konsole, a terminal emulator for KDE. - + Copyright (C) 2006-7 by Robert Knight <robertknight@gmail.com> Copyright (C) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - + Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 Copyright (C) 2012 Jacob Dawid <jacob.dawid@googlemail.com> @@ -98,7 +98,7 @@ //#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); + window->setWindowLines(_lines); } } @@ -116,8 +116,8 @@ p.setColor( backgroundRole(), _colorTable[DEFAULT_BACK_COLOR].color ); setPalette( p ); - // Avoid propagating the palette change to the scroll bar - _scrollBar->setPalette( QApplication::palette() ); + // Avoid propagating the palette change to the scroll bar + _scrollBar->setPalette( QApplication::palette() ); update(); } @@ -143,9 +143,9 @@ static inline bool isLineChar(quint16 c) { return ((c & 0xFF80) == 0x2500);} static inline bool isLineCharString(const QString& string) { - return (string.length() > 0) && (isLineChar(string.at(0).unicode())); + return (string.length() > 0) && (isLineChar(string.at(0).unicode())); } - + // assert for i in [0..31] : vt100extended(vt100_graphics[i]) == i. @@ -199,14 +199,14 @@ if ( metrics.height() < height() && metrics.maxWidth() < width() ) { - // hint that text should be drawn without anti-aliasing. + // 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 + + // 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. + // Disabling kerning saves some computation when rendering text. font.setKerning(false); QWidget::setFont(font); @@ -283,10 +283,10 @@ // 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); + setScroll(0,0); _scrollBar->setCursor( Qt::ArrowCursor ); - connect(_scrollBar, SIGNAL(valueChanged(int)), this, - SLOT(scrollBarPositionChanged(int))); + connect(_scrollBar, SIGNAL(valueChanged(int)), this, + SLOT(scrollBarPositionChanged(int))); // setup timers for blinking cursor and text _blinkTimer = new QTimer(this); @@ -295,12 +295,12 @@ connect(_blinkCursorTimer, SIGNAL(timeout()), this, SLOT(blinkCursorEvent())); // QCursor::setAutoHideCursor( this, true ); - + setUsesMouse(true); setColorTable(base_color_table); setMouseTracking(true); - // Enable drag and drop + // Enable drag and drop setAcceptDrops(true); // attempt dragInfo.state = diNone; @@ -316,13 +316,13 @@ _gridLayout = new QGridLayout(this); _gridLayout->setMargin(0); - setLayout( _gridLayout ); + setLayout( _gridLayout ); } TerminalView::~TerminalView() { qApp->removeEventFilter( this ); - + delete[] _image; delete _gridLayout; @@ -456,19 +456,19 @@ const Character* attributes) { const QPen& currentPen = painter.pen(); - + if ( attributes->rendition & RE_BOLD ) { QPen boldPen(currentPen); boldPen.setWidth(3); painter.setPen( boldPen ); - } - + } + 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); + if (LineChars[code]) + drawLineChar(painter, x + (_fontWidth*i), y, _fontWidth, _fontHeight, code); } painter.setPen( currentPen ); @@ -505,7 +505,7 @@ // enable automatic background filling to prevent the display // flickering if there is no transparency - if ( color.alpha() == 255 ) + if ( color.alpha() == 255 ) { setAutoFillBackground(true); } @@ -525,15 +525,15 @@ // 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. + // applications. // - QRect scrollBarArea = _scrollBar->isVisible() ? + 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 ( HAVE_TRANSPARENCY && qAlpha(_blendColor) < 0xff && useOpacitySetting ) { QColor color(backgroundColor); color.setAlpha(qAlpha(_blendColor)); @@ -542,10 +542,10 @@ painter.setCompositionMode(QPainter::CompositionMode_Source); painter.fillRect(contentsRect, color); painter.restore(); - } + } else { - painter.fillRect(contentsRect, backgroundColor); - } + painter.fillRect(contentsRect, backgroundColor); + } painter.fillRect(scrollBarArea,_scrollBar->palette().background()); } @@ -558,14 +558,14 @@ { QRect cursorRect = rect; cursorRect.setHeight(_fontHeight - _lineSpacing - 1); - + if (!_cursorBlinking) { if ( _cursorColor.isValid() ) painter.setPen(_cursorColor); else { - painter.setPen(foregroundColor); - } + painter.setPen(foregroundColor); + } if ( _cursorShape == BlockCursor ) { @@ -580,7 +580,7 @@ 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 @@ -599,7 +599,7 @@ cursorRect.top(), cursorRect.left(), cursorRect.bottom()); - + } } @@ -612,13 +612,13 @@ // don't draw text which is currently blinking if ( _blinking && (style->rendition & RE_BLINK) ) return; - + // setup bold and underline bool useBold = style->rendition & RE_BOLD || style->isBold(_colorTable) || font().bold(); bool useUnderline = style->rendition & RE_UNDERLINE || font().underline(); QFont font = painter.font(); - if ( font.bold() != useBold + if ( font.bold() != useBold || font.underline() != useUnderline ) { font.setBold(useBold); @@ -637,30 +637,30 @@ } // draw text if ( isLineCharString(text) ) { - drawLineCharString(painter,rect.x(),rect.y(),text,style); + 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 + { + // 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 painter.drawText(rect,0,text); - } + } } void TerminalView::drawTextFragment(QPainter& painter , const QRect& rect, - const QString& text, + const QString& text, const Character* style) { painter.save(); - // setup painter + // 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 */); @@ -702,20 +702,20 @@ // scrolls the image by 'lines', down if lines > 0 or up otherwise. // -// the terminal emulation keeps track of the scrolling of the character -// image as it receives input, and when the view is updated, it calls scrollImage() -// with the final scroll amount. this improves performance because scrolling the -// display is much cheaper than re-rendering all the text for the -// part of the image which has moved up or down. +// the terminal emulation keeps track of the scrolling of the character +// image as it receives input, and when the view is updated, it calls scrollImage() +// with the final scroll amount. this improves performance because scrolling the +// 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 // -// note: it is important that the area of the display which is -// scrolled aligns properly with the character grid - -// which has a top left point at (_leftMargin,_topMargin) , -// a cell width of _fontWidth and a cell height of _fontHeight). +// note: it is important that the area of the display which is +// scrolled aligns properly with the character grid - +// which has a top left point at (_leftMargin,_topMargin) , +// a cell width of _fontWidth and a cell height of _fontHeight). void TerminalView::scrollImage(int lines , const QRect& screenWindowRegion) { - // if the flow control warning is enabled this will interfere with the + // if the flow control warning is enabled this will interfere with the // scrolling optimisations and cause artifacts. the simple solution here // is to just disable the optimisation whilst it is visible if ( _outputSuspendedLabel && _outputSuspendedLabel->isVisible() ) { @@ -727,12 +727,12 @@ // 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) ); - - if ( lines == 0 + region.setBottom( qMin(region.bottom(),this->_lines-2) ); + + if ( lines == 0 || _image == 0 - || !region.isValid() - || (region.top() + abs(lines)) >= region.bottom() + || !region.isValid() + || (region.top() + abs(lines)) >= region.bottom() || this->_lines <= region.height() ) return; QRect scrollRect; @@ -742,7 +742,7 @@ int top = _topMargin + (region.top() * _fontHeight); int linesToMove = region.height() - abs(lines); - int bytesToMove = linesToMove * + int bytesToMove = linesToMove * this->_columns * sizeof(Character); @@ -753,35 +753,35 @@ if ( lines > 0 ) { // check that the memory areas that we are going to move are valid - Q_ASSERT( (char*)lastCharPos + bytesToMove < + Q_ASSERT( (char*)lastCharPos + bytesToMove < (char*)(_image + (this->_lines * this->_columns)) ); - - Q_ASSERT( (lines*this->_columns) < _imageSize ); + + Q_ASSERT( (lines*this->_columns) < _imageSize ); //scroll internal image down - memmove( firstCharPos , lastCharPos , bytesToMove ); - + memmove( firstCharPos , lastCharPos , bytesToMove ); + //set region of display to scroll, making sure that - //the region aligns correctly to the character grid - scrollRect = QRect( _leftMargin , top, - this->_usedColumns * _fontWidth , + //the region aligns correctly to the character grid + scrollRect = QRect( _leftMargin , top, + this->_usedColumns * _fontWidth , linesToMove * _fontHeight ); } else { // check that the memory areas that we are going to move are valid - Q_ASSERT( (char*)firstCharPos + bytesToMove < + Q_ASSERT( (char*)firstCharPos + bytesToMove < (char*)(_image + (this->_lines * this->_columns)) ); //scroll internal image up - memmove( lastCharPos , firstCharPos , bytesToMove ); - + memmove( lastCharPos , firstCharPos , bytesToMove ); + //set region of the display to scroll, making sure that //the region aligns correctly to the character grid QPoint topPoint( _leftMargin , top + abs(lines)*_fontHeight ); scrollRect = QRect( topPoint , - QSize( this->_usedColumns*_fontWidth , + QSize( this->_usedColumns*_fontWidth , linesToMove * _fontHeight )); } @@ -800,7 +800,7 @@ rect.setRight(hotSpot->endColumn()); rect.setBottom(hotSpot->endLine()); - region |= imageToWidget(rect); + region |= imageToWidget(rect); } return region; } @@ -815,7 +815,7 @@ // 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 + // updateImage() is called on the display and therefore _image is // out of date at this point _filterChain->setImage( _screenWindow->getImage(), _screenWindow->windowLines(), @@ -823,9 +823,9 @@ _screenWindow->getLineProperties() ); _filterChain->process(); - QRegion postUpdateHotSpots = hotSpotRegion(); - - update( preUpdateHotSpots | postUpdateHotSpots ); + QRegion postUpdateHotSpots = hotSpotRegion(); + + update( preUpdateHotSpots | postUpdateHotSpots ); } void TerminalView::updateImage() @@ -834,8 +834,8 @@ return; updateLineProperties(); - // optimization - scroll the existing image where possible and - // avoid expensive text drawing for parts of the image that + // 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() ); @@ -869,7 +869,7 @@ const int columnsToUpdate = qMin(this->_columns,qMax(0,columns)); QChar *disstrU = new QChar[columnsToUpdate]; - char *dirtyMask = new char[columnsToUpdate+2]; + char *dirtyMask = new char[columnsToUpdate+2]; QRegion dirtyRegion; // debugging variable, this records the number of lines that are found to @@ -883,15 +883,15 @@ 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] ) + if ( newLine[x] != currentLine[x] ) { dirtyMask[x] = true; } @@ -901,7 +901,7 @@ 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. @@ -925,13 +925,13 @@ 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 || + 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 || + !dirtyMask[x+len] || + isLineChar(c) != lineDraw || nextIsDoubleWidth != doubleWidth ) break; @@ -946,58 +946,58 @@ if (doubleWidth) _fixedFont = false; - updateLine = true; - - _fixedFont = saveFixedFont; + 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. + //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. + // 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 ); + 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 + // 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 + // outside the new _image is cleared if ( linesToUpdate < _usedLines ) { - dirtyRegion |= QRect( _leftMargin+tLx , - _topMargin+tLy+_fontHeight*linesToUpdate , - _fontWidth * this->_columns , + dirtyRegion |= QRect( _leftMargin+tLx , + _topMargin+tLy+_fontHeight*linesToUpdate , + _fontWidth * this->_columns , _fontHeight * (_usedLines-linesToUpdate) ); } _usedLines = linesToUpdate; - + if ( columnsToUpdate < _usedColumns ) { - dirtyRegion |= QRect( _leftMargin+tLx+columnsToUpdate*_fontWidth , - _topMargin+tLy , - _fontWidth * (_usedColumns-columnsToUpdate) , + dirtyRegion |= QRect( _leftMargin+tLx+columnsToUpdate*_fontWidth , + _topMargin+tLy , + _fontWidth * (_usedColumns-columnsToUpdate) , _fontHeight * this->_lines ); } _usedColumns = columnsToUpdate; @@ -1007,7 +1007,7 @@ // update the parts of the display which have changed update(dirtyRegion); - if ( _hasBlinker && !_blinkTimer->isActive()) _blinkTimer->start( BLINK_DELAY ); + if ( _hasBlinker && !_blinkTimer->isActive()) _blinkTimer->start( BLINK_DELAY ); if (!_hasBlinker && _blinkTimer->isActive()) { _blinkTimer->stop(); _blinking = false; } delete[] dirtyMask; delete[] disstrU; @@ -1019,7 +1019,7 @@ if (_terminalSizeHint && isVisible()) { if (_terminalSizeStartup) { - _terminalSizeStartup=false; + _terminalSizeStartup=false; return; } if (!_resizeWidget) @@ -1027,13 +1027,13 @@ _resizeWidget = new QLabel(("Size: XXX x XXX"), this); _resizeWidget->setMinimumWidth(_resizeWidget->fontMetrics().width(("Size: XXX x XXX"))); _resizeWidget->setMinimumHeight(_resizeWidget->sizeHint().height()); - _resizeWidget->setAlignment(Qt::AlignCenter); + _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())); + connect(_resizeTimer, SIGNAL(timeout()), _resizeWidget, SLOT(hide())); } QString sizeStr; @@ -1049,11 +1049,11 @@ void TerminalView::setBlinkingCursor(bool blink) { _hasBlinkingCursor=blink; - - if (blink && !_blinkCursorTimer->isActive()) + + if (blink && !_blinkCursorTimer->isActive()) _blinkCursorTimer->start(BLINK_DELAY); - - if (!blink && _blinkCursorTimer->isActive()) + + if (!blink && _blinkCursorTimer->isActive()) { _blinkCursorTimer->stop(); if (_cursorBlinking) @@ -1073,10 +1073,10 @@ foreach (QRect rect, (pe->region() & contentsRect()).rects()) { drawBackground(paint,rect,palette().background().color(), true /* use opacity setting */); - drawContents(paint, rect); + drawContents(paint, rect); } // drawBackground(paint,contentsRect(),palette().background().color(), true /* use opacity setting */); -// drawContents(paint, contentsRect()); +// drawContents(paint, contentsRect()); drawInputMethodPreeditString(paint,preeditRect()); paintFilters(paint); @@ -1102,14 +1102,14 @@ _topMargin + _fontHeight*cursorPosition().y(), _fontWidth*preeditLength, _fontHeight); -} +} void TerminalView::drawInputMethodPreeditString(QPainter& painter , const QRect& rect) { if ( _inputMethodData.preeditString.isEmpty() ) { return; } - const QPoint cursorPos = cursorPosition(); + const QPoint cursorPos = cursorPosition(); bool invertColors = false; const QColor background = _colorTable[DEFAULT_BACK_COLOR].color; @@ -1120,7 +1120,7 @@ drawCursor(painter,rect,foreground,background,invertColors); drawCharacters(painter,rect,_inputMethodData.preeditString,style,invertColors); - _inputMethodData.previousPreeditRect = rect; + _inputMethodData.previousPreeditRect = rect; } FilterChain* TerminalView::filterChain() const @@ -1142,7 +1142,7 @@ painter.setPen( QPen(cursorCharacter.foregroundColor.color(colorTable())) ); - // iterate over hotspots identified by the display's currently active filters + // 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(); @@ -1154,14 +1154,14 @@ 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 + 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++; @@ -1177,18 +1177,18 @@ // hotspots // // subtracting one pixel from all sides also prevents an edge case where - // moving the mouse outside a link could still leave it underlined + // 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, line*_fontHeight + 1, - endColumn*_fontWidth - 1, (line+1)*_fontHeight - 1 ); - - // Underline link hotspots + endColumn*_fontWidth - 1, (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(); @@ -1196,7 +1196,7 @@ int underlinePos = baseline + metrics.underlinePos(); if ( r.contains( mapFromGlobal(QCursor::pos()) ) ) - painter.drawLine( r.left() , underlinePos , + painter.drawLine( r.left() , underlinePos , r.right() , underlinePos ); } // Marker hotspots simply have a transparent rectanglular shape @@ -1218,8 +1218,8 @@ int tLy = tL.y(); int tLx = (_contentWidth - _usedColumns * _fontWidth)/2; -// int tLy = (_contentHeight - _usedLines * _fontHeight)/2; -//qDebug("%d %d %d %d", tLx, tLy, _contentWidth, _usedColumns * _fontWidth); +// int tLy = (_contentHeight - _usedLines * _fontHeight)/2; +//qDebug("%d %d %d %d", tLx, tLy, _contentWidth, _usedColumns * _fontWidth); int lux = qMin(_usedColumns-1, qMax(0,(rect.left() - tLx - _leftMargin ) / _fontWidth)); int luy = qMin(_usedLines-1, qMax(0, (rect.top() - tLy - _topMargin ) / _fontHeight)); @@ -1246,7 +1246,7 @@ ushort extendedCharLength = 0; ushort* chars = ExtendedCharTable::instance .lookupExtendedChar(_image[loc(x,y)].charSequence,extendedCharLength); - for ( int index = 0 ; index < extendedCharLength ; index++ ) + for ( int index = 0 ; index < extendedCharLength ; index++ ) { Q_ASSERT( p < bufferSize ); disstrU[p++] = chars[index]; @@ -1268,7 +1268,7 @@ 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 && @@ -1285,66 +1285,66 @@ if ((x+len < _usedColumns) && (!_image[loc(x+len,y)].character)) len++; // Adjust for trailing part of multi-column character - bool save__fixedFont = _fixedFont; + bool save__fixedFont = _fixedFont; if (lineDraw) _fixedFont = false; if (doubleWidth) _fixedFont = false; QString unistr(disstrU,p); - + if (y < _lineProperties.size()) { if (_lineProperties[y] & LINE_DOUBLEWIDTH) { paint.scale(2,1); } - - if (_lineProperties[y] & LINE_DOUBLEHEIGHT) { - paint.scale(1,2); - } - } + + if (_lineProperties[y] & LINE_DOUBLEHEIGHT) { + paint.scale(1,2); + } + } //calculate the area in which the text will be drawn - QRect textArea = QRect( _leftMargin+tLx+_fontWidth*x , - _topMargin+tLy+_fontHeight*y , - _fontWidth*len, + 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) + //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) QMatrix inverted = paint.matrix().inverted(); // textArea.moveTopLeft( inverted.map(textArea.topLeft()) ); textArea.moveCenter( inverted.map(textArea.center()) ); - - //paint text fragment + + //paint text fragment drawTextFragment( paint, - textArea, - unistr, - &_image[loc(x,y)] ); //, - //0, - //!_isPrinting ); - - _fixedFont = save__fixedFont; - - //reset back to single-width, single-height _lines + textArea, + unistr, + &_image[loc(x,y)] ); //, + //0, + //!_isPrinting ); + + _fixedFont = save__fixedFont; + + //reset back to single-width, single-height _lines paint.resetMatrix(); 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 + //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; + + x += len - 1; } } delete [] disstrU; @@ -1354,7 +1354,7 @@ { _blinking = !_blinking; - //TODO: Optimise to only repaint the areas of the widget + //TODO: Optimise to only repaint the areas of the widget // where there is blinking text // rather than repainting the whole widget. update(); @@ -1376,7 +1376,7 @@ { _cursorBlinking = !_cursorBlinking; - QRect cursorRect = imageToWidget( QRect(cursorPosition(),QSize(1,1)) ); + QRect cursorRect = imageToWidget( QRect(cursorPosition(),QSize(1,1)) ); update(cursorRect); } @@ -1415,7 +1415,7 @@ makeImage(); - + // copy the old image to reduce flicker int lines = qMin(oldlin,_lines); int columns = qMin(oldcol,_columns); @@ -1423,7 +1423,7 @@ //qDebug("%s %d updateImageSize", __FILE__, __LINE__); if (oldimg) { - for (int line = 0; line < lines; line++) + for (int line = 0; line < lines; line++) { memcpy((void*)&_image[_columns*line], (void*)&oldimg[oldcol*line],columns*sizeof(Character)); @@ -1433,27 +1433,27 @@ //qDebug("%s %d updateImageSize", __FILE__, __LINE__); if (_screenWindow) - _screenWindow->setWindowLines(_lines); + _screenWindow->setWindowLines(_lines); _resizing = (oldlin!=_lines) || (oldcol!=_columns); if ( _resizing ) { //qDebug("%s %d updateImageSize", __FILE__, __LINE__); - showResizeNotification(); + showResizeNotification(); emit changedContentSizeSignal(_contentHeight, _contentWidth); // expose resizeEvent } //qDebug("%s %d updateImageSize", __FILE__, __LINE__); - + _resizing = false; } -//showEvent and hideEvent are reimplemented here so that it appears to other classes that the +//showEvent and hideEvent are reimplemented here so that it appears to other classes that the //display has been resized when the display is hidden or shown. // -//this allows +//this allows //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 +//the same signal as the one for a content size change void TerminalView::showEvent(QShowEvent*) { emit changedContentSizeSignal(_contentHeight,_contentWidth); @@ -1471,13 +1471,13 @@ void TerminalView::scrollBarPositionChanged(int) { - if ( !_screenWindow ) + 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, + // 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()); @@ -1512,17 +1512,17 @@ void TerminalView::setScrollBarPosition(ScrollBarPosition position) { if (_scrollbarLocation == position) { -// return; +// return; } - + if ( position == NoScrollBar ) _scrollBar->hide(); - else - _scrollBar->show(); + else + _scrollBar->show(); _topMargin = _leftMargin = 1; _scrollbarLocation = position; - + propagateSize(); update(); } @@ -1535,7 +1535,7 @@ } if ( !contentsRect().contains(ev->pos()) ) return; - + if ( !_screenWindow ) return; int charLine; @@ -1551,11 +1551,11 @@ 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 ) { @@ -1578,7 +1578,7 @@ pos.ry() += _scrollBar->value(); _iPntSel = _pntSel = pos; _actSel = 1; // left mouse button pressed but nothing selected yet. - + } else { @@ -1595,16 +1595,18 @@ } else if ( ev->button() == Qt::RightButton ) { - if (_mouseMarks || (ev->modifiers() & Qt::ShiftModifier)) + if (_mouseMarks || (ev->modifiers() & Qt::ShiftModifier)) { - emit configureRequest( this, - ev->modifiers() & (Qt::ShiftModifier|Qt::ControlModifier), + emit configureRequest( this, + ev->modifiers() & (Qt::ShiftModifier|Qt::ControlModifier), ev->pos() ); } else emit mouseSignal( 2, charColumn +1, charLine +1 +_scrollBar->value() -_scrollBar->maximum() , 0); } + + QWidget::mousePressEvent (ev); } QList<QAction*> TerminalView::filterActions(const QPoint& position) @@ -1622,7 +1624,7 @@ int charLine = 0; int charColumn = 0; - getCharacterPosition(ev->pos(),charLine,charColumn); + getCharacterPosition(ev->pos(),charLine,charColumn); // handle filters // change link hot-spot appearance on mouse-over @@ -1651,50 +1653,50 @@ // set hotspot area to an invalid rectangle _mouseOverHotspotArea = QRect(); } - + // for auto-hiding the cursor, we need mouseTracking if (ev->buttons() == Qt::NoButton ) return; - // if the terminal is interested in mouse movements + // 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, + 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; + 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) + 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 @@ -1771,9 +1773,9 @@ int selClass = 0; bool left_not_right = (here.y() < _iPntSelCorr.y() || - (here.y() == _iPntSelCorr.y() && here.x() < _iPntSelCorr.x())); + (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())); + (_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) @@ -1781,16 +1783,16 @@ 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()--; - } - } + 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) @@ -1798,25 +1800,25 @@ 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()++; - } - } + 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; + ohere = right; } else { here = right; - ohere = left; + ohere = left; } ohere.rx()++; } @@ -1830,10 +1832,10 @@ 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); @@ -1841,10 +1843,10 @@ // Pick which is start (ohere) and which is extension (here) if (above_not_below) { here = above; - ohere = below; + ohere = below; } else { here = below; - ohere = above; + ohere = above; } QPoint newSelBegin = QPoint(ohere.x(), ohere.y()); @@ -1860,9 +1862,9 @@ int selClass = 0; bool left_not_right = (here.y() < _iPntSelCorr.y() || - (here.y() == _iPntSelCorr.y() && here.x() < _iPntSelCorr.x())); + (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())); + (_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) @@ -1875,16 +1877,16 @@ 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()++; - } + 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; - } + } } } } @@ -1892,21 +1894,21 @@ // Pick which is start (ohere) and which is extension (here) if (left_not_right) { here = left; - ohere = right; - offset = 0; + ohere = right; + offset = 0; } else { here = right; - ohere = left; - offset = -1; + ohere = left; + offset = -1; } } if ((here == _pntSelCorr) && (scroll == _scrollBar->value())) { - return; // not moved + return; // not moved } if (here == ohere) { - return; // It's not left, it's not right. + return; // It's not left, it's not right. } if (_actSel < 2 || swapping) { @@ -1940,7 +1942,7 @@ if ( ev->button() == Qt::LeftButton) { - emit isBusySelecting(false); + emit isBusySelecting(false); if(dragInfo.state == diPending) { // We had a drag event pending but never confirmed. Kill selection @@ -1967,17 +1969,19 @@ } dragInfo.state = diNone; } - - - if ( !_mouseMarks && + + + if ( !_mouseMarks && ((ev->button() == Qt::RightButton && !(ev->modifiers() & Qt::ShiftModifier)) - || ev->button() == Qt::MidButton) ) + || ev->button() == Qt::MidButton) ) { - emit mouseSignal( 3, - charColumn + 1, - charLine + 1 +_scrollBar->value() -_scrollBar->maximum() , + emit mouseSignal( 3, + charColumn + 1, + charLine + 1 +_scrollBar->value() -_scrollBar->maximum() , 0); } + + QWidget::mouseReleaseEvent(ev); } void TerminalView::getCharacterPosition(const QPoint& widgetPoint,int& line,int& column) const @@ -2005,10 +2009,10 @@ void TerminalView::updateLineProperties() { - if ( !_screenWindow ) + if ( !_screenWindow ) return; - _lineProperties = _screenWindow->getLineProperties(); + _lineProperties = _screenWindow->getLineProperties(); } void TerminalView::mouseDoubleClickEvent(QMouseEvent* ev) @@ -2028,8 +2032,8 @@ { // 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, + emit mouseSignal( 0, + pos.x()+1, pos.y()+1 +_scrollBar->value() -_scrollBar->maximum(), 0 ); // left button return; @@ -2049,17 +2053,17 @@ { // 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 + 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; + x=_usedColumns-1; bgnSel.ry()--; - } + } } bgnSel.setX(x); @@ -2068,17 +2072,17 @@ // 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()++; - } + 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); @@ -2089,10 +2093,10 @@ _actSel = 2; // within selection - + _screenWindow->setSelectionEnd( endSel.x() , endSel.y() ); - - setSelection( _screenWindow->selectedText(_preserveLineBreaks) ); + + setSelection( _screenWindow->selectedText(_preserveLineBreaks) ); } _possibleTripleClick=true; @@ -2113,10 +2117,10 @@ int charLine; int charColumn; getCharacterPosition( ev->pos() , charLine , charColumn ); - - emit mouseSignal( ev->delta() > 0 ? 4 : 5, - charColumn + 1, - charLine + 1 +_scrollBar->value() -_scrollBar->maximum() , + + emit mouseSignal( ev->delta() > 0 ? 4 : 5, + charColumn + 1, + charLine + 1 +_scrollBar->value() -_scrollBar->maximum() , 0); } } @@ -2145,26 +2149,26 @@ 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()); int selClass = charClass(_image[i].character); int x = _iPntSel.x(); - - while ( ((x>0) || + + while ( ((x>0) || (_iPntSel.y()>0 && (_lineProperties[_iPntSel.y()-1] & LINE_WRAPPED) ) - ) + ) && charClass(_image[i-1].character) == selClass ) { - i--; - if (x>0) - x--; - else + i--; + if (x>0) + x--; + else { - x=_columns-1; + x=_columns-1; _iPntSel.ry()--; - } + } } _screenWindow->setSelectionStart( x , _iPntSel.y() , false ); @@ -2177,14 +2181,14 @@ 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(); - emit tripleClicked( _screenWindow->selectedText( _preserveLineBreaks ) ); + emit tripleClicked( _screenWindow->selectedText( _preserveLineBreaks ) ); } @@ -2211,7 +2215,7 @@ void TerminalView::setWordCharacters(const QString& wc) { - _wordCharacters = wc; + _wordCharacters = wc; } void TerminalView::setUsesMouse(bool on) @@ -2234,7 +2238,7 @@ void TerminalView::emitSelection(bool useXselection,bool appendReturn) { - if ( !_screenWindow ) + if ( !_screenWindow ) return; // Paste Clipboard by simulating keypress events @@ -2247,7 +2251,7 @@ text.replace("\n", "\r"); QKeyEvent e(QEvent::KeyPress, 0, Qt::NoModifier, text); emit keyPressedSignal(&e); // expose as a big fat keypress event - + _screenWindow->clearSelection(); } } @@ -2295,33 +2299,33 @@ if ( event->key() == Qt::Key_PageUp ) { - //qDebug("%s %d pageup", __FILE__, __LINE__); + //qDebug("%s %d pageup", __FILE__, __LINE__); _screenWindow->scrollBy( ScreenWindow::ScrollPages , -1 ); } else if ( event->key() == Qt::Key_PageDown ) { - //qDebug("%s %d pagedown", __FILE__, __LINE__); + //qDebug("%s %d pagedown", __FILE__, __LINE__); _screenWindow->scrollBy( ScreenWindow::ScrollPages , 1 ); } else if ( event->key() == Qt::Key_Up ) { - //qDebug("%s %d keyup", __FILE__, __LINE__); + //qDebug("%s %d keyup", __FILE__, __LINE__); _screenWindow->scrollBy( ScreenWindow::ScrollLines , -1 ); } else if ( event->key() == Qt::Key_Down ) { - //qDebug("%s %d keydown", __FILE__, __LINE__); + //qDebug("%s %d keydown", __FILE__, __LINE__); _screenWindow->scrollBy( ScreenWindow::ScrollLines , 1 ); } else { update = false; - } + } if ( update ) { - //qDebug("%s %d updating", __FILE__, __LINE__); + //qDebug("%s %d updating", __FILE__, __LINE__); _screenWindow->setTrackOutput( _screenWindow->atEndOfOutput() ); - + updateLineProperties(); updateImage(); @@ -2329,13 +2333,13 @@ emitKeyPressSignal = false; } } - + _screenWindow->setTrackOutput( true ); - + _actSel=0; // Key stroke implies a screen update, so TerminalDisplay won't // know where the current selection is. - if (_hasBlinkingCursor) + if (_hasBlinkingCursor) { _blinkCursorTimer->start(BLINK_DELAY); if (_cursorBlinking) @@ -2348,7 +2352,7 @@ emit keyPressedSignal(event); if (_readonly) { - event->ignore(); + event->ignore(); } else { event->accept(); @@ -2362,13 +2366,13 @@ _inputMethodData.preeditString = event->preeditString(); update(preeditRect() | _inputMethodData.previousPreeditRect); - + event->accept(); } QVariant TerminalView::inputMethodQuery( Qt::InputMethodQuery query ) const { const QPoint cursorPos = _screenWindow ? _screenWindow->cursorPosition() : QPoint(0,0); - switch ( query ) + switch ( query ) { case Qt::ImMicroFocus: return imageToWidget(QRect(cursorPos.x(),cursorPos.y(),1,1)); @@ -2395,8 +2399,8 @@ case Qt::ImCurrentSelection: return QString(); break; - default: - break; + default: + break; } return QVariant(); @@ -2414,11 +2418,11 @@ // this is important as it allows a press and release of the Alt key // on its own to focus the menu bar, making it possible to // work with the menu without using the mouse - if ( (keyEvent->modifiers() == Qt::AltModifier) && + if ( (keyEvent->modifiers() == Qt::AltModifier) && !keyEvent->text().isEmpty() ) { - keyEvent->accept(); - return true; + keyEvent->accept(); + return true; } // Override any of the following shortcuts because @@ -2455,23 +2459,23 @@ { if (_bellMode==NoBell) return; - //limit the rate at which bells can occur - //...mainly for sound effects where rapid bells in sequence + //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) + + if (_bellMode==SystemBeepBell) { // KNotification::beep(); - } - else if (_bellMode==NotifyBell) + } + else if (_bellMode==NotifyBell) { // KNotification::event("BellVisible", message,QPixmap(),this); - } - else if (_bellMode==VisualBell) + } + else if (_bellMode==VisualBell) { swapColorTable(); QTimer::singleShot(200,this,SLOT(swapColorTable())); @@ -2532,7 +2536,7 @@ // 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); @@ -2544,13 +2548,13 @@ //qDebug("%s %d makeImage", __FILE__, __LINE__); calcGeometry(); - // confirm that array will be of non-zero size, since the painting code + // 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]; @@ -2567,7 +2571,7 @@ // enough room for the specified number of columns and lines to fit QSize newSize = QSize( columns * _fontWidth , - lines * _fontHeight ); + lines * _fontHeight ); if ( newSize != size() ) { @@ -2579,7 +2583,7 @@ void TerminalView::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); @@ -2618,34 +2622,34 @@ // KUrl::List urls = KUrl::List::fromMimeData(event->mimeData()); QString dropText; -/* if (!urls.isEmpty()) +/* if (!urls.isEmpty()) { - for ( int i = 0 ; i < urls.count() ; i++ ) + for ( int i = 0 ; i < urls.count() ; i++ ) { KUrl url = KIO::NetAccess::mostLocalUrl( urls[i] , 0 ); QString urlText; if (url.isLocalFile()) - urlText = url.path(); + 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) + // without quoting them (this only affects paths with spaces in) urlText = KShell::quoteArg(urlText); - + dropText += urlText; - if ( i != urls.count()-1 ) + if ( i != urls.count()-1 ) dropText += ' '; } } - else + else { dropText = event->mimeData()->text(); } */ - if(event->mimeData()->hasFormat("text/plain")) + if(event->mimeData()->hasFormat("text/plain")) { emit sendStringToEmu(dropText.toLocal8Bit()); } @@ -2667,43 +2671,43 @@ //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. + //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( ("<qt>Output has been " - "<a href=\"http://en.wikipedia.org/wiki/XON\">suspended</a>" - " by pressing Ctrl+S." + "<a href=\"http://en.wikipedia.org/wiki/XON\">suspended</a>" + " by pressing Ctrl+S." " Press <b>Ctrl+Q</b> to resume.</qt>"), this ); - QPalette palette(_outputSuspendedLabel->palette()); - + QPalette palette(_outputSuspendedLabel->palette()); + palette.setColor(QPalette::Normal, QPalette::WindowText, QColor(Qt::white)); palette.setColor(QPalette::Normal, QPalette::Window, QColor(Qt::black)); // KColorScheme::adjustForeground(palette,KColorScheme::NeutralText); // KColorScheme::adjustBackground(palette,KColorScheme::NeutralBackground); - _outputSuspendedLabel->setPalette(palette); + _outputSuspendedLabel->setPalette(palette); _outputSuspendedLabel->setAutoFillBackground(true); _outputSuspendedLabel->setBackgroundRole(QPalette::Base); _outputSuspendedLabel->setFont(QApplication::font()); - _outputSuspendedLabel->setMargin(5); + _outputSuspendedLabel->setMargin(5); //enable activation of "Xon/Xoff" link in label - _outputSuspendedLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse | + _outputSuspendedLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse | Qt::LinksAccessibleByKeyboard); _outputSuspendedLabel->setOpenExternalLinks(true); _outputSuspendedLabel->setVisible(false); - _gridLayout->addWidget(_outputSuspendedLabel); + _gridLayout->addWidget(_outputSuspendedLabel); _gridLayout->addItem( new QSpacerItem(0,0,QSizePolicy::Expanding, QSizePolicy::Expanding), 1,0); } - _outputSuspendedLabel->setVisible(suspended); + _outputSuspendedLabel->setVisible(suspended); } uint TerminalView::lineSpacing() const