fix(terminal): close terminal window on disconnect dialog

Signed-off-by: fufesou <linlong1266@gmail.com>
This commit is contained in:
fufesou
2026-04-28 19:47:57 +08:00
parent 59f3060a04
commit c4542b4a5d
3 changed files with 20 additions and 4 deletions

View File

@@ -718,7 +718,9 @@ closeConnection({String? id}) {
final controller = Get.find<DesktopTabController>(); final controller = Get.find<DesktopTabController>();
if (controller.tabType == DesktopTabType.terminal && if (controller.tabType == DesktopTabType.terminal &&
controller.onCloseWindow != null) { controller.onCloseWindow != null) {
controller.onCloseWindow!(); unawaited(controller.onCloseWindow!().catchError((e, _) {
debugPrint('[closeConnection] Failed to close terminal window: $e');
}));
return; return;
} }
controller.closeBy(id); controller.closeBy(id);
@@ -4184,8 +4186,7 @@ Widget? buildAvatarWidget({
width: size, width: size,
height: size, height: size,
fit: BoxFit.cover, fit: BoxFit.cover,
errorBuilder: (_, __, ___) => errorBuilder: (_, __, ___) => fallback ?? SizedBox.shrink(),
fallback ?? SizedBox.shrink(),
), ),
); );
} }

View File

@@ -371,6 +371,12 @@ class _TerminalTabPageState extends State<TerminalTabPage> {
final sortedSessions = persistentSessions.whereType<int>().toList()..sort(); final sortedSessions = persistentSessions.whereType<int>().toList()..sort();
var peerId = args['peer_id'] as String? ?? ''; var peerId = args['peer_id'] as String? ?? '';
if (peerId.isEmpty) { if (peerId.isEmpty) {
if (tabController.state.value.tabs.isEmpty ||
tabController.state.value.selected >=
tabController.state.value.tabs.length) {
debugPrint('[TerminalTabPage] Skip restore: no selected tab');
return;
}
final currentTab = tabController.state.value.selectedTabInfo; final currentTab = tabController.state.value.selectedTabInfo;
final parsed = _parseTabKey(currentTab.key); final parsed = _parseTabKey(currentTab.key);
if (parsed == null) return; if (parsed == null) return;
@@ -381,6 +387,11 @@ class _TerminalTabPageState extends State<TerminalTabPage> {
.where((parsed) => parsed != null && parsed.$1 == peerId) .where((parsed) => parsed != null && parsed.$1 == peerId)
.map((parsed) => parsed!.$2) .map((parsed) => parsed!.$2)
.toSet(); .toSet();
if (existingTerminalIds.isEmpty) {
debugPrint(
'[TerminalTabPage] Skip restore: no seed tab for peer $peerId');
return;
}
for (final terminalId in sortedSessions) { for (final terminalId in sortedSessions) {
if (!existingTerminalIds.add(terminalId)) { if (!existingTerminalIds.add(terminalId)) {
continue; continue;

View File

@@ -1059,7 +1059,11 @@ impl TerminalServiceProxy {
let mut opened = TerminalOpened::new(); let mut opened = TerminalOpened::new();
opened.terminal_id = open.terminal_id; opened.terminal_id = open.terminal_id;
opened.success = true; opened.success = true;
opened.message = "Reconnected to existing terminal".to_string(); opened.message = if has_pending {
"Reconnected to existing terminal with pending output".to_string()
} else {
"Reconnected to existing terminal".to_string()
};
opened.pid = session.pid; opened.pid = session.pid;
opened.service_id = self.service_id.clone(); opened.service_id = self.service_id.clone();
if service.needs_session_sync { if service.needs_session_sync {