From 1747f66457420e970b9402e6418693e17a950a6f Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 14 Feb 2012 11:52:05 +0100 Subject: Add a ThemeChange event. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Pass it from QWindowSystemInterface via QWindow to the widgets. - Add handler code from 4.8 / qapplication_win.cpp to qwidget.cpp. Change-Id: Ic759563aa00cb93fe014c1bf41020446c1927dec Reviewed-by: Morten Johan Sørvig Reviewed-by: Samuel Rødal --- src/corelib/kernel/qcoreevent.h | 2 ++ src/gui/kernel/qguiapplication.cpp | 12 ++++++++++++ src/gui/kernel/qguiapplication_p.h | 1 + src/gui/kernel/qwindowsysteminterface_qpa.cpp | 6 ++++++ src/gui/kernel/qwindowsysteminterface_qpa.h | 2 ++ src/gui/kernel/qwindowsysteminterface_qpa_p.h | 8 ++++++++ src/widgets/kernel/qwidget.cpp | 15 +++++++++++++++ src/widgets/kernel/qwidgetwindow_qpa.cpp | 6 ++++++ 8 files changed, 52 insertions(+) (limited to 'src') diff --git a/src/corelib/kernel/qcoreevent.h b/src/corelib/kernel/qcoreevent.h index 8182ac907e..1f36f9c9c8 100644 --- a/src/corelib/kernel/qcoreevent.h +++ b/src/corelib/kernel/qcoreevent.h @@ -279,6 +279,8 @@ public: TouchCancel = 211, + ThemeChange = 212, + // 512 reserved for Qt Jambi's MetaCall event // 513 reserved for Qt Jambi's DeleteOnMainThread event diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 5ca6364fbb..4d80aafea5 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -661,6 +661,10 @@ void QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePriv QGuiApplicationPrivate::reportLogicalDotsPerInchChange( static_cast(e)); break; + case QWindowSystemInterfacePrivate::ThemeChange: + QGuiApplicationPrivate::processThemeChanged( + static_cast(e)); + break; case QWindowSystemInterfacePrivate::Map: QGuiApplicationPrivate::processMapEvent(static_cast(e)); break; @@ -888,6 +892,14 @@ void QGuiApplicationPrivate::processWindowStateChangedEvent(QWindowSystemInterfa } } +void QGuiApplicationPrivate::processThemeChanged(QWindowSystemInterfacePrivate::ThemeChangeEvent *tce) +{ + if (QWindow *window = tce->window.data()) { + QEvent e(QEvent::ThemeChange); + QGuiApplication::sendSpontaneousEvent(window, &e); + } +} + void QGuiApplicationPrivate::processGeometryChangeEvent(QWindowSystemInterfacePrivate::GeometryChangeEvent *e) { if (e->tlw.isNull()) diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h index 5f2e92c504..7fafe0336d 100644 --- a/src/gui/kernel/qguiapplication_p.h +++ b/src/gui/kernel/qguiapplication_p.h @@ -125,6 +125,7 @@ public: static void reportGeometryChange(QWindowSystemInterfacePrivate::ScreenGeometryEvent *e); static void reportAvailableGeometryChange(QWindowSystemInterfacePrivate::ScreenAvailableGeometryEvent *e); static void reportLogicalDotsPerInchChange(QWindowSystemInterfacePrivate::ScreenLogicalDotsPerInchEvent *e); + static void processThemeChanged(QWindowSystemInterfacePrivate::ThemeChangeEvent *tce); static void processMapEvent(QWindowSystemInterfacePrivate::MapEvent *e); static void processUnmapEvent(QWindowSystemInterfacePrivate::UnmapEvent *e); diff --git a/src/gui/kernel/qwindowsysteminterface_qpa.cpp b/src/gui/kernel/qwindowsysteminterface_qpa.cpp index f4f7551c04..e6c4454104 100644 --- a/src/gui/kernel/qwindowsysteminterface_qpa.cpp +++ b/src/gui/kernel/qwindowsysteminterface_qpa.cpp @@ -340,6 +340,12 @@ void QWindowSystemInterface::handleScreenLogicalDotsPerInchChange(QScreen *scree QWindowSystemInterfacePrivate::queueWindowSystemEvent(e); } +void QWindowSystemInterface::handleThemeChange(QWindow *tlw) +{ + QWindowSystemInterfacePrivate::ThemeChangeEvent *e = new QWindowSystemInterfacePrivate::ThemeChangeEvent(tlw); + QWindowSystemInterfacePrivate::queueWindowSystemEvent(e); +} + void QWindowSystemInterface::handleMapEvent(QWindow *tlw) { QWindowSystemInterfacePrivate::MapEvent *e = new QWindowSystemInterfacePrivate::MapEvent(tlw); diff --git a/src/gui/kernel/qwindowsysteminterface_qpa.h b/src/gui/kernel/qwindowsysteminterface_qpa.h index 28ec68ec59..78152a1178 100644 --- a/src/gui/kernel/qwindowsysteminterface_qpa.h +++ b/src/gui/kernel/qwindowsysteminterface_qpa.h @@ -130,6 +130,8 @@ public: static void handleScreenAvailableGeometryChange(QScreen *screen, const QRect &newAvailableGeometry); static void handleScreenLogicalDotsPerInchChange(QScreen *screen, qreal newDpiX, qreal newDpiY); + static void handleThemeChange(QWindow *tlw); + // For event dispatcher implementations static bool sendWindowSystemEvents(QAbstractEventDispatcher *eventDispatcher, QEventLoop::ProcessEventsFlags flags); static int windowSystemEventsQueued(); diff --git a/src/gui/kernel/qwindowsysteminterface_qpa_p.h b/src/gui/kernel/qwindowsysteminterface_qpa_p.h index 0bd9ba017a..661b39da88 100644 --- a/src/gui/kernel/qwindowsysteminterface_qpa_p.h +++ b/src/gui/kernel/qwindowsysteminterface_qpa_p.h @@ -64,6 +64,7 @@ public: ScreenGeometry, ScreenAvailableGeometry, ScreenLogicalDotsPerInch, + ThemeChange, Map, Unmap, Expose @@ -230,6 +231,13 @@ public: qreal dpiY; }; + class ThemeChangeEvent : public WindowSystemEvent { + public: + explicit ThemeChangeEvent(QWindow * w) + : WindowSystemEvent(ThemeChange), window(w) { } + QWeakPointer window; + }; + class MapEvent : public WindowSystemEvent { public: MapEvent(QWindow *mapped) diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index f5a1ea15cd..f98f7fbe66 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -8046,6 +8046,7 @@ bool QWidget::event(QEvent *event) case QEvent::LocaleChange: case QEvent::MacSizeChange: case QEvent::ContentsRectChange: + case QEvent::ThemeChange: changeEvent(event); break; @@ -8249,6 +8250,20 @@ void QWidget::changeEvent(QEvent * event) update(); break; + case QEvent::ThemeChange: + if (QApplication::desktopSettingsAware() && windowType() != Qt::Desktop + && qApp && !QApplication::closingDown()) { + if (testAttribute(Qt::WA_WState_Polished)) + QApplication::style()->unpolish(this); + if (testAttribute(Qt::WA_WState_Polished)) + QApplication::style()->polish(this); + QEvent styleChangedEvent(QEvent::StyleChange); + QCoreApplication::sendEvent(this, &styleChangedEvent); + if (isVisible()) + update(); + } + break; + #ifdef Q_WS_MAC case QEvent::MacSizeChange: updateGeometry(); diff --git a/src/widgets/kernel/qwidgetwindow_qpa.cpp b/src/widgets/kernel/qwidgetwindow_qpa.cpp index c2524567f1..c04d8a9dc3 100644 --- a/src/widgets/kernel/qwidgetwindow_qpa.cpp +++ b/src/widgets/kernel/qwidgetwindow_qpa.cpp @@ -150,6 +150,12 @@ bool QWidgetWindow::event(QEvent *event) handleWindowStateChangedEvent(static_cast(event)); return true; + case QEvent::ThemeChange: { + QEvent widgetEvent(QEvent::ThemeChange); + QGuiApplication::sendSpontaneousEvent(m_widget, &widgetEvent); + } + return true; + default: break; } -- cgit v1.2.3