Sync to Wine-0_9_4: Michael Jung mjung@iss.tu-darmstadt.de - shell32: Fix drag-scrolling in the shellview object. Stefan Leichter Stefan.Leichter@camLine.com - shell32: Fix return value of PathProcessCommand. Modified: trunk/reactos/lib/shell32/shellpath.c Modified: trunk/reactos/lib/shell32/shlview.c _____
Modified: trunk/reactos/lib/shell32/shellpath.c --- trunk/reactos/lib/shell32/shellpath.c 2005-12-26 23:20:19 UTC (rev 20352) +++ trunk/reactos/lib/shell32/shellpath.c 2005-12-26 23:23:03 UTC (rev 20353) @@ -700,7 +700,7 @@
/*********************************************************************** ** * PathProcessCommandA [SHELL32.653] */ -HRESULT WINAPI PathProcessCommandA ( +LONG WINAPI PathProcessCommandA ( LPCSTR lpszPath, LPSTR lpszBuff, DWORD dwBuffSize, @@ -708,14 +708,15 @@ { FIXME("%s %p 0x%04lx 0x%04lx stub\n", lpszPath, lpszBuff, dwBuffSize, dwFlags); - strcpy(lpszBuff, lpszPath); - return 0; + if(!lpszPath) return -1; + if(lpszBuff) strcpy(lpszBuff, lpszPath); + return strlen(lpszPath); }
/*********************************************************************** ** * PathProcessCommandW */ -HRESULT WINAPI PathProcessCommandW ( +LONG WINAPI PathProcessCommandW ( LPCWSTR lpszPath, LPWSTR lpszBuff, DWORD dwBuffSize, @@ -723,14 +724,15 @@ { FIXME("(%s, %p, 0x%04lx, 0x%04lx) stub\n", debugstr_w(lpszPath), lpszBuff, dwBuffSize, dwFlags); - strcpyW(lpszBuff, lpszPath); - return 0; + if(!lpszPath) return -1; + if(lpszBuff) strcpyW(lpszBuff, lpszPath); + return strlenW(lpszPath); }
/*********************************************************************** ** * PathProcessCommand (SHELL32.653) */ -HRESULT WINAPI PathProcessCommandAW ( +LONG WINAPI PathProcessCommandAW ( LPCVOID lpszPath, LPVOID lpszBuff, DWORD dwBuffSize, _____
Modified: trunk/reactos/lib/shell32/shlview.c --- trunk/reactos/lib/shell32/shlview.c 2005-12-26 23:20:19 UTC (rev 20352) +++ trunk/reactos/lib/shell32/shlview.c 2005-12-26 23:23:03 UTC (rev 20353) @@ -103,7 +103,8 @@
IDropTarget* pCurDropTarget; /* The sub-item, which is currently dragged over */ IDataObject* pCurDataObject; /* The dragged data-object */ LONG iDragOverItem; /* Dragged over item's index, iff pCurDropTarget != NULL */ - UINT iActiveTimersMask; /* Bookkeeping of activated timers for drag scrolling */ + UINT cScrollDelay; /* Send a WM_*SCROLL msg every 250 ms during drag-scroll */ + POINT ptLastMousePos; /* Mouse position at last DragOver call */ } IShellViewImpl;
static const IShellViewVtbl svvt; @@ -197,7 +198,9 @@ sv->pCurDropTarget = NULL; sv->pCurDataObject = NULL; sv->iDragOverItem = 0; - sv->iActiveTimersMask = 0; + sv->cScrollDelay = 0; + sv->ptLastMousePos.x = 0; + sv->ptLastMousePos.y = 0;
TRACE("(%p)->(%p)\n",sv, pFolder); return (IShellView *) sv; @@ -2179,48 +2182,6 @@ }
/*********************************************************************** ******* - * scroll_timer_proc [Internal] - * - * Timer callback function for drag&drop scrolling - */ - -#define IDT_UP 0x1u -#define IDT_DOWN 0x2u -#define IDT_LEFT 0x4u -#define IDT_RIGHT 0x8u - -VOID CALLBACK scroll_timer_proc(HWND hwnd, UINT uMsg, UINT_PTR idTimer, DWORD dwTimer) { - switch (idTimer) { - case IDT_UP: - SendMessageW(hwnd, WM_VSCROLL, SB_LINEUP, 0); - break; - case IDT_DOWN: - SendMessageW(hwnd, WM_VSCROLL, SB_LINEDOWN, 0); - break; - case IDT_LEFT: - SendMessageW(hwnd, WM_HSCROLL, SB_LINEUP, 0); - break; - case IDT_RIGHT: - SendMessageW(hwnd, WM_HSCROLL, SB_LINEDOWN, 0); - break; - } -} - -/********************************************************************** ******** - * start_stop_timer [Internal] - */ -static inline void start_stop_timer(IShellViewImpl *This, UINT_PTR idTimer, BOOL fStart) { - if (fStart && !(This->iActiveTimersMask & idTimer)) { - SetTimer(This->hWndList, idTimer, 200, scroll_timer_proc); - This->iActiveTimersMask |= idTimer; - } - if (!fStart && This->iActiveTimersMask & idTimer) { - KillTimer(This->hWndList, idTimer); - This->iActiveTimersMask &= ~idTimer; - } -} - -/********************************************************************** ******** * drag_notify_subitem [Internal] * * Figure out the shellfolder object, which is currently under the mouse cursor @@ -2246,13 +2207,28 @@ ScreenToClient(This->hWndList, &htinfo.pt); lResult = SendMessageW(This->hWndList, LVM_HITTEST, 0, (LPARAM)&htinfo);
- /* Start or stop the drag scrolling timers */ + /* Send WM_*SCROLL messages every 250 ms during drag-scrolling */ GetClientRect(This->hWndList, &clientRect); - start_stop_timer(This, IDT_LEFT, htinfo.pt.x < SCROLLAREAWIDTH); - start_stop_timer(This, IDT_RIGHT, htinfo.pt.x > clientRect.right - SCROLLAREAWIDTH); - start_stop_timer(This, IDT_UP, htinfo.pt.y < SCROLLAREAWIDTH); - start_stop_timer(This, IDT_DOWN, htinfo.pt.y > clientRect.bottom - SCROLLAREAWIDTH); - + if (htinfo.pt.x == This->ptLastMousePos.x && htinfo.pt.y == This->ptLastMousePos.y && + (htinfo.pt.x < SCROLLAREAWIDTH || htinfo.pt.x > clientRect.right - SCROLLAREAWIDTH || + htinfo.pt.y < SCROLLAREAWIDTH || htinfo.pt.y > clientRect.bottom - SCROLLAREAWIDTH )) + { + This->cScrollDelay = (This->cScrollDelay + 1) % 5; /* DragOver is called every 50 ms */ + if (This->cScrollDelay == 0) { /* Mouse did hover another 250 ms over the scroll-area */ + if (htinfo.pt.x < SCROLLAREAWIDTH) + SendMessageW(This->hWndList, WM_HSCROLL, SB_LINEUP, 0); + if (htinfo.pt.x > clientRect.right - SCROLLAREAWIDTH) + SendMessageW(This->hWndList, WM_HSCROLL, SB_LINEDOWN, 0); + if (htinfo.pt.y < SCROLLAREAWIDTH) + SendMessageW(This->hWndList, WM_VSCROLL, SB_LINEUP, 0); + if (htinfo.pt.y > clientRect.bottom - SCROLLAREAWIDTH) + SendMessageW(This->hWndList, WM_VSCROLL, SB_LINEDOWN, 0); + } + } else { + This->cScrollDelay = 0; /* Reset, if the cursor is not over the listview's scroll-area */ + } + This->ptLastMousePos = htinfo.pt; + /* If we are still over the previous sub-item, notify it via DragOver and return. */ if (This->pCurDropTarget && lResult == This->iDragOverItem) return IDropTarget_DragOver(This->pCurDropTarget, grfKeyState, pt, pdwEffect); @@ -2321,11 +2297,6 @@ This->pCurDropTarget = NULL; This->iDragOverItem = 0;
- start_stop_timer(This, IDT_LEFT, FALSE); - start_stop_timer(This, IDT_RIGHT, FALSE); - start_stop_timer(This, IDT_UP, FALSE); - start_stop_timer(This, IDT_DOWN, FALSE); - return S_OK; }
@@ -2342,11 +2313,6 @@ This->pCurDropTarget = NULL; This->iDragOverItem = 0;
- start_stop_timer(This, IDT_LEFT, FALSE); - start_stop_timer(This, IDT_RIGHT, FALSE); - start_stop_timer(This, IDT_UP, FALSE); - start_stop_timer(This, IDT_DOWN, FALSE); - return S_OK; }