From d66b10b508e02c4cf139fbe823e003eba4f94e6a Mon Sep 17 00:00:00 2001
From: dignow <linlong1265@gmail.com>
Date: Fri, 11 Aug 2023 15:53:47 +0800
Subject: [PATCH] fix windowOnTop, maxmized state

Signed-off-by: dignow <linlong1265@gmail.com>
---
 flutter/lib/common.dart                         | 13 ++++++++-----
 flutter/lib/consts.dart                         |  2 +-
 flutter/lib/desktop/widgets/remote_toolbar.dart | 10 ++++------
 flutter/lib/desktop/widgets/tabbar_widget.dart  | 14 ++++++++++----
 flutter/lib/models/state_model.dart             | 17 ++++++++++-------
 5 files changed, 33 insertions(+), 23 deletions(-)

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<WindowActionPanel>
     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<WindowActionPanel>
     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(