Cleanup of QWindowsVistaStyle.
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>
Wed, 25 Jan 2012 15:47:41 +0000 (16:47 +0100)
committerQt by Nokia <qt-info@nokia.com>
Thu, 26 Jan 2012 08:59:20 +0000 (09:59 +0100)
- Remove the limbowidget, try to obtain HWND from a toplevel or
  the desktop instead.
- Clean up handling of the theme map, avoid operator[] and
  repeated invocation of of map.end()

Change-Id: Ic5ea6186508f37aaff782ca304ce577899f7b41c
Reviewed-by: Oliver Wolff <oliver.wolff@nokia.com>
src/widgets/styles/qwindowsxpstyle.cpp
src/widgets/styles/qwindowsxpstyle_p.h

index c112e62..acc462f 100644 (file)
@@ -159,14 +159,14 @@ HTHEME XPThemeData::handle()
         return 0;
 
     if (!htheme && QWindowsXPStylePrivate::handleMap)
-        htheme = QWindowsXPStylePrivate::handleMap->operator[](name);
+        htheme = QWindowsXPStylePrivate::handleMap->value(name);
 
     if (!htheme) {
         htheme = pOpenThemeData(QWindowsXPStylePrivate::winId(widget), (wchar_t*)name.utf16());
         if (htheme) {
             if (!QWindowsXPStylePrivate::handleMap)
-                QWindowsXPStylePrivate::handleMap = new QMap<QString, HTHEME>;
-            QWindowsXPStylePrivate::handleMap->operator[](name) = htheme;
+                QWindowsXPStylePrivate::handleMap = new QWindowsXPStylePrivate::ThemeHandleMap;
+            QWindowsXPStylePrivate::handleMap->insert(name, htheme);
         }
     }
 
@@ -209,7 +209,6 @@ HRGN XPThemeData::mask(QWidget *widget)
 
 // QWindowsXPStylePrivate -------------------------------------------------------------------------
 // Static initializations
-QWidget *QWindowsXPStylePrivate::limboWidget = 0;
 QPixmap *QWindowsXPStylePrivate::tabbody = 0;
 QMap<QString,HTHEME> *QWindowsXPStylePrivate::handleMap = 0;
 bool QWindowsXPStylePrivate::use_xp = false;
@@ -289,14 +288,7 @@ void QWindowsXPStylePrivate::cleanup(bool force)
 
     use_xp = false;
     cleanupHandleMap();
-    if (limboWidget) {
-        if (QApplication::closingDown())
-            delete limboWidget;
-        else
-            limboWidget->deleteLater();
-    }
     delete tabbody;
-    limboWidget = 0;
     tabbody = 0;
 }
 
@@ -307,11 +299,13 @@ void QWindowsXPStylePrivate::cleanup(bool force)
 */
 void QWindowsXPStylePrivate::cleanupHandleMap()
 {
+    typedef ThemeHandleMap::const_iterator ConstIterator;
+
     if (!handleMap)
         return;
 
-    QMap<QString, HTHEME>::Iterator it;
-    for (it = handleMap->begin(); it != handleMap->end(); ++it)
+    const ConstIterator cend = handleMap->constEnd();
+    for (ConstIterator it = handleMap->constBegin(); it != cend; ++it)
         pCloseThemeData(it.value());
     delete handleMap;
     handleMap = 0;
@@ -325,20 +319,22 @@ void QWindowsXPStylePrivate::cleanupHandleMap()
 */
 HWND QWindowsXPStylePrivate::winId(const QWidget *widget)
 {
-    if (widget && widget->internalWinId()) {
-        QWidget *w = const_cast<QWidget *>(widget);
-        return QApplicationPrivate::getHWNDForWidget(w);
-    }
-    if (!limboWidget) {
-        limboWidget = new QWidget(0);
-        limboWidget->createWinId();
-        limboWidget->setObjectName(QLatin1String("xp_limbo_widget"));
-        // We don't need this internal widget to appear in QApplication::topLevelWidgets()
-        if (QWidgetPrivate::allWidgets)
-            QWidgetPrivate::allWidgets->remove(limboWidget);
-    }
+    if (widget)
+        if (const HWND hwnd = QApplicationPrivate::getHWNDForWidget(const_cast<QWidget *>(widget)))
+            return hwnd;
+
+    const QWidgetList toplevels = QApplication::topLevelWidgets();
+    if (!toplevels.isEmpty())
+        if (const HWND topLevelHwnd = QApplicationPrivate::getHWNDForWidget(toplevels.front()))
+            return topLevelHwnd;
+
+    if (QDesktopWidget *desktop = qApp->desktop())
+        if (const HWND desktopHwnd = QApplicationPrivate::getHWNDForWidget(desktop))
+            return desktopHwnd;
+
+    Q_ASSERT(false);
 
-    return QApplicationPrivate::getHWNDForWidget(limboWidget);
+    return 0;
 }
 
 /*! \internal
index 44dc8e8..d3bfff6 100644 (file)
@@ -286,6 +286,8 @@ class QWindowsXPStylePrivate : public QWindowsStylePrivate
 {
     Q_DECLARE_PUBLIC(QWindowsXPStyle)
 public:
+    typedef QMap<QString, HTHEME> ThemeHandleMap;
+
     QWindowsXPStylePrivate()
         : QWindowsStylePrivate(), hasInitColors(false), bufferDC(0), bufferBitmap(0), nullBitmap(0),
           bufferPixels(0), bufferW(0), bufferH(0)
@@ -326,7 +328,7 @@ public:
     QRgb sliderTickColor;
     bool hasInitColors;
 
-    static QMap<QString,HTHEME> *handleMap;
+    static ThemeHandleMap *handleMap;
 
     QIcon dockFloat, dockClose;
 
@@ -338,7 +340,6 @@ private:
 
     static QBasicAtomicInt ref;
     static bool use_xp;
-    static QWidget *limboWidget;
     static QPixmap *tabbody;
 
     QHash<ThemeMapKey, ThemeMapData> alphaCache;