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