From cc3875c2e463be5cf126a18637295a0c56358eda Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Tue, 2 Sep 2014 12:34:31 +0200 Subject: Balloon tip must follow systemtray icon If the a message notification is created at the same time as the system tray icon is embedded it may start at a wrong location, since the icon location it bases its own location is not yet final. This patch adds code to update the balloon tip location when the system tray icon is moved or resized. The bug and fix can be tested by the systray example by disabling the icon and letting show message trigger both showing it and the message. Change-Id: Ie1dc10489ad420e581e32afeb757c236fb5129ab Reviewed-by: Shawn Rutledge --- examples/widgets/desktop/systray/window.cpp | 1 + src/widgets/util/qsystemtrayicon.cpp | 9 +++++++++ src/widgets/util/qsystemtrayicon_p.h | 2 ++ src/widgets/util/qsystemtrayicon_x11.cpp | 17 +++++++++++++---- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/examples/widgets/desktop/systray/window.cpp b/examples/widgets/desktop/systray/window.cpp index 0ef5ddbd31..f13c05705e 100644 --- a/examples/widgets/desktop/systray/window.cpp +++ b/examples/widgets/desktop/systray/window.cpp @@ -144,6 +144,7 @@ void Window::iconActivated(QSystemTrayIcon::ActivationReason reason) //! [5] void Window::showMessage() { + showIconCheckBox->setChecked(true); QSystemTrayIcon::MessageIcon icon = QSystemTrayIcon::MessageIcon( typeComboBox->itemData(typeComboBox->currentIndex()).toInt()); trayIcon->showMessage(titleEdit->text(), bodyEdit->toPlainText(), icon, diff --git a/src/widgets/util/qsystemtrayicon.cpp b/src/widgets/util/qsystemtrayicon.cpp index 6b8c878dc4..7d04cab05e 100644 --- a/src/widgets/util/qsystemtrayicon.cpp +++ b/src/widgets/util/qsystemtrayicon.cpp @@ -416,6 +416,14 @@ void QBalloonTip::hideBalloon() theSolitaryBalloonTip = 0; } +void QBalloonTip::updateBalloonPosition(const QPoint& pos) +{ + if (!theSolitaryBalloonTip) + return; + theSolitaryBalloonTip->hide(); + theSolitaryBalloonTip->balloon(pos, 0, theSolitaryBalloonTip->showArrow); +} + bool QBalloonTip::isBalloonVisible() { return theSolitaryBalloonTip; @@ -549,6 +557,7 @@ void QBalloonTip::resizeEvent(QResizeEvent *ev) void QBalloonTip::balloon(const QPoint& pos, int msecs, bool showArrow) { + this->showArrow = showArrow; QRect scr = QApplication::desktop()->screenGeometry(pos); QSize sh = sizeHint(); const int border = 1; diff --git a/src/widgets/util/qsystemtrayicon_p.h b/src/widgets/util/qsystemtrayicon_p.h index d745269d2f..0dda689c51 100644 --- a/src/widgets/util/qsystemtrayicon_p.h +++ b/src/widgets/util/qsystemtrayicon_p.h @@ -110,6 +110,7 @@ public: const QPoint& pos, int timeout, bool showArrow = true); static void hideBalloon(); static bool isBalloonVisible(); + static void updateBalloonPosition(const QPoint& pos); private: QBalloonTip(QSystemTrayIcon::MessageIcon icon, const QString& title, @@ -127,6 +128,7 @@ private: QSystemTrayIcon *trayIcon; QPixmap pixmap; int timerId; + bool showArrow; }; QT_END_NAMESPACE diff --git a/src/widgets/util/qsystemtrayicon_x11.cpp b/src/widgets/util/qsystemtrayicon_x11.cpp index be8ee97df5..cda557b6b0 100644 --- a/src/widgets/util/qsystemtrayicon_x11.cpp +++ b/src/widgets/util/qsystemtrayicon_x11.cpp @@ -79,6 +79,7 @@ protected: virtual bool event(QEvent *); virtual void paintEvent(QPaintEvent *); virtual void resizeEvent(QResizeEvent *); + virtual void moveEvent(QMoveEvent *); private slots: void systemTrayWindowChanged(QScreen *screen); @@ -223,11 +224,20 @@ void QSystemTrayIconSys::paintEvent(QPaintEvent *) q->icon().paint(&painter, rect); } -void QSystemTrayIconSys::resizeEvent(QResizeEvent *) +void QSystemTrayIconSys::moveEvent(QMoveEvent *event) { - update(); + QWidget::moveEvent(event); + if (QBalloonTip::isBalloonVisible()) + QBalloonTip::updateBalloonPosition(globalGeometry().center()); } +void QSystemTrayIconSys::resizeEvent(QResizeEvent *event) +{ + update(); + QWidget::resizeEvent(event); + if (QBalloonTip::isBalloonVisible()) + QBalloonTip::updateBalloonPosition(globalGeometry().center()); +} //////////////////////////////////////////////////////////////////////////// QSystemTrayIconPrivate::QSystemTrayIconPrivate() @@ -340,9 +350,8 @@ void QSystemTrayIconPrivate::showMessage_sys(const QString &message, const QStri } if (!sys) return; - const QPoint g = sys->globalGeometry().topLeft(); QBalloonTip::showBalloon(icon, message, title, sys->systemTrayIcon(), - QPoint(g.x() + sys->width()/2, g.y() + sys->height()/2), + sys->globalGeometry().center(), msecs); } -- cgit v1.2.3