Files
rustdesk/flutter/lib/models/terminal_scroll_controller.dart
T
rustdesk 6a0eb9a1fd fix(terminal): preserve trackpad scrolling in alternate screen
Prevent the inner terminal scrollable from accepting user scrolling in the alternate buffer, so xterm's existing outer handler receives trackpad gestures after main-screen history.

Keep wheel encoding and drag reporting unchanged. Cover trackpad forwarding, subsequent drag coordinates, arrow fallback, and return to local scrollback.
2026-09-22 11:45:05 +08:00

37 lines
1.1 KiB
Dart

import 'package:flutter/widgets.dart';
import 'package:xterm/xterm.dart';
class TerminalScrollController extends ScrollController {
TerminalScrollController(this.terminal);
final Terminal Function() terminal;
@override
ScrollPosition createScrollPosition(ScrollPhysics physics,
ScrollContext context, ScrollPosition? oldPosition) {
return super.createScrollPosition(
_TerminalScrollPhysics(terminal, parent: physics),
context,
oldPosition,
);
}
}
class _TerminalScrollPhysics extends ScrollPhysics {
const _TerminalScrollPhysics(this.terminal, {super.parent});
final Terminal Function() terminal;
@override
_TerminalScrollPhysics applyTo(ScrollPhysics? ancestor) =>
_TerminalScrollPhysics(terminal, parent: buildParent(ancestor));
@override
bool shouldAcceptUserOffset(ScrollMetrics position) {
// A retained main-screen offset can make this inner scrollable win the
// trackpad gesture, starving xterm's outer alternate-screen scroll handler.
if (terminal().isUsingAltBuffer) return false;
return super.shouldAcceptUserOffset(position);
}
}