From 69062dca16acf7a38fabd1d461cccfaafdf6e522 Mon Sep 17 00:00:00 2001 From: dignow Date: Fri, 29 Sep 2023 21:42:49 +0800 Subject: [PATCH] fix, dialog button, reconnect cancel in a short time 1. Two `reconnect` is called. 2. The window cannot be closed. Signed-off-by: dignow --- flutter/lib/common.dart | 19 ++++++++++++++----- .../lib/desktop/pages/connection_page.dart | 1 - .../lib/desktop/pages/remote_tab_page.dart | 18 +++++++++++++++++- .../lib/desktop/widgets/tabbar_widget.dart | 2 -- flutter/lib/models/ab_model.dart | 1 - flutter/lib/models/model.dart | 1 - src/flutter.rs | 3 ++- 7 files changed, 33 insertions(+), 12 deletions(-) diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index 102b25bc9..2bd02fbf6 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -996,11 +996,20 @@ void msgBox(SessionID sessionId, String type, String title, String text, })); } if (reconnect != null && title == "Connection Error") { - buttons.insert( - 0, - dialogButton('Reconnect', isOutline: true, onPressed: () { - reconnect(dialogManager, sessionId, false); - })); + final enabled = true.obs; + final button = Obx( + () => dialogButton( + 'Reconnect', + isOutline: true, + onPressed: enabled.isTrue + ? () { + enabled.value = false; + reconnect(dialogManager, sessionId, false); + } + : null, + ), + ); + buttons.insert(0, button); } if (link.isNotEmpty) { buttons.insert(0, dialogButton('JumpLink', onPressed: jumplink)); diff --git a/flutter/lib/desktop/pages/connection_page.dart b/flutter/lib/desktop/pages/connection_page.dart index 9cfa1defc..359746f4c 100644 --- a/flutter/lib/desktop/pages/connection_page.dart +++ b/flutter/lib/desktop/pages/connection_page.dart @@ -7,7 +7,6 @@ import 'dart:io'; import 'package:auto_size_text/auto_size_text.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/desktop/widgets/scroll_wrapper.dart'; import 'package:flutter_hbb/models/state_model.dart'; import 'package:get/get.dart'; import 'package:url_launcher/url_launcher_string.dart'; diff --git a/flutter/lib/desktop/pages/remote_tab_page.dart b/flutter/lib/desktop/pages/remote_tab_page.dart index 509ef0120..8f1079e0d 100644 --- a/flutter/lib/desktop/pages/remote_tab_page.dart +++ b/flutter/lib/desktop/pages/remote_tab_page.dart @@ -415,8 +415,24 @@ class _ConnectionTabPageState extends State { void onRemoveId(String id) async { if (tabController.state.value.tabs.isEmpty) { - await WindowController.fromWindowId(windowId()).close(); stateGlobal.setFullscreen(false, procWnd: false); + // Keep calling until the window status is hidden. + // + // Workaround for Windows: + // If you click other buttons and close in msgbox within a very short period of time, the close may fail. + // `await WindowController.fromWindowId(windowId()).close();`. + Future loopCloseWindow() async { + int c = 0; + final windowController = WindowController.fromWindowId(windowId()); + while (c < 100 && + tabController.state.value.tabs.isEmpty && + (!await windowController.isHidden())) { + await windowController.close(); + await Future.delayed(Duration(milliseconds: 50)); + c++; + } + } + loopCloseWindow(); } ConnectionTypeState.delete(id); _update_remote_count(); diff --git a/flutter/lib/desktop/widgets/tabbar_widget.dart b/flutter/lib/desktop/widgets/tabbar_widget.dart index f95ee8923..dc58c1b5d 100644 --- a/flutter/lib/desktop/widgets/tabbar_widget.dart +++ b/flutter/lib/desktop/widgets/tabbar_widget.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:convert'; import 'dart:io'; import 'dart:math'; import 'dart:ui' as ui; @@ -9,7 +8,6 @@ import 'package:desktop_multi_window/desktop_multi_window.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart' hide TabBarTheme; import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/common/shared_state.dart'; import 'package:flutter_hbb/consts.dart'; import 'package:flutter_hbb/main.dart'; import 'package:flutter_hbb/models/platform_model.dart'; diff --git a/flutter/lib/models/ab_model.dart b/flutter/lib/models/ab_model.dart index 03fb5897f..8d6bfda2c 100644 --- a/flutter/lib/models/ab_model.dart +++ b/flutter/lib/models/ab_model.dart @@ -6,7 +6,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_hbb/common/widgets/peers_view.dart'; import 'package:flutter_hbb/models/model.dart'; import 'package:flutter_hbb/models/peer_model.dart'; -import 'package:flutter_hbb/models/peer_tab_model.dart'; import 'package:flutter_hbb/models/platform_model.dart'; import 'package:get/get.dart'; import 'package:bot_toast/bot_toast.dart'; diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index 02e02a8ba..01fe767ad 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -8,7 +8,6 @@ import 'package:desktop_multi_window/desktop_multi_window.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; import 'package:flutter_hbb/generated_bridge.dart'; import 'package:flutter_hbb/models/ab_model.dart'; import 'package:flutter_hbb/models/chat_model.dart'; diff --git a/src/flutter.rs b/src/flutter.rs index fe648ae2c..4440fe0c8 100644 --- a/src/flutter.rs +++ b/src/flutter.rs @@ -1078,7 +1078,8 @@ pub fn session_next_rgba(session_id: SessionID) { pub fn session_register_texture(_session_id: SessionID, _ptr: usize) { #[cfg(feature = "flutter_texture_render")] if let Some(session) = SESSIONS.write().unwrap().get_mut(&_session_id) { - return session.register_texture(_ptr); + session.register_texture(_ptr); + return; } }