diff --git a/flutter/lib/main.dart b/flutter/lib/main.dart index dbf563de2..8edd3a356 100644 --- a/flutter/lib/main.dart +++ b/flutter/lib/main.dart @@ -268,10 +268,12 @@ hideCmWindow({bool isStartup = false}) async { await windowManager.hide(); }); } else { - await windowManager.setOpacity(0); - bind.mainHideDocker(); - await windowManager.minimize(); - await windowManager.hide(); + if (await windowManager.getOpacity() != 0) { + await windowManager.setOpacity(0); + bind.mainHideDocker(); + await windowManager.minimize(); + await windowManager.hide(); + } } } diff --git a/flutter/lib/models/server_model.dart b/flutter/lib/models/server_model.dart index 8f56ffbe2..716c535ad 100644 --- a/flutter/lib/models/server_model.dart +++ b/flutter/lib/models/server_model.dart @@ -36,6 +36,7 @@ class ServerModel with ChangeNotifier { String _verificationMethod = ""; String _temporaryPasswordLength = ""; String _approveMode = ""; + int _zeroClientLengthCounter = 0; late String _emptyIdShow; late final IDTextEditingController _serverId; @@ -120,6 +121,17 @@ class ServerModel with ChangeNotifier { _emptyIdShow = translate("Generating ..."); _serverId = IDTextEditingController(text: _emptyIdShow); + // initital _hideCm at startup + final verificationMethod = + bind.mainGetOptionSync(key: "verification-method"); + final approveMode = bind.mainGetOptionSync(key: 'approve-mode'); + _hideCm = option2bool( + 'allow-hide-cm', bind.mainGetOptionSync(key: 'allow-hide-cm')); + if (!(approveMode == 'password' && + verificationMethod == kUsePermanentPassword)) { + _hideCm = false; + } + timerCallback() async { final connectionStatus = jsonDecode(await bind.mainGetConnectStatus()) as Map; @@ -134,6 +146,17 @@ class ServerModel with ChangeNotifier { if (res != null) { debugPrint("clients not match!"); updateClientState(res); + } else { + if (_clients.isEmpty) { + hideCmWindow(); + if (_zeroClientLengthCounter++ == 12) { + // 6 second + windowManager.close(); + } + } else { + _zeroClientLengthCounter = 0; + if (!_hideCm) showCmWindow(); + } } } @@ -422,6 +445,7 @@ class ServerModel with ChangeNotifier { return; } + final oldClientLenght = _clients.length; _clients.clear(); tabController.state.value.tabs.clear(); @@ -434,6 +458,16 @@ class ServerModel with ChangeNotifier { debugPrint("Failed to decode clientJson '$clientJson', error $e"); } } + if (desktopType == DesktopType.cm) { + if (_clients.isEmpty) { + hideCmWindow(); + } else if (!_hideCm) { + showCmWindow(); + } + } + if (_clients.length != oldClientLenght) { + notifyListeners(); + } } void addConnection(Map evt) { @@ -461,6 +495,9 @@ class ServerModel with ChangeNotifier { _clients.removeAt(index_disconnected); tabController.remove(index_disconnected); } + if (desktopType == DesktopType.cm && !_hideCm) { + showCmWindow(); + } scrollToBottom(); notifyListeners(); if (isAndroid && !client.authorized) showLoginDialog(client); @@ -581,6 +618,9 @@ class ServerModel with ChangeNotifier { parent.target?.dialogManager.dismissByTag(getLoginDialogTag(id)); parent.target?.invokeMethod("cancel_notification", id); } + if (desktopType == DesktopType.cm && _clients.isEmpty) { + hideCmWindow(); + } notifyListeners(); } catch (e) { debugPrint("onClientRemove failed,error:$e");