diff --git a/flutter/lib/desktop/pages/server_page.dart b/flutter/lib/desktop/pages/server_page.dart index 1dd4a0563..206095345 100644 --- a/flutter/lib/desktop/pages/server_page.dart +++ b/flutter/lib/desktop/pages/server_page.dart @@ -107,6 +107,13 @@ class ConnectionManagerState extends State { @override Widget build(BuildContext context) { final serverModel = Provider.of(context); + final pointerHandler = serverModel.cmHiddenTimer != null + ? (PointerEvent e) { + serverModel.cmHiddenTimer!.cancel(); + serverModel.cmHiddenTimer = null; + debugPrint("CM hidden timer has been canceled"); + } + : null; return serverModel.clients.isEmpty ? Column( children: [ @@ -118,35 +125,38 @@ class ConnectionManagerState extends State { ), ], ) - : DesktopTab( - showTitle: false, - showMaximize: false, - showMinimize: true, - showClose: true, - controller: serverModel.tabController, - maxLabelWidth: 100, - tail: buildScrollJumper(), - selectedTabBackgroundColor: - Theme.of(context).hintColor.withOpacity(0.2), - tabBuilder: (key, icon, label, themeConf) { - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - icon, - Tooltip( - message: key, - waitDuration: Duration(seconds: 1), - child: label), - ], - ); - }, - pageViewBuilder: (pageView) => Row(children: [ - Expanded(child: pageView), - Consumer( - builder: (_, model, child) => model.isShowChatPage - ? Expanded(child: Scaffold(body: ChatPage())) - : Offstage()) - ])); + : Listener( + onPointerDown: pointerHandler, + onPointerMove: pointerHandler, + child: DesktopTab( + showTitle: false, + showMaximize: false, + showMinimize: true, + showClose: true, + controller: serverModel.tabController, + maxLabelWidth: 100, + tail: buildScrollJumper(), + selectedTabBackgroundColor: + Theme.of(context).hintColor.withOpacity(0.2), + tabBuilder: (key, icon, label, themeConf) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + icon, + Tooltip( + message: key, + waitDuration: Duration(seconds: 1), + child: label), + ], + ); + }, + pageViewBuilder: (pageView) => Row(children: [ + Expanded(child: pageView), + Consumer( + builder: (_, model, child) => model.isShowChatPage + ? Expanded(child: Scaffold(body: ChatPage())) + : Offstage()) + ]))); } Widget buildTitleBar() { diff --git a/flutter/lib/desktop/widgets/tabbar_widget.dart b/flutter/lib/desktop/widgets/tabbar_widget.dart index edc9fd352..f4a50c725 100644 --- a/flutter/lib/desktop/widgets/tabbar_widget.dart +++ b/flutter/lib/desktop/widgets/tabbar_widget.dart @@ -73,7 +73,7 @@ class DesktopTabController { int get length => state.value.tabs.length; - void add(TabInfo tab, {bool authorized = false}) { + void add(TabInfo tab) { if (!isDesktop) return; final index = state.value.tabs.indexWhere((e) => e.key == tab.key); int toIndex; @@ -87,16 +87,6 @@ class DesktopTabController { toIndex = state.value.tabs.length - 1; assert(toIndex >= 0); } - if (tabType == DesktopTabType.cm) { - Future.delayed(Duration.zero, () async { - window_on_top(null); - }); - if (authorized) { - Future.delayed(const Duration(seconds: 3), () { - windowManager.minimize(); - }); - } - } try { jumpTo(toIndex); } catch (e) { diff --git a/flutter/lib/models/server_model.dart b/flutter/lib/models/server_model.dart index c37af81f5..b2fdc0f30 100644 --- a/flutter/lib/models/server_model.dart +++ b/flutter/lib/models/server_model.dart @@ -5,6 +5,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_hbb/models/platform_model.dart'; import 'package:wakelock/wakelock.dart'; +import 'package:window_manager/window_manager.dart'; import '../common.dart'; import '../common/formatter/id_formatter.dart'; @@ -37,6 +38,8 @@ class ServerModel with ChangeNotifier { final List _clients = []; + Timer? cmHiddenTimer; + bool get isStart => _isStart; bool get mediaOk => _mediaOk; @@ -353,13 +356,7 @@ class ServerModel with ChangeNotifier { for (var clientJson in clientsJson) { final client = Client.fromJson(clientJson); _clients.add(client); - tabController.add( - TabInfo( - key: client.id.toString(), - label: client.name, - closable: false, - page: Desktop.buildConnectionCard(client)), - authorized: client.authorized); + _addTab(client); } notifyListeners(); } catch (e) { @@ -384,13 +381,7 @@ class ServerModel with ChangeNotifier { } _clients.add(client); } - tabController.add( - TabInfo( - key: client.id.toString(), - label: client.name, - closable: false, - page: Desktop.buildConnectionCard(client)), - authorized: client.authorized); + _addTab(client); // remove disconnected final index_disconnected = _clients .indexWhere((c) => c.disconnected && c.peerId == client.peerId); @@ -406,6 +397,23 @@ class ServerModel with ChangeNotifier { } } + void _addTab(Client client) { + tabController.add(TabInfo( + key: client.id.toString(), + label: client.name, + closable: false, + page: Desktop.buildConnectionCard(client))); + Future.delayed(Duration.zero, () async { + window_on_top(null); + }); + if (client.authorized) { + cmHiddenTimer = Timer(const Duration(seconds: 3), () { + windowManager.minimize(); + cmHiddenTimer = null; + }); + } + } + void showLoginDialog(Client client) { parent.target?.dialogManager.show((setState, close) { cancel() {