From de3f52737aacd06abbe2a0b585529acca470f017 Mon Sep 17 00:00:00 2001 From: NotEnsoul Date: Mon, 27 Jul 2026 03:53:46 +0200 Subject: [PATCH] phlib: Implement horizontal scrolling via Shift + Mousewheel --- phlib/extlv.c | 22 ++++++++++++++++++++++ phlib/theme.c | 2 ++ phlib/treenew.c | 8 ++++++-- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/phlib/extlv.c b/phlib/extlv.c index f2cf1ea38bd2..3db189f79dd1 100644 --- a/phlib/extlv.c +++ b/phlib/extlv.c @@ -795,6 +795,28 @@ LRESULT CALLBACK PhpExtendedListViewWndProc( context->WindowDpi = listviewDpi; } break; + case WM_MOUSEWHEEL: + { + if (LOWORD(wParam) & MK_SHIFT) + { + SHORT wheelDelta = GET_WHEEL_DELTA_WPARAM(wParam); + ULONG wheelScrollChars; + + if (!PhGetSystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &wheelScrollChars, 0)) + wheelScrollChars = 3; + + LONG charsToScroll = (LONG)wheelScrollChars * -wheelDelta / WHEEL_DELTA; + LONG count = charsToScroll < 0 ? -charsToScroll : charsToScroll; + + for (LONG i = 0; i < count; i++) + { + SendMessage(WindowHandle, WM_HSCROLL, charsToScroll > 0 ? SB_LINERIGHT : SB_LINELEFT, 0); + } + + return 0; + } + } + break; } return CallWindowProc(oldWndProc, WindowHandle, WindowMessage, wParam, lParam); diff --git a/phlib/theme.c b/phlib/theme.c index 28d925486872..8cb52272c088 100644 --- a/phlib/theme.c +++ b/phlib/theme.c @@ -4717,7 +4717,9 @@ LRESULT CALLBACK PhpThemeWindowACLUISubclassProc( switch (uMsg) { case WM_VSCROLL: + case WM_HSCROLL: case WM_MOUSEWHEEL: + case WM_MOUSEHWHEEL: InvalidateRect(WindowHandle, NULL, FALSE); break; case WM_NOTIFY: diff --git a/phlib/treenew.c b/phlib/treenew.c index 5ca2137eefcc..5cfacf60bdd9 100644 --- a/phlib/treenew.c +++ b/phlib/treenew.c @@ -1624,8 +1624,12 @@ VOID PhTnpOnMouseWheel( ) { // The normal mouse wheel can affect both the vertical scrollbar and the horizontal scrollbar, - // but the vertical scrollbar takes precedence. - if (Context->VScrollVisible) + // but the vertical scrollbar takes precedence unless the Shift key is held for horizontal scrolling. + if ((VirtualKeys & MK_SHIFT) && Context->HScrollVisible) + { + PhTnpProcessMouseHWheel(Context, -Distance); + } + else if (Context->VScrollVisible) { PhTnpProcessMouseVWheel(Context, -Distance); }