[PATCH 0/3] MR11695: comdlg32/filedlg: Improve CDM_GETFILEPATH when view has an active selection.
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> -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11695
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
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/comdlg32/filedlg.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/dlls/comdlg32/filedlg.c b/dlls/comdlg32/filedlg.c index 722b8839561..eb1b266da8d 100644 --- a/dlls/comdlg32/filedlg.c +++ b/dlls/comdlg32/filedlg.c @@ -999,10 +999,16 @@ static INT_PTR FILEDLG95_Handle_GetFilePath(HWND hwnd, DWORD size, LPVOID result len = SendMessageW( fodInfos->DlgInfos.hwndFileName, WM_GETTEXTLENGTH, 0, 0 ); if (len) { - filename = malloc( (len + 1) * sizeof(WCHAR) ); + if (!(filename = malloc((len + 1) * sizeof(WCHAR)))) + return -1; + SendMessageW( fodInfos->DlgInfos.hwndFileName, WM_GETTEXT, len + 1, (LPARAM)filename ); } - buffer = malloc( (len + 2 + MAX_PATH) * sizeof(WCHAR) ); + if (!(buffer = malloc((len + 2 + MAX_PATH) * sizeof(WCHAR)))) + { + free(filename); + return -1; + } if (len) { -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11695
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/comdlg32/filedlg.c | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/dlls/comdlg32/filedlg.c b/dlls/comdlg32/filedlg.c index eb1b266da8d..286b9f4581e 100644 --- a/dlls/comdlg32/filedlg.c +++ b/dlls/comdlg32/filedlg.c @@ -198,7 +198,6 @@ LPITEMIDLIST GetParentPidl(LPITEMIDLIST pidl); static LPITEMIDLIST GetPidlFromName(IShellFolder *psf,LPWSTR lpcstrFileName); static BOOL IsPidlFolder (LPSHELLFOLDER psf, LPCITEMIDLIST pidl); static UINT GetNumSelected( IDataObject *doSelected ); -static void COMCTL32_ReleaseStgMedium(STGMEDIUM medium); static INT_PTR CALLBACK FileOpenDlgProc95(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static INT_PTR FILEDLG95_HandleCustomDialogMessages(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -3879,7 +3878,7 @@ void FILEDLG95_FILENAME_FillFromSelection (HWND hwnd) ret: free(lpstrAllFiles); - COMCTL32_ReleaseStgMedium(medium); + ReleaseStgMedium(&medium); } /*********************************************************************** @@ -3912,24 +3911,6 @@ static int FILEDLG95_FILENAME_GetFileNames (HWND hwnd, LPWSTR * lpstrFileList, U * DATAOBJECT Helper functions */ -/*********************************************************************** - * COMCTL32_ReleaseStgMedium - * - * like ReleaseStgMedium from ole32 - */ -static void COMCTL32_ReleaseStgMedium (STGMEDIUM medium) -{ - if(medium.pUnkForRelease) - { - IUnknown_Release(medium.pUnkForRelease); - } - else - { - GlobalUnlock(medium.hGlobal); - GlobalFree(medium.hGlobal); - } -} - /*********************************************************************** * GetPidlFromDataObject * @@ -3957,7 +3938,7 @@ LPITEMIDLIST GetPidlFromDataObject ( IDataObject *doSelected, UINT nPidlIndex) { pidl = ILClone((LPITEMIDLIST)(&((LPBYTE)cida)[cida->aoffset[nPidlIndex]])); } - COMCTL32_ReleaseStgMedium(medium); + ReleaseStgMedium(&medium); } return pidl; } @@ -3983,7 +3964,7 @@ static UINT GetNumSelected( IDataObject *doSelected ) { LPIDA cida = GlobalLock(medium.hGlobal); retVal = cida->cidl; - COMCTL32_ReleaseStgMedium(medium); + ReleaseStgMedium(&medium); return retVal; } return 0; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11695
participants (2)
-
Nikolay Sivov -
Nikolay Sivov (@nsivov)