aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorxcdix <sks_f@mail.ru>2014-09-29 19:57:31 +0700
committerKonstantin <sks_f@mail.ru>2014-09-29 16:12:41 +0200
commit26a8af4681c54aa6935a2179b5aaee9b81a3c023 (patch)
treef599b5e0e27dc516ccab27ede80760055c84aa93 /src
parent7fe7f504d239d606bd96716e9c48cea817d6de1c (diff)
Fix for QWinThumbnailToolBar GDI leak
QTBUG-41635 Change-Id: I60e34c8f32df6fc7ff9eac2812f71d611b903f41 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/winextras/qwinthumbnailtoolbar.cpp20
-rw-r--r--src/winextras/qwinthumbnailtoolbar_p.h1
2 files changed, 11 insertions, 10 deletions
diff --git a/src/winextras/qwinthumbnailtoolbar.cpp b/src/winextras/qwinthumbnailtoolbar.cpp
index 8fab0ef..5a208d4 100644
--- a/src/winextras/qwinthumbnailtoolbar.cpp
+++ b/src/winextras/qwinthumbnailtoolbar.cpp
@@ -493,6 +493,7 @@ void QWinThumbnailToolBarPrivate::_q_updateToolbar()
if (!pTbList || !window)
return;
THUMBBUTTON buttons[windowsLimitedThumbbarSize];
+ QList<HICON> createdIcons;
initButtons(buttons);
const int thumbbarSize = qMin(buttonList.size(), windowsLimitedThumbbarSize);
// filling from the right fixes some strange bug which makes last button bg look like first btn bg
@@ -504,6 +505,8 @@ void QWinThumbnailToolBarPrivate::_q_updateToolbar()
buttons[i].hIcon = QtWin::toHICON(button->icon().pixmap(GetSystemMetrics(SM_CXSMICON)));
if (!buttons[i].hIcon)
buttons[i].hIcon = (HICON)LoadImage(0, IDI_APPLICATION, IMAGE_ICON, SM_CXSMICON, SM_CYSMICON, LR_SHARED);
+ else
+ createdIcons << buttons[i].hIcon;
}
if (!button->toolTip().isEmpty()) {
buttons[i].szTip[button->toolTip().left(sizeof(buttons[i].szTip)/sizeof(buttons[i].szTip[0]) - 1).toWCharArray(buttons[i].szTip)] = 0;
@@ -513,7 +516,14 @@ void QWinThumbnailToolBarPrivate::_q_updateToolbar()
if (FAILED(hresult))
qWarning() << msgComFailed("ThumbBarUpdateButtons", hresult);
updateIconicPixmapsEnabled(false);
- freeButtonResources(buttons);
+ for (int i = 0; i < windowsLimitedThumbbarSize; i++) {
+ if (buttons[i].hIcon) {
+ if (createdIcons.contains(buttons[i].hIcon))
+ DestroyIcon(buttons[i].hIcon);
+ else
+ DeleteObject(buttons[i].hIcon);
+ }
+ }
}
void QWinThumbnailToolBarPrivate::_q_scheduleUpdate()
@@ -604,14 +614,6 @@ int QWinThumbnailToolBarPrivate::makeButtonMask(const QWinThumbnailToolButton *b
return mask;
}
-void QWinThumbnailToolBarPrivate::freeButtonResources(THUMBBUTTON *buttons)
-{
- for (int i = 0; i < windowsLimitedThumbbarSize; i++) {
- if (buttons[i].hIcon)
- DeleteObject(buttons[i].hIcon);
- }
-}
-
QString QWinThumbnailToolBarPrivate::msgComFailed(const char *function, HRESULT hresult)
{
return QString::fromLatin1("QWinThumbnailToolBar: %1() failed: #%2: %3")
diff --git a/src/winextras/qwinthumbnailtoolbar_p.h b/src/winextras/qwinthumbnailtoolbar_p.h
index 45e76c4..7e66f3a 100644
--- a/src/winextras/qwinthumbnailtoolbar_p.h
+++ b/src/winextras/qwinthumbnailtoolbar_p.h
@@ -83,7 +83,6 @@ public:
static void initButtons(THUMBBUTTON *buttons);
static int makeNativeButtonFlags(const QWinThumbnailToolButton *button);
static int makeButtonMask(const QWinThumbnailToolButton *button);
- static void freeButtonResources(THUMBBUTTON *buttons);
static QString msgComFailed(const char *function, HRESULT hresult);
bool updateScheduled;