diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index 80af61bd8..00a6dd99f 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -16,6 +16,7 @@ import 'package:flutter_hbb/desktop/widgets/refresh_wrapper.dart'; import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; import 'package:flutter_hbb/main.dart'; import 'package:flutter_hbb/models/peer_model.dart'; +import 'package:flutter_hbb/models/state_model.dart'; import 'package:flutter_hbb/utils/multi_window_manager.dart'; import 'package:flutter_hbb/utils/platform_channel.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -558,13 +559,15 @@ void windowOnTop(int? id) async { if (!isDesktop) { return; } + print("Bring window '$id' on top"); if (id == null) { - print("Bring window on top"); // main window - windowManager.restore(); - windowManager.show(); - windowManager.focus(); - rustDeskWinManager.registerActiveWindow(kWindowMainId); + if (stateGlobal.minimized) { + await windowManager.restore(); + } + await windowManager.show(); + await windowManager.focus(); + await rustDeskWinManager.registerActiveWindow(kWindowMainId); } else { WindowController.fromWindowId(id) ..focus() diff --git a/flutter/lib/consts.dart b/flutter/lib/consts.dart index 5376196e4..15616602f 100644 --- a/flutter/lib/consts.dart +++ b/flutter/lib/consts.dart @@ -77,7 +77,7 @@ const double kDesktopFileTransferHeaderHeight = 25.0; EdgeInsets get kDragToResizeAreaPadding => !kUseCompatibleUiMode && Platform.isLinux - ? stateGlobal.fullscreen || stateGlobal.maximize + ? stateGlobal.fullscreen || stateGlobal.maximized ? EdgeInsets.zero : EdgeInsets.all(5.0) : EdgeInsets.zero; diff --git a/flutter/lib/desktop/widgets/remote_toolbar.dart b/flutter/lib/desktop/widgets/remote_toolbar.dart index 7136efc71..6a72fc3a1 100644 --- a/flutter/lib/desktop/widgets/remote_toolbar.dart +++ b/flutter/lib/desktop/widgets/remote_toolbar.dart @@ -1610,12 +1610,10 @@ class _IconMenuButtonState extends State<_IconMenuButton> { ).marginSymmetric( horizontal: widget.hMargin ?? _ToolbarTheme.buttonHMargin, vertical: widget.vMargin ?? _ToolbarTheme.buttonVMargin); - if (widget.tooltip != null) { - button = Tooltip( - message: widget.tooltip!, - child: button, - ); - } + button = Tooltip( + message: widget.tooltip, + child: button, + ); if (widget.topLevel) { return MenuBar(children: [button]); } else { diff --git a/flutter/lib/desktop/widgets/tabbar_widget.dart b/flutter/lib/desktop/widgets/tabbar_widget.dart index 727a28cb4..4178ad5c2 100644 --- a/flutter/lib/desktop/widgets/tabbar_widget.dart +++ b/flutter/lib/desktop/widgets/tabbar_widget.dart @@ -521,19 +521,25 @@ class WindowActionPanelState extends State super.dispose(); } - void _setMaximize(bool maximize) { - stateGlobal.setMaximize(maximize); + void _setMaximized(bool maximize) { + stateGlobal.setMaximized(maximize); _saveFrameDebounce.call(_saveFrame); setState(() {}); } + @override + void onWindowMinimize() { + stateGlobal.setMaximized(true); + super.onWindowMinimize(); + } + @override void onWindowMaximize() { // catch maximize from system if (!widget.isMaximized.value) { widget.isMaximized.value = true; } - _setMaximize(true); + _setMaximized(true); super.onWindowMaximize(); } @@ -543,7 +549,7 @@ class WindowActionPanelState extends State if (widget.isMaximized.value) { widget.isMaximized.value = false; } - _setMaximize(false); + _setMaximized(false); super.onWindowUnmaximize(); } diff --git a/flutter/lib/models/state_model.dart b/flutter/lib/models/state_model.dart index 94f9cc234..f35056a84 100644 --- a/flutter/lib/models/state_model.dart +++ b/flutter/lib/models/state_model.dart @@ -11,7 +11,8 @@ enum SvcStatus { notReady, connecting, ready } class StateGlobal { int _windowId = -1; bool _fullscreen = false; - bool _maximize = false; + bool _maximized = false; + bool _minimized = false; bool grabKeyboard = false; final RxBool _showTabBar = true.obs; final RxDouble _resizeEdgeSize = RxDouble(kWindowEdgeSize); @@ -25,7 +26,8 @@ class StateGlobal { int get windowId => _windowId; bool get fullscreen => _fullscreen; - bool get maximize => _maximize; + bool get maximized => _maximized; + bool get minimized => _minimized; double get tabBarHeight => fullscreen ? 0 : kDesktopRemoteTabBarHeight; RxBool get showTabBar => _showTabBar; RxDouble get resizeEdgeSize => _resizeEdgeSize; @@ -48,12 +50,13 @@ class StateGlobal { } setWindowId(int id) => _windowId = id; - setMaximize(bool v) { - if (_maximize != v && !_fullscreen) { - _maximize = v; - _resizeEdgeSize.value = _maximize ? kMaximizeEdgeSize : kWindowEdgeSize; + setMaximized(bool v) { + if (_maximized != v && !_fullscreen) { + _maximized = v; + _resizeEdgeSize.value = _maximized ? kMaximizeEdgeSize : kWindowEdgeSize; } } + setMinimized(bool v) => _minimized = v; setFullscreen(bool v) { if (_fullscreen != v) { @@ -61,7 +64,7 @@ class StateGlobal { _showTabBar.value = !_fullscreen; _resizeEdgeSize.value = fullscreen ? kFullScreenEdgeSize - : _maximize + : _maximized ? kMaximizeEdgeSize : kWindowEdgeSize; print(