Merge pull request #1919 from Kingtous/master

feat: add flutter tray and hide logic of main window
This commit is contained in:
RustDesk
2022-11-02 11:48:33 +08:00
committed by GitHub
7 changed files with 51 additions and 24 deletions

View File

@@ -13,6 +13,7 @@ import 'package:flutter_hbb/desktop/widgets/scroll_wrapper.dart';
import 'package:flutter_hbb/models/platform_model.dart';
import 'package:flutter_hbb/models/server_model.dart';
import 'package:flutter_hbb/utils/multi_window_manager.dart';
import 'package:flutter_hbb/utils/tray_manager.dart';
import 'package:get/get.dart';
import 'package:provider/provider.dart';
import 'package:tray_manager/tray_manager.dart';
@@ -395,14 +396,29 @@ class _DesktopHomePageState extends State<DesktopHomePage>
);
}
@override
void onTrayIconMouseDown() {
windowManager.show();
}
@override
void onTrayIconRightMouseDown() {
// linux does not support popup menu manually.
// linux will handle popup action ifself.
if (Platform.isMacOS || Platform.isWindows) {
trayManager.popUpContextMenu();
}
}
@override
void onTrayMenuItemClick(MenuItem menuItem) {
debugPrint('click ${menuItem.key}');
switch (menuItem.key) {
case "quit":
exit(0);
case "show":
// windowManager.show();
case kTrayItemQuitKey:
windowManager.close();
break;
case kTrayItemShowKey:
windowManager.show();
windowManager.focus();
break;
default:
break;
@@ -416,6 +432,7 @@ class _DesktopHomePageState extends State<DesktopHomePage>
updateUrl = await bind.mainGetSoftwareUpdateUrl();
if (updateUrl.isNotEmpty) setState(() {});
});
initTray();
trayManager.addListener(this);
windowManager.addListener(this);
rustDeskWinManager.setMethodHandler((call, fromWindowId) async {
@@ -456,6 +473,7 @@ class _DesktopHomePageState extends State<DesktopHomePage>
@override
void dispose() {
destoryTray();
trayManager.removeListener(this);
windowManager.removeListener(this);
_uniLinksSubscription?.cancel();

View File

@@ -509,14 +509,15 @@ class WindowActionPanelState extends State<WindowActionPanel>
onTap: () async {
final res = await widget.onClose?.call() ?? true;
if (res) {
if (widget.isMainWindow) {
windowManager.close();
} else {
// only hide for multi window, not close
Future.delayed(Duration.zero, () {
WindowController.fromWindowId(windowId!).hide();
});
}
// hide for all window
// note: the main window can be restored by tray icon
Future.delayed(Duration.zero, () async {
if (widget.isMainWindow) {
await windowManager.hide();
} else {
await WindowController.fromWindowId(windowId!).hide();
}
});
}
},
isClose: true,

View File

@@ -101,8 +101,6 @@ void runMainApp(bool startService) async {
await bind.mainCheckConnectStatus();
if (startService) {
// await windowManager.ensureInitialized();
// disable tray
// initTray();
gFFI.serverModel.startService();
}
runApp(App());

View File

@@ -4,20 +4,29 @@ import 'package:tray_manager/tray_manager.dart';
import '../common.dart';
const kTrayItemShowKey = "show";
const kTrayItemQuitKey = "quit";
Future<void> initTray({List<MenuItem>? extra_item}) async {
List<MenuItem> items = [
MenuItem(key: "show", label: translate("show rustdesk")),
MenuItem(key: kTrayItemShowKey, label: translate("Show RustDesk")),
MenuItem.separator(),
MenuItem(key: "quit", label: translate("quit rustdesk")),
MenuItem(key: kTrayItemQuitKey, label: translate("Quit")),
];
if (extra_item != null) {
items.insertAll(0, extra_item);
}
await Future.wait([
trayManager
.setIcon(Platform.isWindows ? "assets/logo.ico" : "assets/logo.png"),
trayManager.setContextMenu(Menu(items: items)),
trayManager.setToolTip("rustdesk"),
trayManager.setTitle("rustdesk")
]);
if (Platform.isMacOS || Platform.isWindows) {
await trayManager.setToolTip("rustdesk");
}
if (Platform.isMacOS || Platform.isLinux) {
await trayManager.setTitle("rustdesk");
}
await trayManager
.setIcon(Platform.isWindows ? "assets/logo.ico" : "assets/logo.png");
await trayManager.setContextMenu(Menu(items: items));
}
Future<void> destoryTray() async {
return trayManager.destroy();
}