Lagrange [work/v1.8]

macOS: Improved scrolling using mouse wheel

=> 556f803123480b35bc06c2171a0482e7111e457f

diff --git a/sdl2-macos-mouse-scrolling-patch.diff b/sdl2-macos-mouse-scrolling.diff
similarity index 67%
rename from sdl2-macos-mouse-scrolling-patch.diff
rename to sdl2-macos-mouse-scrolling.diff
index 633243ed..e2f30c24 100644
--- a/sdl2-macos-mouse-scrolling-patch.diff
+++ b/sdl2-macos-mouse-scrolling.diff
@@ -1,6 +1,6 @@
 diff -r 4f06c06b6d19 src/events/SDL_mouse.c
 --- a/src/events/SDL_mouse.c    Wed Aug 05 15:28:51 2020 +0200
-+++ b/src/events/SDL_mouse.c    Tue Sep 15 07:54:17 2020 +0300
++++ b/src/events/SDL_mouse.c    Tue Nov 10 12:16:06 2020 +0200
 @@ -642,8 +642,8 @@
          event.wheel.preciseX = x;
          event.wheel.preciseY = y;
@@ -14,8 +14,8 @@ diff -r 4f06c06b6d19 src/events/SDL_mouse.c
      }
 diff -r 4f06c06b6d19 src/video/cocoa/SDL_cocoamouse.m
 --- a/src/video/cocoa/SDL_cocoamouse.m  Wed Aug 05 15:28:51 2020 +0200
-+++ b/src/video/cocoa/SDL_cocoamouse.m  Tue Sep 15 07:54:17 2020 +0300
-@@ -424,8 +424,8 @@
++++ b/src/video/cocoa/SDL_cocoamouse.m  Tue Nov 10 12:16:06 2020 +0200
+@@ -424,10 +424,16 @@
      }
  
      SDL_MouseID mouseID = mouse->mouseID;
@@ -25,4 +25,12 @@ diff -r 4f06c06b6d19 src/video/cocoa/SDL_cocoamouse.m
 +    CGFloat y = [event scrollingDeltaY];
      SDL_MouseWheelDirection direction = SDL_MOUSEWHEEL_NORMAL;
  
++    /* HACK: Make a distinction between precise and imprecise scrolling.
++       Trackpad seems to be mouseID 0. */
++    if (![event hasPreciseScrollingDeltas]) {
++        mouseID = 1;
++    }
++
      if ([event respondsToSelector:@selector(isDirectionInvertedFromDevice)]) {
+         if ([event isDirectionInvertedFromDevice] == YES) {
+             direction = SDL_MOUSEWHEEL_FLIPPED;
diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c
index a4bf38dc..c71758be 100644
--- a/src/ui/documentwidget.c
+++ b/src/ui/documentwidget.c
@@ -1891,21 +1891,32 @@ static iBool processEvent_DocumentWidget_(iDocumentWidget *d, const SDL_Event *e
             }
         }
 #if defined (iPlatformApple)
-        /* Momentum scrolling. */
-        stop_Anim(&d->scrollY);
-        scroll_DocumentWidget_(d, -ev->wheel.y * get_Window()->pixelRatio * acceleration);
-#else
-        if (keyMods_Sym(SDL_GetModState()) == KMOD_PRIMARY) {
-            postCommandf_App("zoom.delta arg:%d", ev->wheel.y > 0 ? 10 : -10);
-            return iTrue;
+        /* On macOS, we handle both trackpad and mouse events. We expect SDL to identify
+           which device is sending the event. */
+        if (ev->wheel.which == 0) { /* Trackpad with precise scrolling w/inertia. */
+            stop_Anim(&d->scrollY);
+            scroll_DocumentWidget_(d, -ev->wheel.y * get_Window()->pixelRatio * acceleration);
         }
-        smoothScroll_DocumentWidget_(
-            d,
-            -3 * ev->wheel.y * lineHeight_Text(paragraph_FontId) * acceleration,
-            smoothDuration_DocumentWidget_ *
-                (!isFinished_Anim(&d->scrollY) && pos_Anim(&d->scrollY) < 0.25f ? 0.5f : 1.0f));
-            /* accelerated speed for repeated wheelings */
+        else
+#endif
+        /* Traditional mouse wheel. */ {
+#if defined (iPlatformApple)
+            /* Disregard wheel acceleration applied by the OS. */
+            const int amount = iSign(ev->wheel.y);
+#else
+            const int amount = ev->wheel.y;
 #endif
+            if (keyMods_Sym(SDL_GetModState()) == KMOD_PRIMARY) {
+                postCommandf_App("zoom.delta arg:%d", amount > 0 ? 10 : -10);
+                return iTrue;
+            }
+            smoothScroll_DocumentWidget_(
+                d,
+                -3 * amount * lineHeight_Text(paragraph_FontId) * acceleration,
+                smoothDuration_DocumentWidget_ *
+                    (!isFinished_Anim(&d->scrollY) && pos_Anim(&d->scrollY) < 0.25f ? 0.5f : 1.0f));
+                /* accelerated speed for repeated wheelings */
+        }
         iChangeFlags(d->flags, noHoverWhileScrolling_DocumentWidgetFlag, iTrue);
         return iTrue;
     }
Proxy Information
Original URL
gemini://git.skyjake.fi/lagrange/work%2Fv1.8/cdiff/556f803123480b35bc06c2171a0482e7111e457f
Status Code
Success (20)
Meta
text/gemini; charset=utf-8
Capsule Response Time
53.487542 milliseconds
Gemini-to-HTML Time
0.261884 milliseconds

This content has been proxied by September (ba2dc).