[PATCH 0/2] MR11563: shell32: Accept CSIDL values in SHBrowseForFolderW().
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11563
From: Attila Fidan <dev@print0.net> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/shell32/tests/brsfolder.c | 50 ++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/dlls/shell32/tests/brsfolder.c b/dlls/shell32/tests/brsfolder.c index caccb13a326..f06a185ac4b 100644 --- a/dlls/shell32/tests/brsfolder.c +++ b/dlls/shell32/tests/brsfolder.c @@ -357,8 +357,58 @@ static void test_selection(void) CoUninitialize(); } +static void CALLBACK ok_timer_callback(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) +{ + KillTimer(hwnd, idEvent); + SendMessageA(hwnd, WM_COMMAND, IDOK, 0); +} + +static int CALLBACK csidl_pidlroot_callback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) +{ + switch (uMsg) + { + case BFFM_INITIALIZED: + SetTimer(hwnd, 0, TIMER_WAIT_MS, ok_timer_callback); + return 1; + default: + return 0; + } +} + +static void test_csidl_pidlroot(void) +{ + BROWSEINFOW bi = { 0 }; + LPITEMIDLIST pidl; + HRESULT hr; + + hr = CoInitialize(NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + /* pidlRoot accepts CSIDL_* constants, unless BIF_NEWDIALOGSTYLE is used. */ + bi.lpszTitle = L"test_csidl_pidlroot"; + bi.lpfn = csidl_pidlroot_callback; + + bi.pidlRoot = LongToPtr(CSIDL_DRIVES); + pidl = SHBrowseForFolderW(&bi); + ok(!!pidl, "Unexpected pidl.\n"); + CoTaskMemFree(pidl); + + bi.pidlRoot = LongToPtr(CSIDL_DRIVES | 0xff00); + pidl = SHBrowseForFolderW(&bi); + ok(!!pidl, "Unexpected pidl.\n"); + CoTaskMemFree(pidl); + + /* Invalid CSIDL folder will not open a window */ + bi.pidlRoot = LongToPtr(0x000c); + pidl = SHBrowseForFolderW(&bi); + ok(!pidl, "Unexpected pidl.\n"); + + CoUninitialize(); +} + START_TEST(brsfolder) { test_click_make_new_folder_button(); test_selection(); + if (!winetest_platform_is_wine) test_csidl_pidlroot(); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11563
From: Attila Fidan <dev@print0.net> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=60063 Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/shell32/brsfolder.c | 37 +++++++++++++++++++++++----------- dlls/shell32/tests/brsfolder.c | 2 +- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/dlls/shell32/brsfolder.c b/dlls/shell32/brsfolder.c index ebaf01e7989..36607ca6573 100644 --- a/dlls/shell32/brsfolder.c +++ b/dlls/shell32/brsfolder.c @@ -50,6 +50,7 @@ typedef struct tagbrowse_info HWND hwndTreeView; LPBROWSEINFOW lpBrowseInfo; LPITEMIDLIST pidlRet; + LPITEMIDLIST pidlRoot; LAYOUT_DATA *layout; /* filled by LayoutInit, used by LayoutUpdate */ SIZE szMin; ULONG hNotify; /* change notification handle */ @@ -169,16 +170,6 @@ static void LayoutUpdate(HWND hwnd, LAYOUT_DATA *data, const LAYOUT_INFO *layout } } - -/****************************************************************************** - * InitializeTreeView [Internal] - * - * Called from WM_INITDIALOG handler. - * - * PARAMS - * hwndParent [I] The BrowseForFolder dialog - * root [I] ITEMIDLIST of the root shell folder - */ static void InitializeTreeView( browse_info *info ) { LPITEMIDLIST pidlParent, pidlChild; @@ -188,7 +179,7 @@ static void InitializeTreeView( browse_info *info ) IEnumIDList * pEnumChildren = NULL; HTREEITEM item; DWORD flags; - LPCITEMIDLIST root = info->lpBrowseInfo->pidlRoot; + LPCITEMIDLIST root = info->pidlRoot; TRACE("%p\n", info ); @@ -925,7 +916,7 @@ static BOOL BrsFolder_OnSetExpanded(browse_info *info, LPVOID selection, /* Move pidlCurrent behind the SHITEMIDs in pidlSelection, which are the root of * the sub-tree currently displayed. */ - pidlRoot = info->lpBrowseInfo->pidlRoot; + pidlRoot = info->pidlRoot; pidlCurrent = pidlSelection; while (!_ILIsEmpty(pidlRoot) && _ILIsEqualSimple(pidlRoot, pidlCurrent)) { pidlRoot = ILGetNext(pidlRoot); @@ -1030,6 +1021,8 @@ static INT BrsFolder_OnDestroy(browse_info *info) info->layout = NULL; } + ILFree(info->pidlRoot); + info->pidlRoot = NULL; SHChangeNotifyDeregister(info->hNotify); return 0; @@ -1230,15 +1223,35 @@ LPITEMIDLIST WINAPI SHBrowseForFolderW (LPBROWSEINFOW lpbi) hr = OleInitialize(NULL); if (lpbi->ulFlags & BIF_NEWDIALOGSTYLE) + { templateName = L"SHNEWBRSFORFOLDER_MSGBOX"; + info.pidlRoot = ILClone(lpbi->pidlRoot); + } else + { templateName = L"SHBRSFORFOLDER_MSGBOX"; + + if (IS_INTRESOURCE(lpbi->pidlRoot)) + { + hr = SHGetFolderLocation(NULL, LOWORD(lpbi->pidlRoot) | CSIDL_FLAG_CREATE, NULL, 0, &info.pidlRoot); + if (FAILED(hr)) + { + WARN("Failed to create a PIDL for folder %#x, hr %#lx.\n", LOWORD(lpbi->pidlRoot), hr); + return NULL; + } + } + else + { + info.pidlRoot = ILClone(lpbi->pidlRoot); + } + } r = DialogBoxParamW( shell32_hInstance, templateName, lpbi->hwndOwner, BrsFolderDlgProc, (LPARAM)&info ); if (SUCCEEDED(hr)) OleUninitialize(); if (!r) { + ILFree(info.pidlRoot); ILFree(info.pidlRet); return NULL; } diff --git a/dlls/shell32/tests/brsfolder.c b/dlls/shell32/tests/brsfolder.c index f06a185ac4b..95bfb0c7d4a 100644 --- a/dlls/shell32/tests/brsfolder.c +++ b/dlls/shell32/tests/brsfolder.c @@ -410,5 +410,5 @@ START_TEST(brsfolder) { test_click_make_new_folder_button(); test_selection(); - if (!winetest_platform_is_wine) test_csidl_pidlroot(); + test_csidl_pidlroot(); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11563
This merge request was approved by Nikolay Sivov. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11563
Windows CI systray failures appear to be unrelated https://test.winehq.org/data/tests/shell32:systray.html. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11563#note_147739
participants (2)
-
Attila Fidan -
Nikolay Sivov (@nsivov)