diff options
author | Zufu Liu <unknown> | 2022-09-29 13:57:34 +1000 |
---|---|---|
committer | Zufu Liu <unknown> | 2022-09-29 13:57:34 +1000 |
commit | f35107b93b04e080b66e32dbc68688b9431c8364 (patch) | |
tree | 1559df1ea97487a34763ba4dcba694691fc0f9b5 | |
parent | 64ef03496c3fbfdb02cb3f5f2e103facb033760a (diff) | |
download | scintilla-mirror-f35107b93b04e080b66e32dbc68688b9431c8364.tar.gz |
Feature [feature-requests:#749] Implement horizontal scrolling with Shift +
mouse wheel. Also feature [feature-requests:#1451].
-rw-r--r-- | doc/ScintillaHistory.html | 5 | ||||
-rw-r--r-- | win32/ScintillaWin.cxx | 72 |
2 files changed, 45 insertions, 32 deletions
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index 5b6b21158..e1dc99479 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -602,6 +602,11 @@ <a href="https://sourceforge.net/p/scintilla/feature-requests/1450/">Feature #1450</a>. </li> <li> + On Win32 implement horizontal scrolling with Shift + mouse wheel. + <a href="https://sourceforge.net/p/scintilla/feature-requests/749/">Feature #749</a>, + <a href="https://sourceforge.net/p/scintilla/feature-requests/1451/">Feature #1451</a>. + </li> + <li> On Win32 ensure page and step clicks on horizontal scroll bar do not overshoot document width. </li> </ul> diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index cefa5a4f9..9ffd40d06 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -312,7 +312,9 @@ class ScintillaWin : SetCoalescableTimerSig SetCoalescableTimerFn; unsigned int linesPerScroll; ///< Intellimouse support + unsigned int charsPerScroll; ///< Intellimouse support MouseWheelDelta verticalWheelDelta; + MouseWheelDelta horizontalWheelDelta; UINT dpi = USER_DEFAULT_SCREEN_DPI; ReverseArrowCursor reverseArrowCursor; @@ -525,6 +527,7 @@ ScintillaWin::ScintillaWin(HWND hwnd) { SetCoalescableTimerFn = nullptr; linesPerScroll = 0; + charsPerScroll = 0; dpi = DpiForWindow(hwnd); @@ -1571,42 +1574,43 @@ sptr_t ScintillaWin::MouseMessage(unsigned int iMessage, uptr_t wParam, sptr_t l break; } - // Don't handle datazoom. - // (A good idea for datazoom would be to "fold" or "unfold" details. - // i.e. if datazoomed out only class structures are visible, when datazooming in the control - // structures appear, then eventually the individual statements...) - if (wParam & MK_SHIFT) { - return ::DefWindowProc(MainHWND(), iMessage, wParam, lParam); + // Treat Shift+WM_MOUSEWHEEL as horizontal scrolling, not data-zoom. + if (iMessage == WM_MOUSEHWHEEL || (wParam & MK_SHIFT)) { + if (vs.wrap.state != Wrap::None || charsPerScroll == 0) { + return ::DefWindowProc(MainHWND(), iMessage, wParam, lParam); + } + + MouseWheelDelta &wheelDelta = (iMessage == WM_MOUSEHWHEEL) ? horizontalWheelDelta : verticalWheelDelta; + if (wheelDelta.Accumulate(wParam)) { + const int charsToScroll = charsPerScroll * wheelDelta.Actions(); + const int widthToScroll = static_cast<int>(std::lround(charsToScroll * vs.aveCharWidth)); + HorizontalScrollToClamped(xOffset + widthToScroll); + } + return 0; } - if (iMessage == WM_MOUSEWHEEL) { - // Either SCROLL vertically or ZOOM. We handle the wheel steppings calculation - if (linesPerScroll != 0 && verticalWheelDelta.Accumulate(wParam)) { - Sci::Line linesToScroll = linesPerScroll; - if (linesPerScroll == WHEEL_PAGESCROLL) - linesToScroll = LinesOnScreen() - 1; - if (linesToScroll == 0) { - linesToScroll = 1; - } - linesToScroll *= verticalWheelDelta.Actions(); - - if (wParam & MK_CONTROL) { - // Zoom! We play with the font sizes in the styles. - // Number of steps/line is ignored, we just care if sizing up or down - if (linesToScroll < 0) { - KeyCommand(Message::ZoomIn); - } else { - KeyCommand(Message::ZoomOut); - } + + // Either SCROLL vertically or ZOOM. We handle the wheel steppings calculation + if (linesPerScroll != 0 && verticalWheelDelta.Accumulate(wParam)) { + Sci::Line linesToScroll = linesPerScroll; + if (linesPerScroll == WHEEL_PAGESCROLL) + linesToScroll = LinesOnScreen() - 1; + if (linesToScroll == 0) { + linesToScroll = 1; + } + linesToScroll *= verticalWheelDelta.Actions(); + + if (wParam & MK_CONTROL) { + // Zoom! We play with the font sizes in the styles. + // Number of steps/line is ignored, we just care if sizing up or down + if (linesToScroll < 0) { + KeyCommand(Message::ZoomIn); } else { - // Scroll - ScrollTo(topLine + linesToScroll); + KeyCommand(Message::ZoomOut); } + } else { + // Scroll + ScrollTo(topLine + linesToScroll); } - } else { // WM_MOUSEHWHEEL (horizontal scrolling) - SCROLLINFO sci { sizeof(sci), SIF_POS | SIF_RANGE, 0, 0, 0, 0, 0 }; - GetScrollInfo(SB_HORZ, &sci); - sci.nPos -= GET_WHEEL_DELTA_WPARAM(wParam); - HorizontalScrollTo(std::clamp(sci.nPos, sci.nMin, sci.nMax)); } return 0; } @@ -3152,6 +3156,10 @@ LRESULT ScintillaWin::ImeOnReconvert(LPARAM lParam) { void ScintillaWin::GetIntelliMouseParameters() noexcept { // This retrieves the number of lines per scroll as configured in the Mouse Properties sheet in Control Panel ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &linesPerScroll, 0); + if (!::SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &charsPerScroll, 0)) { + // no horizontal scrolling configuration on Windows XP + charsPerScroll = (linesPerScroll == WHEEL_PAGESCROLL) ? 3 : linesPerScroll; + } } void ScintillaWin::CopyToGlobal(GlobalMemory &gmUnicode, const SelectionText &selectedText) { |