summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>2012-01-25 16:47:41 +0100
committerQt by Nokia <qt-info@nokia.com>2012-01-26 09:59:20 +0100
commitd39d8b49d5724659321b2ba42b8159da57f8adce (patch)
tree5adff987e41f60f74cc9d470f422ada6484ac228
parent71db6d654ec4a3166325933ca3a9f5859013c110 (diff)
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 <oliver.wolff@nokia.com>
-rw-r--r--src/widgets/styles/qwindowsxpstyle.cpp48
-rw-r--r--src/widgets/styles/qwindowsxpstyle_p.h5
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<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
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<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;