From 36400c7dc9c8d46f956f42d4bdbb6fe7b3f8c30a Mon Sep 17 00:00:00 2001 From: Alan Third Date: Thu, 2 Nov 2017 21:41:11 +0000 Subject: [PATCH] Fix mouse-scrollbar offset on GNUstep and old macOS (bug#29053) * src/nsterm.m (EmacsScroller::mouseDown, EmacsScroller::mouseDragged): Take scroller buttons into account when calculating scroller knob position. --- src/nsterm.m | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/nsterm.m b/src/nsterm.m index a382e5f7130..5c29f039e51 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -8912,10 +8912,20 @@ - (void)mouseDown: (NSEvent *)e } last_mouse_offset = kloc; - if (part != NSScrollerKnob) - /* this is a slot click on GNUstep: go straight there */ + /* if knob, tell emacs a location offset by knob pos + (to indicate top of handle) */ + if (part == NSScrollerKnob) + pos = (loc - last_mouse_offset); + else + /* else this is a slot click on GNUstep: go straight there */ pos = loc; + /* If there are buttons in the scroller area, we need to + recalculate pos as emacs expects the scroller slot to take up + the entire available length. */ + if (length != pixel_length) + pos = pos * pixel_length / length; + /* send a fake mouse-up to super to preempt modal -trackKnob: mode */ fake_event = [NSEvent mouseEventWithType: NSEventTypeLeftMouseUp location: [e locationInWindow] @@ -8980,6 +8990,13 @@ - (void)mouseDragged: (NSEvent *)e } pos = (loc - last_mouse_offset); + + /* If there are buttons in the scroller area, we need to + recalculate pos as emacs expects the scroller slot to take up + the entire available length. */ + if (length != pixel_length) + pos = pos * pixel_length / length; + [self sendScrollEventAtLoc: pos fromEvent: e]; }