diff --git a/flutter/assets/logo.ico b/flutter/assets/logo.ico new file mode 100644 index 000000000..d5080c1f7 Binary files /dev/null and b/flutter/assets/logo.ico differ diff --git a/flutter/assets/logo.png b/flutter/assets/logo.png new file mode 100644 index 000000000..f854a1dc3 Binary files /dev/null and b/flutter/assets/logo.png differ diff --git a/flutter/lib/desktop/pages/desktop_home_page.dart b/flutter/lib/desktop/pages/desktop_home_page.dart index 152463c68..eb9e0a483 100644 --- a/flutter/lib/desktop/pages/desktop_home_page.dart +++ b/flutter/lib/desktop/pages/desktop_home_page.dart @@ -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 ); } + @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 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 @override void dispose() { + destoryTray(); trayManager.removeListener(this); windowManager.removeListener(this); _uniLinksSubscription?.cancel(); diff --git a/flutter/lib/desktop/widgets/tabbar_widget.dart b/flutter/lib/desktop/widgets/tabbar_widget.dart index 6643183f5..229e8bd35 100644 --- a/flutter/lib/desktop/widgets/tabbar_widget.dart +++ b/flutter/lib/desktop/widgets/tabbar_widget.dart @@ -509,14 +509,15 @@ class WindowActionPanelState extends State 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, diff --git a/flutter/lib/main.dart b/flutter/lib/main.dart index df314396f..52eacf5f5 100644 --- a/flutter/lib/main.dart +++ b/flutter/lib/main.dart @@ -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()); diff --git a/flutter/lib/utils/tray_manager.dart b/flutter/lib/utils/tray_manager.dart index f0422f554..91550e1d8 100644 --- a/flutter/lib/utils/tray_manager.dart +++ b/flutter/lib/utils/tray_manager.dart @@ -4,20 +4,29 @@ import 'package:tray_manager/tray_manager.dart'; import '../common.dart'; +const kTrayItemShowKey = "show"; +const kTrayItemQuitKey = "quit"; + Future initTray({List? extra_item}) async { List 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 destoryTray() async { + return trayManager.destroy(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index ca69ef4e4..29516432d 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -385,5 +385,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland 需要更高版本的 linux 发行版。 请尝试 X11 桌面或更改您的操作系统。"), ("JumpLink", "查看"), ("Please Select the screen to be shared(Operate on the peer side).", "请选择要分享的画面(对端操作)。"), + ("Show RustDesk", "显示rustdesk"), ].iter().cloned().collect(); }