diff --git a/reactos/base/applications/clipbrd/clipbrd.c b/reactos/base/applications/clipbrd/clipbrd.c index 7c773eef129..28f85f51cdf 100644 --- a/reactos/base/applications/clipbrd/clipbrd.c +++ b/reactos/base/applications/clipbrd/clipbrd.c @@ -13,6 +13,20 @@ static const WCHAR szClassName[] = L"ClipBookWClass"; CLIPBOARD_GLOBALS Globals; SCROLLSTATE Scrollstate; +static void UpdateLinesToScroll(void) +{ + UINT uLinesToScroll; + + if (!SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &uLinesToScroll, 0)) + { + Globals.uLinesToScroll = 3; + } + else + { + Globals.uLinesToScroll = uLinesToScroll; + } +} + static void SaveClipboardToFile(void) { OPENFILENAMEW sfn; @@ -122,7 +136,7 @@ static void SetDisplayFormat(UINT uFormat) } else { - Globals.uDisplayFormat = uFormat; + Globals.uDisplayFormat = uFormat; } if (Globals.hDspBmp) @@ -344,6 +358,12 @@ static LRESULT WINAPI MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lP break; } + case WM_MOUSEWHEEL: + { + HandleMouseScrollEvents(hWnd, uMsg, wParam, lParam, &Scrollstate); + break; + } + case WM_HSCROLL: { HandleHorizontalScrollEvents(hWnd, uMsg, wParam, lParam, &Scrollstate); @@ -475,6 +495,15 @@ static LRESULT WINAPI MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lP break; } + case WM_SETTINGCHANGE: + { + if (wParam == SPI_SETWHEELSCROLLLINES) + { + UpdateLinesToScroll(); + } + break; + } + default: { return DefWindowProc(hWnd, uMsg, wParam, lParam); @@ -545,6 +574,8 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi ShowLastWin32Error(Globals.hMainWnd); } + UpdateLinesToScroll(); + while (GetMessageW(&msg, 0, 0, 0)) { if (!TranslateAcceleratorW(Globals.hMainWnd, hAccel, &msg)) diff --git a/reactos/base/applications/clipbrd/cliputils.c b/reactos/base/applications/clipbrd/cliputils.c index 006fee7c5cb..a2f6cc33cfe 100644 --- a/reactos/base/applications/clipbrd/cliputils.c +++ b/reactos/base/applications/clipbrd/cliputils.c @@ -108,17 +108,21 @@ void DeleteClipboardContent(void) ShowLastWin32Error(Globals.hMainWnd); } - if (!CloseClipboard()) - { - ShowLastWin32Error(Globals.hMainWnd); - } + CloseClipboard(); } UINT GetAutomaticClipboardFormat(void) { - UINT uFormatList[] = {CF_UNICODETEXT, CF_ENHMETAFILE, CF_METAFILEPICT, CF_DIBV5, CF_DIB, CF_BITMAP}; + static UINT uFormatList[] = { + CF_UNICODETEXT, + CF_ENHMETAFILE, + CF_METAFILEPICT, + CF_DIBV5, + CF_DIB, + CF_BITMAP + }; - return GetPriorityClipboardFormat(uFormatList, 6); + return GetPriorityClipboardFormat(uFormatList, ARRAYSIZE(uFormatList)); } BOOL IsClipboardFormatSupported(UINT uFormat) diff --git a/reactos/base/applications/clipbrd/precomp.h b/reactos/base/applications/clipbrd/precomp.h index 16fbf9c393f..c03b2b90116 100644 --- a/reactos/base/applications/clipbrd/precomp.h +++ b/reactos/base/applications/clipbrd/precomp.h @@ -3,6 +3,8 @@ // #pragma once +#include + #include #include #include @@ -29,6 +31,7 @@ typedef struct _CLIPBOARD_GLOBALS HMENU hMenu; UINT uDisplayFormat; UINT uCheckedItem; + UINT uLinesToScroll; HBITMAP hDspBmp; } CLIPBOARD_GLOBALS; diff --git a/reactos/base/applications/clipbrd/scrollutils.c b/reactos/base/applications/clipbrd/scrollutils.c index 9b50387ae2e..89b43c27403 100644 --- a/reactos/base/applications/clipbrd/scrollutils.c +++ b/reactos/base/applications/clipbrd/scrollutils.c @@ -70,6 +70,53 @@ void HandleKeyboardScrollEvents(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar } } +void HandleMouseScrollEvents(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LPSCROLLSTATE state) +{ + SCROLLINFO si; + int Delta; + int NewPos; + + si.cbSize = sizeof(si); + si.fMask = SIF_PAGE; + GetScrollInfo(hWnd, SB_VERT, &si); + + if (Globals.uLinesToScroll == WHEEL_PAGESCROLL) + { + NewPos = si.nPage; + } + else + { + NewPos = Globals.uLinesToScroll * 5; + } + + if (GET_WHEEL_DELTA_WPARAM(wParam) > 0) + { + NewPos = state->CurrentY - NewPos; + } + else + { + NewPos = state->CurrentY + NewPos; + } + + NewPos = min(state->MaxY, max(0, NewPos)); + + if (NewPos == state->CurrentY) + { + return; + } + + Delta = NewPos - state->CurrentY; + + state->CurrentY = NewPos; + + ScrollWindowEx(hWnd, 0, -Delta, NULL, NULL, NULL, NULL, SW_INVALIDATE); + + si.cbSize = sizeof(si); + si.fMask = SIF_POS; + si.nPos = state->CurrentY; + SetScrollInfo(hWnd, SB_VERT, &si, TRUE); +} + void HandleHorizontalScrollEvents(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LPSCROLLSTATE state) { SCROLLINFO si; diff --git a/reactos/base/applications/clipbrd/scrollutils.h b/reactos/base/applications/clipbrd/scrollutils.h index a7448f04dfc..f696d551586 100644 --- a/reactos/base/applications/clipbrd/scrollutils.h +++ b/reactos/base/applications/clipbrd/scrollutils.h @@ -15,6 +15,7 @@ typedef struct _SCROLLSTATE } SCROLLSTATE, *LPSCROLLSTATE; void HandleKeyboardScrollEvents(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); +void HandleMouseScrollEvents(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LPSCROLLSTATE state); void HandleHorizontalScrollEvents(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LPSCROLLSTATE state); void HandleVerticalScrollEvents(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LPSCROLLSTATE state); void UpdateWindowScrollState(HWND hWnd, HBITMAP hBmp, LPSCROLLSTATE lpState);