gitk: fix trackpad scrolling for Tcl/Tk 8.7+

TIP 684 [1] introduced TouchpadScroll events in Tcl/Tk 8.7, separating trackpad gestures from traditional MouseWheel events. This broke trackpad scrolling in gitk where trackpads generate TouchpadScroll events instead of MouseWheel events. Fix that by adding TouchpadScroll event bindings for all scrollable widgets following the TIP 684 specification. Implement a new precisescrollval proc to handle the smaller delta values from TouchpadScroll events, using appropriate scaling factors that seem sensible on my MacBook. Fixes https://github.com/j6t/gitk/issues/31. [1]: https://core.tcl-lang.org/tips/doc/main/tip/684.md Signed-off-by: Ruoyu Zhong <zhongruoyu@outlook.com>

Ruoyu Zhong committed Aug 27, 2025 at 10:12 UTC 432669914b2fb812bc62e3b52176a8bfc8e4d667
1 file changed +24
gitk
+24
@@ -2301,6 +2301,11 @@ proc scrollval {D {koff 0}} {
2301 return [expr int(-($D / $scroll_D0) * max(1, $kscroll-$koff))]
2302 }
2303
2304 +proc precisescrollval {D {koff 0}} {
2305 + global kscroll
2306 + return [expr (-($D / 10.0) * max(1, $kscroll-$koff))]
2307 +}
2308 +
2309 proc bind_mousewheel {} {
2310 global canv cflist ctext
2311 bindall <MouseWheel> {allcanvs yview scroll [scrollval %D] units}
@@ -2319,6 +2324,25 @@ proc bind_mousewheel {} {
2324 bind $cflist <Alt-MouseWheel> {$cflist yview scroll [scrollval 5*%D 2] units}
2325 bind $cflist <Alt-Shift-MouseWheel> break
2326 bind $canv <Alt-Shift-MouseWheel> {$canv xview scroll [scrollval 5*%D] units}
2327 +
2328 + bindall <TouchpadScroll> {
2329 + lassign [tk::PreciseScrollDeltas %D] deltaX deltaY
2330 + allcanvs yview scroll [precisescrollval $deltaY] units
2331 + }
2332 + bind $ctext <TouchpadScroll> {
2333 + lassign [tk::PreciseScrollDeltas %D] deltaX deltaY
2334 + $ctext yview scroll [precisescrollval $deltaY 2] units
2335 + $ctext xview scroll [precisescrollval $deltaX 2] units
2336 + }
2337 + bind $cflist <TouchpadScroll> {
2338 + lassign [tk::PreciseScrollDeltas %D] deltaX deltaY
2339 + $cflist yview scroll [precisescrollval $deltaY 2] units
2340 + }
2341 + bind $canv <TouchpadScroll> {
2342 + lassign [tk::PreciseScrollDeltas %D] deltaX deltaY
2343 + $canv xview scroll [precisescrollval $deltaX] units
2344 + allcanvs yview scroll [precisescrollval $deltaY] units
2345 + }
2346 }
2347 }
2348