Nikolay Sivov : shell32/shlview: Remove redundant message sent on every iteration, fix a helper interface leak.
Alexandre Julliard
julliard at winehq.org
Tue Apr 27 16:59:33 CDT 2010
Module: wine
Branch: master
Commit: fc59d0b2f89f656c409332ef03bee622f6d359bf
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fc59d0b2f89f656c409332ef03bee622f6d359bf
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue Apr 27 01:17:47 2010 +0400
shell32/shlview: Remove redundant message sent on every iteration, fix a helper interface leak.
---
dlls/shell32/shlview.c | 136 +++++++++++++++++++++++-------------------------
1 files changed, 65 insertions(+), 71 deletions(-)
diff --git a/dlls/shell32/shlview.c b/dlls/shell32/shlview.c
index d3322e4..01fee47 100644
--- a/dlls/shell32/shlview.c
+++ b/dlls/shell32/shlview.c
@@ -1517,98 +1517,92 @@ static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpn
case LVN_KEYDOWN:
{
- /* MSG msg;
- msg.hwnd = This->hWnd;
- msg.message = WM_KEYDOWN;
- msg.wParam = plvKeyDown->wVKey;
- msg.lParam = 0;
- msg.time = 0;
- msg.pt = 0;*/
-
LPNMLVKEYDOWN plvKeyDown = (LPNMLVKEYDOWN) lpnmh;
/* initiate a rename of the selected file or directory */
- if(plvKeyDown->wVKey == VK_F2)
+ switch (plvKeyDown->wVKey)
{
- /* see how many files are selected */
- int i = SendMessageW(This->hWndList, LVM_GETSELECTEDCOUNT, 0, 0);
-
- /* get selected item */
- if(i == 1)
+ case VK_F2:
{
- /* get selected item */
- i = SendMessageW(This->hWndList, LVM_GETNEXTITEM, -1, MAKELPARAM (LVNI_SELECTED, 0));
+ INT i = SendMessageW(This->hWndList, LVM_GETSELECTEDCOUNT, 0, 0);
- SendMessageW(This->hWndList, LVM_ENSUREVISIBLE, i, 0);
- SendMessageW(This->hWndList, LVM_EDITLABELW, i, 0);
+ if (i == 1)
+ {
+ /* get selected item */
+ i = SendMessageW(This->hWndList, LVM_GETNEXTITEM, -1, MAKELPARAM (LVNI_SELECTED, 0));
+
+ SendMessageW(This->hWndList, LVM_ENSUREVISIBLE, i, 0);
+ SendMessageW(This->hWndList, LVM_EDITLABELW, i, 0);
+ }
}
- }
-#if 0
- TranslateAccelerator(This->hWnd, This->hAccel, &msg)
-#endif
- else if(plvKeyDown->wVKey == VK_DELETE)
- {
- UINT i;
- int item_index;
- LVITEMA item;
- LPITEMIDLIST* pItems;
- ISFHelper *psfhlp;
+ break;
+ case VK_DELETE:
+ {
+ UINT i, count;
+ int item_index;
+ LVITEMW item;
+ LPITEMIDLIST* pItems;
+ ISFHelper *psfhlp;
+ HRESULT hr;
- IShellFolder_QueryInterface(This->pSFParent, &IID_ISFHelper,
- (LPVOID*)&psfhlp);
+ hr = IShellFolder_QueryInterface(This->pSFParent, &IID_ISFHelper, (void**)&psfhlp);
+ if (hr != S_OK) return 0;
- if (psfhlp == NULL)
- break;
+ if(!(count = SendMessageW(This->hWndList, LVM_GETSELECTEDCOUNT, 0, 0)))
+ {
+ ISFHelper_Release(psfhlp);
+ return 0;
+ }
- if(!(i = SendMessageW(This->hWndList, LVM_GETSELECTEDCOUNT, 0, 0)))
- break;
+ /* allocate memory for the pidl array */
+ pItems = HeapAlloc(GetProcessHeap(), 0, sizeof(LPITEMIDLIST) * count);
- /* allocate memory for the pidl array */
- pItems = HeapAlloc(GetProcessHeap(), 0,
- sizeof(LPITEMIDLIST) * i);
+ /* retrieve all selected items */
+ i = 0;
+ item_index = -1;
- /* retrieve all selected items */
- i = 0;
- item_index = -1;
- while(SendMessageW(This->hWndList, LVM_GETSELECTEDCOUNT, 0, 0) > i)
- {
- /* get selected item */
- item_index = SendMessageW(This->hWndList, LVM_GETNEXTITEM, item_index,
- MAKELPARAM (LVNI_SELECTED, 0));
- item.iItem = item_index;
- item.mask = LVIF_PARAM;
- SendMessageW(This->hWndList, LVM_GETITEMW, 0, (LPARAM) &item);
+ while (count > i)
+ {
+ /* get selected item */
+ item_index = SendMessageW(This->hWndList, LVM_GETNEXTITEM, item_index,
+ MAKELPARAM (LVNI_SELECTED, 0));
+ item.iItem = item_index;
+ item.mask = LVIF_PARAM;
+ SendMessageW(This->hWndList, LVM_GETITEMW, 0, (LPARAM)&item);
- /* get item pidl */
- pItems[i] = (LPITEMIDLIST)item.lParam;
+ /* get item pidl */
+ pItems[i] = (LPITEMIDLIST)item.lParam;
- i++;
- }
+ i++;
+ }
- /* perform the item deletion */
- ISFHelper_DeleteItems(psfhlp, i, (LPCITEMIDLIST*)pItems);
+ /* perform the item deletion */
+ ISFHelper_DeleteItems(psfhlp, i, (LPCITEMIDLIST*)pItems);
+ ISFHelper_Release(psfhlp);
- /* free pidl array memory */
- HeapFree(GetProcessHeap(), 0, pItems);
- }
+ /* free pidl array memory */
+ HeapFree(GetProcessHeap(), 0, pItems);
+ }
+ break;
- /* Initiate a refresh */
- else if(plvKeyDown->wVKey == VK_F5)
- {
+ case VK_F5:
+ /* Initiate a refresh */
IShellView_Refresh((IShellView*)This);
- }
+ break;
- else if(plvKeyDown->wVKey == VK_BACK)
- {
- LPSHELLBROWSER lpSb;
- if((lpSb = (LPSHELLBROWSER)SendMessageW(This->hWndParent, CWM_GETISHELLBROWSER, 0, 0)))
+ case VK_BACK:
{
- IShellBrowser_BrowseObject(lpSb, NULL, SBSP_PARENT);
- }
- }
+ LPSHELLBROWSER lpSb;
+ if((lpSb = (LPSHELLBROWSER)SendMessageW(This->hWndParent, CWM_GETISHELLBROWSER, 0, 0)))
+ {
+ IShellBrowser_BrowseObject(lpSb, NULL, SBSP_PARENT);
+ }
+ }
+ break;
- else
- FIXME("LVN_KEYDOWN key=0x%08x\n",plvKeyDown->wVKey);
+ default:
+ FIXME("LVN_KEYDOWN key=0x%08x\n", plvKeyDown->wVKey);
+ }
}
break;
More information about the wine-cvs
mailing list