diff options
Diffstat (limited to 'src/winextras/qwinjumplistcategory.cpp')
-rw-r--r-- | src/winextras/qwinjumplistcategory.cpp | 49 |
1 files changed, 35 insertions, 14 deletions
diff --git a/src/winextras/qwinjumplistcategory.cpp b/src/winextras/qwinjumplistcategory.cpp index c338bf6..25b10a2 100644 --- a/src/winextras/qwinjumplistcategory.cpp +++ b/src/winextras/qwinjumplistcategory.cpp @@ -45,6 +45,7 @@ #include "qwinjumplistitem_p.h" #include "qwinfunctions_p.h" #include "qwinjumplist_p.h" +#include "winshobjidl_p.h" #include <shlobj.h> @@ -73,7 +74,7 @@ QT_BEGIN_NAMESPACE */ QWinJumpListCategoryPrivate::QWinJumpListCategoryPrivate() : - visible(false), jumpList(0), type(QWinJumpListCategory::Custom), pDocList(0) + visible(false), jumpList(0), type(QWinJumpListCategory::Custom) { } @@ -95,15 +96,25 @@ void QWinJumpListCategoryPrivate::invalidate() void QWinJumpListCategoryPrivate::loadRecents() { + Q_ASSERT(jumpList); + IApplicationDocumentLists *pDocList = 0; HRESULT hresult = CoCreateInstance(CLSID_ApplicationDocumentLists, 0, CLSCTX_INPROC_SERVER, IID_IApplicationDocumentLists, reinterpret_cast<void **>(&pDocList)); if (SUCCEEDED(hresult)) { - IObjectArray *array = 0; - hresult = pDocList->GetList(type == QWinJumpListCategory::Recent ? ADLT_RECENT : ADLT_FREQUENT, - 0, IID_IObjectArray, reinterpret_cast<void **>(&array)); + if (!jumpList->identifier().isEmpty()) { + wchar_t *id = qt_qstringToNullTerminated(jumpList->identifier()); + hresult = pDocList->SetAppID(id); + delete[] id; + } if (SUCCEEDED(hresult)) { - items = QWinJumpListPrivate::fromComCollection(array); - array->Release(); + IObjectArray *array = 0; + hresult = pDocList->GetList(type == QWinJumpListCategory::Recent ? ADLT_RECENT : ADLT_FREQUENT, + 0, IID_IObjectArray, reinterpret_cast<void **>(&array)); + if (SUCCEEDED(hresult)) { + items = QWinJumpListPrivate::fromComCollection(array); + array->Release(); + } } + pDocList->Release(); } if (FAILED(hresult)) QWinJumpListPrivate::warning("loadRecents", hresult); @@ -111,10 +122,18 @@ void QWinJumpListCategoryPrivate::loadRecents() void QWinJumpListCategoryPrivate::addRecent(QWinJumpListItem *item) { - if (item->type() == QWinJumpListItem::Link) - SHAddToRecentDocs(SHARD_LINK, QWinJumpListPrivate::toIShellLink(item)); - else if (item->type() == QWinJumpListItem::Destination) - SHAddToRecentDocs(SHARD_SHELLITEM, QWinJumpListPrivate::toIShellItem(item)); + Q_ASSERT(item->type() == QWinJumpListItem::Link); + const QString identifier = jumpList ? jumpList->identifier() : QString(); + wchar_t *id = qt_qstringToNullTerminated(identifier); + + SHARDAPPIDINFOLINK info; + info.pszAppID = id; + info.psl = QWinJumpListPrivate::toIShellLink(item); + if (info.psl) { + SHAddToRecentDocs(SHARD_APPIDINFOLINK, &info); + info.psl->Release(); + } + delete[] id; } void QWinJumpListCategoryPrivate::clearRecents() @@ -122,6 +141,12 @@ void QWinJumpListCategoryPrivate::clearRecents() IApplicationDestinations *pDest = 0; HRESULT hresult = CoCreateInstance(CLSID_ApplicationDestinations, 0, CLSCTX_INPROC_SERVER, IID_IApplicationDestinations, reinterpret_cast<void **>(&pDest)); if (SUCCEEDED(hresult)) { + const QString identifier = jumpList ? jumpList->identifier() : QString(); + if (!identifier.isEmpty()) { + wchar_t *id = qt_qstringToNullTerminated(identifier); + hresult = pDest->SetAppID(id); + delete[] id; + } hresult = pDest->RemoveAllDestinations(); pDest->Release(); } @@ -144,10 +169,6 @@ QWinJumpListCategory::QWinJumpListCategory(const QString &title) : QWinJumpListCategory::~QWinJumpListCategory() { Q_D(QWinJumpListCategory); - if (d->pDocList) { - d->pDocList->Release(); - d->pDocList = 0; - } qDeleteAll(d->items); d->items.clear(); } |