From 771457f37f0673c8fa1f6e11268b7b5885780813 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Sun, 26 Apr 2020 22:06:19 +0900 Subject: [PATCH] [SHELL32] Implement VK_DELETE on SHBrowseForFolder (#2661) Enable Del/Delete key to delete the selected folder in "Browse for Folder" dialog. You can use https://jira.reactos.org/secure/attachment/40118/getfolder.zip as a test program. CORE-7592 --- dll/win32/shell32/wine/brsfolder.c | 43 ++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/dll/win32/shell32/wine/brsfolder.c b/dll/win32/shell32/wine/brsfolder.c index be45792654f..cfe982d53d9 100644 --- a/dll/win32/shell32/wine/brsfolder.c +++ b/dll/win32/shell32/wine/brsfolder.c @@ -625,6 +625,40 @@ static HRESULT BrsFolder_Rename(browse_info *info, HTREEITEM rename) return S_OK; } +#ifdef __REACTOS__ +static void +BrsFolder_Delete(browse_info *info, HTREEITEM selected_item) +{ + TV_ITEMW item; + TV_ITEMDATA *item_data; + SHFILEOPSTRUCTW fileop = { info->hwndTreeView }; + WCHAR szzFrom[MAX_PATH + 1]; + + /* get item_data */ + item.mask = TVIF_HANDLE | TVIF_PARAM; + item.hItem = selected_item; + if (!SendMessageW(info->hwndTreeView, TVM_GETITEMW, 0, (LPARAM)&item)) + { + ERR("TVM_GETITEMW failed\n"); + return; + } + item_data = (TV_ITEMDATA *)item.lParam; + + /* get the path */ + if (!SHGetPathFromIDListW(item_data->lpifq, szzFrom)) + { + ERR("SHGetPathFromIDListW failed\n"); + return; + } + szzFrom[lstrlenW(szzFrom) + 1] = 0; /* double NULL-terminated */ + fileop.pFrom = szzFrom; + + /* delete folder */ + fileop.fFlags = FOF_ALLOWUNDO; + fileop.wFunc = FO_DELETE; + SHFileOperationW(&fileop); +} +#endif static LRESULT BrsFolder_Treeview_Keydown(browse_info *info, LPNMTVKEYDOWN keydown) { HTREEITEM selected_item; @@ -643,14 +677,7 @@ static LRESULT BrsFolder_Treeview_Keydown(browse_info *info, LPNMTVKEYDOWN keydo case VK_DELETE: { #ifdef __REACTOS__ - /********************************************************* - FIXME: Add a proper alternative implementation for ReactOS - - NOTES: Wine makes use of the ISFHelper interface, which we - don't have in ReactOS. - It's defined in dlls/shell32/shellfolder.h and implemented - in dlls/shell32/shfldr_fs.c on Wine's side. - *********************************************************/ + BrsFolder_Delete(info, selected_item); #else const ITEMIDLIST *item_id; ISFHelper *psfhlp;