diff --git a/glfw/cocoa_window.m b/glfw/cocoa_window.m index b275c7c58..261d56d69 100644 --- a/glfw/cocoa_window.m +++ b/glfw/cocoa_window.m @@ -925,16 +925,22 @@ is_ascii_control_char(char x) { switch([event momentumPhase]) { case NSEventPhaseBegan: flags |= (1 << 1); break; - case NSEventPhaseChanged: + case NSEventPhaseStationary: flags |= (2 << 1); break; - case NSEventPhaseEnded: + case NSEventPhaseChanged: flags |= (3 << 1); break; + case NSEventPhaseEnded: + flags |= (4 << 1); break; + case NSEventPhaseCancelled: + flags |= (5 << 1); break; + case NSEventPhaseMayBegin: + flags |= (6 << 1); break; + case NSEventPhaseNone: default: break; } - if (fabs(deltaX) > 0.0 || fabs(deltaY) > 0.0) - _glfwInputScroll(window, deltaX, deltaY, flags); + _glfwInputScroll(window, deltaX, deltaY, flags); } - (NSDragOperation)draggingEntered:(id )sender diff --git a/glfw/glfw3.h b/glfw/glfw3.h index 741cd8f83..7a9037d2a 100644 --- a/glfw/glfw3.h +++ b/glfw/glfw3.h @@ -1383,9 +1383,10 @@ typedef void (* GLFWcursorenterfun)(GLFWwindow*,int); * @param[in] flags A bit-mask providing extra data about the event. * flags & 1 will be true if and only if the offset values are "high-precision". * Typically pixel values. Otherwise the offset values are number of lines. - * (flags >> 1) & 3 will have value 1 for start of momentum scrolling, - * value 2 for momentum scrolling in progress and value 3 for momentum - * scrolling ended. + * (flags >> 1) & 7 will have value 1 for the start of momentum scrolling, + * value 2 for stationary momentum scrolling, value 3 for momentum scrolling + * in progress, value 4 for momentum scrolling ended, value 5 for momentum + * scrolling cancelled and value 6 if scrolling may begin soon. * * @sa @ref scrolling * @sa @ref glfwSetScrollCallback diff --git a/kitty/mouse.c b/kitty/mouse.c index 9c49ff6dc..60384d21b 100644 --- a/kitty/mouse.c +++ b/kitty/mouse.c @@ -569,22 +569,26 @@ scroll_event(double UNUSED xoffset, double yoffset, int flags) { } if (!w) return; - int s; - bool is_high_resolution = flags & 1; - Screen *screen = w->render_data.screen; - enum MomentumData { NoMomentumData, StartMomentumPhase, MomentumPhaseActive, MomentumPhaseEnded }; - enum MomentumData momentum_data = (flags >> 1) & 3; + enum MomentumData { NoMomentumData, MomentumPhaseBegan, MomentumPhaseStationary, MomentumPhaseActive, MomentumPhaseEnded, MomentumPhaseCancelled, MomentumPhaseMayBegin }; + enum MomentumData momentum_data = (flags >> 1) & 7; + switch(momentum_data) { - case StartMomentumPhase: + case MomentumPhaseBegan: window_for_momentum_scroll = w->id; break; case MomentumPhaseActive: if (window_for_momentum_scroll != w->id) return; break; case MomentumPhaseEnded: window_for_momentum_scroll = 0; break; - case NoMomentumData: + default: break; } + if (yoffset == 0.0) return; + + int s; + bool is_high_resolution = flags & 1; + Screen *screen = w->render_data.screen; + if (is_high_resolution) { yoffset *= OPT(touch_scroll_multiplier); if (yoffset * global_state.callback_os_window->pending_scroll_pixels < 0) {