diff --git a/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cpp b/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cpp --- a/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cpp +++ b/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cpp @@ -40,6 +40,8 @@ #include #include +#include + #include "QWinTerminalImpl.h" #include "QTerminalColors.h" @@ -103,6 +105,7 @@ void monitorConsole (void); void startCommand (void); void sendConsoleText (const QString& s); + QRect cursorRect (void); void log (const char* fmt, ...); @@ -126,6 +129,9 @@ QSize m_bufferSize; QRect m_consoleRect; QPoint m_cursorPos; + bool m_cursorBlinking; + bool m_hasBlinkingCursor; + QTimer *m_blinkCursorTimer; HANDLE m_stdOut; HWND m_consoleWindow; @@ -137,12 +143,16 @@ QScrollBar* m_scrollBar; QTimer* m_consoleWatcher; QConsoleThread *m_consoleThread; + + // The delay in milliseconds between redrawing blinking text. + static const int BLINK_DELAY = 500; }; ////////////////////////////////////////////////////////////////////////////// QConsolePrivate::QConsolePrivate (QWinTerminalImpl* parent, const QString& cmd) - : q (parent), m_command (cmd), m_process (NULL), m_inWheelEvent (false) + : q (parent), m_command (cmd), m_hasBlinkingCursor (true), + m_process (NULL), m_inWheelEvent (false) { log (NULL); @@ -255,7 +265,11 @@ m_consoleWatcher = new QTimer (parent); m_consoleWatcher->setInterval (10); m_consoleWatcher->setSingleShot (false); - + + m_blinkCursorTimer = new QTimer (parent); + QObject::connect (m_blinkCursorTimer, SIGNAL (timeout()), + q, SLOT (blinkCursorEvent ())); + QObject::connect (m_scrollBar, SIGNAL (valueChanged (int)), q, SLOT (scrollValueChanged (int))); QObject::connect (m_consoleWatcher, SIGNAL (timeout (void)), @@ -700,6 +714,17 @@ } } +QRect +QConsolePrivate::cursorRect (void) +{ + int cw = m_charSize.width (); + int ch = m_charSize.height (); + + return QRect ((m_cursorPos.x () - m_consoleRect.x ()) * cw, + (m_cursorPos.y () - m_consoleRect.y ()) * ch, + cw, ch); +} + ////////////////////////////////////////////////////////////////////////////// QWinTerminalImpl::QWinTerminalImpl (QWidget* parent) @@ -812,11 +837,40 @@ } } - // Draw cursor - p.setCompositionMode (QPainter::RasterOp_SourceXorDestination); - p.fillRect ((d->m_cursorPos.x () - d->m_consoleRect.x ()) * cw, - (d->m_cursorPos.y () - d->m_consoleRect.y ()) * ch, - cw, ch, d->m_colors[7]); + if (! d->m_cursorBlinking) + { + p.setCompositionMode (QPainter::RasterOp_SourceXorDestination); + + p.fillRect (d->cursorRect (), d->m_colors[7]); + } +} + +void QWinTerminalImpl::blinkCursorEvent (void) +{ + d->m_cursorBlinking = ! d->m_cursorBlinking; + + update (); +} + +void QWinTerminalImpl::setBlinkingCursor (bool blink) +{ + d->m_hasBlinkingCursor = blink; + + setBlinkingCursorState (blink); +} + +void QWinTerminalImpl::setBlinkingCursorState (bool blink) +{ + if (blink && ! d->m_blinkCursorTimer->isActive ()) + d->m_blinkCursorTimer->start (d->BLINK_DELAY); + + if (! blink && d->m_blinkCursorTimer->isActive ()) + { + d->m_blinkCursorTimer->stop (); + + if (d->m_cursorBlinking) + blinkCursorEvent (); + } } ////////////////////////////////////////////////////////////////////////////// @@ -871,9 +925,31 @@ void QWinTerminalImpl::focusInEvent (QFocusEvent* event) { + setBlinkingCursorState (true); + QWidget::focusInEvent (event); } +void QWinTerminalImpl::focusOutEvent (QFocusEvent* event) +{ + setBlinkingCursorState (false); + + QWidget::focusOutEvent (event); +} + +void QWinTerminalImpl::keyPressEvent (QKeyEvent* event) +{ + if (d->m_hasBlinkingCursor) + { + d->m_blinkCursorTimer->start (d->BLINK_DELAY); + + if (d->m_cursorBlinking) + blinkCursorEvent (); + } + + QWidget::keyPressEvent (event); +} + ////////////////////////////////////////////////////////////////////////////// void QWinTerminalImpl::start (void) @@ -888,6 +964,11 @@ d->sendConsoleText (s); } +void QWinTerminalImpl::setCursorType (CursorType /* type */, bool blinking) +{ + setBlinkingCursor (true); +} + ////////////////////////////////////////////////////////////////////////////// void QWinTerminalImpl::setTerminalFont (const QFont& f) diff --git a/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.h b/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.h --- a/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.h +++ b/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.h @@ -26,6 +26,7 @@ #include "QTerminalInterface.h" class QFocusEvent; class QKeyEvent; +class QPainter; class QPaintEvent; class QResizeEvent; class QWheelEvent; @@ -51,10 +52,12 @@ void setTerminalFont (const QFont& font); void setSize (int columns, int lines); void sendText (const QString& s); + void setCursorType (CursorType type, bool blinking); public slots: void copyClipboard (void); void pasteClipboard (void); + void blinkCursorEvent (void); signals: void terminated (void); @@ -62,9 +65,13 @@ protected: void viewPaintEvent (QConsoleView*, QPaintEvent*); + void setBlinkingCursor (bool blink); + void setBlinkingCursorState (bool blink); void viewResizeEvent (QConsoleView*, QResizeEvent*); void wheelEvent (QWheelEvent*); void focusInEvent (QFocusEvent*); + void focusOutEvent (QFocusEvent*); + void keyPressEvent (QKeyEvent*); bool winEvent (MSG*, long*); virtual void start (void);