changeset 16611:6f7940e36322

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.
author John W. Eaton <jwe@octave.org>
date Sat, 04 May 2013 01:01:44 -0400
parents 739d7eb97b85
children a1f613e5066d
files libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.cpp libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.h libgui/qterminal/libqterminal/unix/TerminalView.cpp libgui/qterminal/libqterminal/unix/TerminalView.h
diffstat 4 files changed, 33 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.cpp
+++ b/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.cpp
@@ -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();
--- a/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.h
+++ b/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.h
@@ -48,7 +48,6 @@
     void pasteClipboard();
 
 protected:
-    void focusInEvent(QFocusEvent *focusEvent);
     void showEvent(QShowEvent *);
     virtual void resizeEvent(QResizeEvent *);   
 
--- a/libgui/qterminal/libqterminal/unix/TerminalView.cpp
+++ b/libgui/qterminal/libqterminal/unix/TerminalView.cpp
@@ -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)) );
 
--- a/libgui/qterminal/libqterminal/unix/TerminalView.h
+++ b/libgui/qterminal/libqterminal/unix/TerminalView.h
@@ -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*);