From: Nikolay Sivov <nsivov@codeweavers.com> User modifications to the file name box are not reflected by CDM_GETFILEPATH when single item is selected. For multiple or empty selections it's simply concatentated. Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/comdlg32/filedlg.c | 51 ++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/dlls/comdlg32/filedlg.c b/dlls/comdlg32/filedlg.c index df9b84137b2..722b8839561 100644 --- a/dlls/comdlg32/filedlg.c +++ b/dlls/comdlg32/filedlg.c @@ -975,39 +975,54 @@ static INT_PTR FILEDLG95_Handle_GetFilePath(HWND hwnd, DWORD size, LPVOID result UINT len, total; WCHAR *p, *buffer, *filename = NULL; FileOpenDlgInfos *fodInfos = get_filedlg_infoptr(hwnd); + LPITEMIDLIST pidlSelection, pidlAbsolute; TRACE("CDM_GETFILEPATH:\n"); if ( ! (fodInfos->ofnInfos->Flags & OFN_EXPLORER ) ) return -1; - /* get path and filenames */ - len = SendMessageW( fodInfos->DlgInfos.hwndFileName, WM_GETTEXTLENGTH, 0, 0 ); - if (len) + if (GetNumSelected(fodInfos->Shell.FOIDataObject) == 1) { - filename = malloc( (len + 1) * sizeof(WCHAR) ); - SendMessageW( fodInfos->DlgInfos.hwndFileName, WM_GETTEXT, len + 1, (LPARAM)filename ); + if (!(buffer = malloc(MAX_PATH * 2 * sizeof(WCHAR)))) + return -1; + + pidlSelection = GetPidlFromDataObject(fodInfos->Shell.FOIDataObject, 1); + pidlAbsolute = ILCombine(fodInfos->ShellInfos.pidlAbsCurrent, pidlSelection); + COMDLG32_GetDisplayNameOf(pidlAbsolute, buffer); + ILFree(pidlSelection); + ILFree(pidlAbsolute); } - buffer = malloc( (len + 2 + MAX_PATH) * sizeof(WCHAR) ); - - if (len) + else { - if (PathIsRelativeW( filename )) + /* get path and filenames */ + len = SendMessageW( fodInfos->DlgInfos.hwndFileName, WM_GETTEXTLENGTH, 0, 0 ); + if (len) { - COMDLG32_GetDisplayNameOf( fodInfos->ShellInfos.pidlAbsCurrent, buffer ); - p = buffer + lstrlenW(buffer); - *p++ = '\\'; - lstrcpyW( p, filename ); + filename = malloc( (len + 1) * sizeof(WCHAR) ); + SendMessageW( fodInfos->DlgInfos.hwndFileName, WM_GETTEXT, len + 1, (LPARAM)filename ); + } + buffer = malloc( (len + 2 + MAX_PATH) * sizeof(WCHAR) ); + + if (len) + { + if (PathIsRelativeW( filename )) + { + COMDLG32_GetDisplayNameOf( fodInfos->ShellInfos.pidlAbsCurrent, buffer ); + p = buffer + lstrlenW(buffer); + *p++ = '\\'; + lstrcpyW( p, filename ); + } + else + { + lstrcpyW( buffer, filename ); + } } else { - lstrcpyW( buffer, filename ); + COMDLG32_GetDisplayNameOf( fodInfos->ShellInfos.pidlAbsCurrent, buffer ); } } - else - { - COMDLG32_GetDisplayNameOf( fodInfos->ShellInfos.pidlAbsCurrent, buffer ); - } if (fodInfos->unicode) { -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11695