diff options
author | xcdix <sks_f@mail.ru> | 2014-09-29 19:57:31 +0700 |
---|---|---|
committer | Konstantin <sks_f@mail.ru> | 2014-09-29 16:12:41 +0200 |
commit | 26a8af4681c54aa6935a2179b5aaee9b81a3c023 (patch) | |
tree | f599b5e0e27dc516ccab27ede80760055c84aa93 /src | |
parent | 7fe7f504d239d606bd96716e9c48cea817d6de1c (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.cpp | 20 | ||||
-rw-r--r-- | src/winextras/qwinthumbnailtoolbar_p.h | 1 |
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; |