From d39d8b49d5724659321b2ba42b8159da57f8adce Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 25 Jan 2012 16:47:41 +0100 Subject: Cleanup of QWindowsVistaStyle. - 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 --- src/widgets/styles/qwindowsxpstyle.cpp | 48 ++++++++++++++++------------------ src/widgets/styles/qwindowsxpstyle_p.h | 5 ++-- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/src/widgets/styles/qwindowsxpstyle.cpp b/src/widgets/styles/qwindowsxpstyle.cpp index c112e62c6c..acc462ff72 100644 --- a/src/widgets/styles/qwindowsxpstyle.cpp +++ b/src/widgets/styles/qwindowsxpstyle.cpp @@ -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; - 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 *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::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(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(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 diff --git a/src/widgets/styles/qwindowsxpstyle_p.h b/src/widgets/styles/qwindowsxpstyle_p.h index 44dc8e8bdb..d3bfff6a4b 100644 --- a/src/widgets/styles/qwindowsxpstyle_p.h +++ b/src/widgets/styles/qwindowsxpstyle_p.h @@ -286,6 +286,8 @@ class QWindowsXPStylePrivate : public QWindowsStylePrivate { Q_DECLARE_PUBLIC(QWindowsXPStyle) public: + typedef QMap 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 *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 alphaCache; -- cgit v1.2.3