From 1d09760ef7c9275555ac512d66fee5af549c5d06 Mon Sep 17 00:00:00 2001 From: fufesou Date: Tue, 11 Aug 2026 15:54:03 +0800 Subject: [PATCH] fix(terminal): keep selection aligned after clearing scrollback (#15831) Remove scrollback lines through the index-aware buffer operation so deleted anchors are detached and retained lines are reindexed. Signed-off-by: fufesou --- flutter/lib/models/rustdesk_terminal.dart | 14 ++++++++++++++ flutter/lib/models/terminal_model.dart | 3 ++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 flutter/lib/models/rustdesk_terminal.dart diff --git a/flutter/lib/models/rustdesk_terminal.dart b/flutter/lib/models/rustdesk_terminal.dart new file mode 100644 index 000000000..6e3f35dfd --- /dev/null +++ b/flutter/lib/models/rustdesk_terminal.dart @@ -0,0 +1,14 @@ +import 'package:xterm/xterm.dart'; + +class RustDeskTerminal extends Terminal { + RustDeskTerminal({super.maxLines}); + + @override + void eraseScrollbackOnly() { + final scrollBack = buffer.scrollBack; + if (scrollBack == 0) return; + + // Selection anchors require retained buffer lines to be reindexed. + buffer.lines.remove(0, scrollBack); + } +} diff --git a/flutter/lib/models/terminal_model.dart b/flutter/lib/models/terminal_model.dart index 0472cb483..63e831202 100644 --- a/flutter/lib/models/terminal_model.dart +++ b/flutter/lib/models/terminal_model.dart @@ -10,6 +10,7 @@ import 'package:xterm/xterm.dart'; import 'input_modifier_utils.dart'; import 'model.dart'; import 'platform_model.dart'; +import 'rustdesk_terminal.dart'; import 'terminal_mouse_handler.dart'; class TerminalModel with ChangeNotifier { @@ -129,7 +130,7 @@ class TerminalModel with ChangeNotifier { } TerminalModel(this.parent, [this.terminalId = 0]) : id = parent.id { - terminal = Terminal(maxLines: 10000); + terminal = RustDeskTerminal(maxLines: 10000); terminal.mouseHandler = const WheelButtonFixMouseHandler(); terminalController = TerminalController();