From fdbce6c016c40645423c56a66186b0961443b0b0 Mon Sep 17 00:00:00 2001 From: folays Date: Tue, 9 Feb 2021 05:19:54 +0100 Subject: [PATCH 1/2] fix scroll-x on touchpad (prevent bubbling scroll-y events and lock further wheeling events to parent window, if children window has interest for scroll-x) --- imgui.cpp | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/imgui.cpp b/imgui.cpp index 48b6f8ca7cdd..21933acfd863 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -3655,28 +3655,22 @@ void ImGui::UpdateMouseWheel() // If a child window has the ImGuiWindowFlags_NoScrollWithMouse flag, we give a chance to scroll its parent // Vertical Mouse Wheel scrolling - const float wheel_y = (g.IO.MouseWheel != 0.0f && !g.IO.KeyShift) ? g.IO.MouseWheel : 0.0f; - if (wheel_y != 0.0f && !g.IO.KeyCtrl) + const float wheel_y = (!g.IO.KeyShift) ? g.IO.MouseWheel : 0.0f; + // Horizontal Mouse Wheel scrolling, or Vertical Mouse Wheel w/ Shift held + const float wheel_x = (!g.IO.KeyShift) ? g.IO.MouseWheelH : g.IO.MouseWheel; + if ((wheel_y != 0.0f || wheel_x != 0.0f) && !g.IO.KeyCtrl) { - StartLockWheelingWindow(window); - while ((window->Flags & ImGuiWindowFlags_ChildWindow) && ((window->ScrollMax.y == 0.0f) || ((window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs)))) + bool noScroll = (window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs); + while ((window->Flags & ImGuiWindowFlags_ChildWindow) && ((window->ScrollMax.y == 0.0f && window->ScrollMax.x == 0.0f) || noScroll)) window = window->ParentWindow; - if (!(window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs)) + StartLockWheelingWindow(window); + if (!noScroll && wheel_y != 0.0f) { float max_step = window->InnerRect.GetHeight() * 0.67f; float scroll_step = ImFloor(ImMin(5 * window->CalcFontSize(), max_step)); SetScrollY(window, window->Scroll.y - wheel_y * scroll_step); } - } - - // Horizontal Mouse Wheel scrolling, or Vertical Mouse Wheel w/ Shift held - const float wheel_x = (g.IO.MouseWheelH != 0.0f && !g.IO.KeyShift) ? g.IO.MouseWheelH : (g.IO.MouseWheel != 0.0f && g.IO.KeyShift) ? g.IO.MouseWheel : 0.0f; - if (wheel_x != 0.0f && !g.IO.KeyCtrl) - { - StartLockWheelingWindow(window); - while ((window->Flags & ImGuiWindowFlags_ChildWindow) && ((window->ScrollMax.x == 0.0f) || ((window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs)))) - window = window->ParentWindow; - if (!(window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs)) + if (!noScroll && wheel_x != 0.0f) { float max_step = window->InnerRect.GetWidth() * 0.67f; float scroll_step = ImFloor(ImMin(2 * window->CalcFontSize(), max_step)); From 2c78ecd1ea27f99d45eb307b21b419724b3a920e Mon Sep 17 00:00:00 2001 From: folays Date: Wed, 28 Sep 2022 00:53:31 +0200 Subject: [PATCH 2/2] Fix correctly re-evaluating noScroll boolean for every parent window --- imgui.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/imgui.cpp b/imgui.cpp index 4f3d26117036..5cefe88d5641 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -4299,9 +4299,15 @@ void ImGui::UpdateMouseWheel() if (wheel_y != 0.0f || wheel_x != 0.0f) { StartLockWheelingWindow(window); - bool noScroll = (window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs); - while ((window->Flags & ImGuiWindowFlags_ChildWindow) && ((window->ScrollMax.y == 0.0f && window->ScrollMax.x == 0.0f) || noScroll)) - window = window->ParentWindow; + bool noScroll; + while (1) { + noScroll = (window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs); + if ((window->Flags & ImGuiWindowFlags_ChildWindow) && ((window->ScrollMax.y == 0.0f && window->ScrollMax.x == 0.0f) || noScroll)) { + window = window->ParentWindow; + continue; + } + break; + } // Vertical Mouse Wheel scrolling if (!noScroll && wheel_y != 0.0f)