Add a ThemeChange event.
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>
Tue, 14 Feb 2012 10:52:05 +0000 (11:52 +0100)
committerQt by Nokia <qt-info@nokia.com>
Thu, 16 Feb 2012 00:56:01 +0000 (01:56 +0100)
- 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 <morten.sorvig@nokia.com>
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
src/corelib/kernel/qcoreevent.h
src/gui/kernel/qguiapplication.cpp
src/gui/kernel/qguiapplication_p.h
src/gui/kernel/qwindowsysteminterface_qpa.cpp
src/gui/kernel/qwindowsysteminterface_qpa.h
src/gui/kernel/qwindowsysteminterface_qpa_p.h
src/widgets/kernel/qwidget.cpp
src/widgets/kernel/qwidgetwindow_qpa.cpp

index 8182ac9..1f36f9c 100644 (file)
@@ -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
 
index 5ca6364..4d80aaf 100644 (file)
@@ -661,6 +661,10 @@ void QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePriv
         QGuiApplicationPrivate::reportLogicalDotsPerInchChange(
                 static_cast<QWindowSystemInterfacePrivate::ScreenLogicalDotsPerInchEvent *>(e));
         break;
+    case QWindowSystemInterfacePrivate::ThemeChange:
+        QGuiApplicationPrivate::processThemeChanged(
+                    static_cast<QWindowSystemInterfacePrivate::ThemeChangeEvent *>(e));
+        break;
     case QWindowSystemInterfacePrivate::Map:
         QGuiApplicationPrivate::processMapEvent(static_cast<QWindowSystemInterfacePrivate::MapEvent *>(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())
index 5f2e92c..7fafe03 100644 (file)
@@ -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);
index f4f7551..e6c4454 100644 (file)
@@ -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);
index 28ec68e..78152a1 100644 (file)
@@ -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();
index 0bd9ba0..661b39d 100644 (file)
@@ -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<QWindow> window;
+    };
+
     class MapEvent : public WindowSystemEvent {
     public:
         MapEvent(QWindow *mapped)
index f5a1ea1..f98f7fb 100644 (file)
@@ -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();
index c252456..c04d8a9 100644 (file)
@@ -150,6 +150,12 @@ bool QWidgetWindow::event(QEvent *event)
         handleWindowStateChangedEvent(static_cast<QWindowStateChangeEvent *>(event));
         return true;
 
+    case QEvent::ThemeChange: {
+        QEvent widgetEvent(QEvent::ThemeChange);
+        QGuiApplication::sendSpontaneousEvent(m_widget, &widgetEvent);
+    }
+        return true;
+
     default:
         break;
     }