# HG changeset patch # User John W. Eaton # Date 1367643704 14400 # Node ID 6f7940e363227e9f231f4f7b1fc402b1aae44ac1 # Parent 739d7eb97b85b36f117ba9b3933cdf42eea24d51 improve handling of cursor blinking for unix GUI terminal window * QUnixTerminalImpl.h, QUnixTerminalImpl.cpp (QUnixTerminalImpl::focusInEvent): Delete. * TerminalView.h, TerminalView.cpp (TerminalView::drawCursor): Don't check focus. (TerminalView::setBlinkingCursorState): New function. (TerminalView::setBlinkingCursor): Use it. (TerminalView::focusInEvent, TerminalView::focusOutEvent): New functions. (TerminalView::blinkCursorEvent): Only toggle state if _hasBlinkingCursor is true. diff -r 739d7eb97b85 -r 6f7940e36322 libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.cpp --- a/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.cpp Sat May 04 00:49:34 2013 -0400 +++ b/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.cpp Sat May 04 01:01:44 2013 -0400 @@ -135,14 +135,6 @@ m_terminalView->setBlinkingCursor(blinking); } -void QUnixTerminalImpl::focusInEvent(QFocusEvent *focusEvent) -{ - Q_UNUSED(focusEvent); - m_terminalView->updateImage(); - m_terminalView->repaint(); - m_terminalView->update(); -} - void QUnixTerminalImpl::showEvent(QShowEvent *) { m_terminalView->updateImage(); diff -r 739d7eb97b85 -r 6f7940e36322 libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.h --- a/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.h Sat May 04 00:49:34 2013 -0400 +++ b/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.h Sat May 04 01:01:44 2013 -0400 @@ -48,7 +48,6 @@ void pasteClipboard(); protected: - void focusInEvent(QFocusEvent *focusEvent); void showEvent(QShowEvent *); virtual void resizeEvent(QResizeEvent *); diff -r 739d7eb97b85 -r 6f7940e36322 libgui/qterminal/libqterminal/unix/TerminalView.cpp --- a/libgui/qterminal/libqterminal/unix/TerminalView.cpp Sat May 04 00:49:34 2013 -0400 +++ b/libgui/qterminal/libqterminal/unix/TerminalView.cpp Sat May 04 01:01:44 2013 -0400 @@ -530,7 +530,7 @@ QRect cursorRect = rect; cursorRect.setHeight(_fontHeight - _lineSpacing - 1); - if (!_cursorBlinking || !hasFocus()) + if (!_cursorBlinking) { if ( _cursorColor.isValid() ) painter.setPen(_cursorColor); @@ -1021,6 +1021,11 @@ { _hasBlinkingCursor=blink; + setBlinkingCursorState(blink); +} + +void TerminalView::setBlinkingCursorState(bool blink) +{ if (blink && !_blinkCursorTimer->isActive()) _blinkCursorTimer->start(BLINK_DELAY); @@ -1029,8 +1034,6 @@ _blinkCursorTimer->stop(); if (_cursorBlinking) blinkCursorEvent(); - else - _cursorBlinking = false; } } @@ -1053,6 +1056,25 @@ paint.end(); } +void TerminalView::focusInEvent(QFocusEvent *focusEvent) +{ + setBlinkingCursorState(true); + updateImage(); + repaint(); + update(); + + QWidget::focusInEvent(focusEvent); +} + +void TerminalView::focusOutEvent(QFocusEvent *focusEvent) +{ + // Force the cursor to be redrawn. + _cursorBlinking = true; + setBlinkingCursorState(false); + + QWidget::focusOutEvent(focusEvent); +} + QPoint TerminalView::cursorPosition() const { if (_screenWindow) @@ -1343,7 +1365,10 @@ void TerminalView::blinkCursorEvent() { - _cursorBlinking = !_cursorBlinking; + if (_hasBlinkingCursor) + _cursorBlinking = !_cursorBlinking; + else + _cursorBlinking = false; QRect cursorRect = imageToWidget( QRect(cursorPosition(),QSize(1,1)) ); diff -r 739d7eb97b85 -r 6f7940e36322 libgui/qterminal/libqterminal/unix/TerminalView.h --- a/libgui/qterminal/libqterminal/unix/TerminalView.h Sat May 04 00:49:34 2013 -0400 +++ b/libgui/qterminal/libqterminal/unix/TerminalView.h Sat May 04 01:01:44 2013 -0400 @@ -150,6 +150,7 @@ bool blinkingCursor() { return _hasBlinkingCursor; } /** Specifies whether or not the cursor blinks. */ void setBlinkingCursor(bool blink); + void setBlinkingCursorState(bool blink); void setCtrlDrag(bool enable) { _ctrlDrag=enable; } bool ctrlDrag() { return _ctrlDrag; } @@ -478,6 +479,9 @@ virtual void paintEvent( QPaintEvent * ); + void focusInEvent(QFocusEvent *focusEvent); + void focusOutEvent(QFocusEvent *focusEvent); + virtual void showEvent(QShowEvent*); virtual void hideEvent(QHideEvent*); virtual void resizeEvent(QResizeEvent*);