From 4f301bd0b5de2b0236f6a712e8f0ecc8c4f3b6d6 Mon Sep 17 00:00:00 2001 From: Kingtous Date: Wed, 2 Nov 2022 10:22:41 +0800 Subject: [PATCH 1/3] feat: add flutter tray and hide logic of main window --- .../lib/desktop/pages/desktop_home_page.dart | 20 ++++++++++++++----- .../lib/desktop/widgets/tabbar_widget.dart | 15 +++++++------- flutter/lib/main.dart | 2 -- flutter/lib/utils/tray_manager.dart | 15 +++++++++++--- src/lang/cn.rs | 1 + 5 files changed, 36 insertions(+), 17 deletions(-) diff --git a/flutter/lib/desktop/pages/desktop_home_page.dart b/flutter/lib/desktop/pages/desktop_home_page.dart index 152463c68..e569e2511 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,21 @@ class _DesktopHomePageState extends State ); } + @override + void onTrayIconMouseDown() { + windowManager.show(); + windowManager.focus(); + } + @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 +424,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 +465,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..1f849e453 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, () { + // hide for all window + // note: the main window can be restored by tray icon + Future.delayed(Duration.zero, () { + if (widget.isMainWindow) { + windowManager.hide(); + } else { 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..5c665c1bd 100644 --- a/flutter/lib/utils/tray_manager.dart +++ b/flutter/lib/utils/tray_manager.dart @@ -4,11 +4,14 @@ 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); @@ -17,7 +20,13 @@ Future initTray({List? extra_item}) async { 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"); + } +} + +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(); } From 5c8639c6031565cd6be4dbeed4f89ea5976f24b6 Mon Sep 17 00:00:00 2001 From: Kingtous Date: Wed, 2 Nov 2022 10:24:07 +0800 Subject: [PATCH 2/3] add: logo assets --- flutter/assets/logo.ico | Bin 0 -> 270398 bytes flutter/assets/logo.png | Bin 0 -> 12213 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 flutter/assets/logo.ico create mode 100644 flutter/assets/logo.png diff --git a/flutter/assets/logo.ico b/flutter/assets/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..d5080c1f778ffb5ee61fc8429f558bbc7050aade GIT binary patch literal 270398 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 LFD#*2eDVJS=SPuN literal 0 HcmV?d00001 diff --git a/flutter/assets/logo.png b/flutter/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f854a1dc3a1a2c608c9347618716c7b318e44e6a GIT binary patch literal 12213 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 VncU=5FjR1?SE{-y<^NfS{vTs6dAR@p literal 0 HcmV?d00001 From 892869c0145205532dc12083e6f106b8b75153b8 Mon Sep 17 00:00:00 2001 From: Kingtous Date: Wed, 2 Nov 2022 11:10:28 +0800 Subject: [PATCH 3/3] feat: tray logic in windows --- flutter/lib/desktop/pages/desktop_home_page.dart | 10 +++++++++- flutter/lib/desktop/widgets/tabbar_widget.dart | 6 +++--- flutter/lib/utils/tray_manager.dart | 12 ++++++------ 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/flutter/lib/desktop/pages/desktop_home_page.dart b/flutter/lib/desktop/pages/desktop_home_page.dart index e569e2511..eb9e0a483 100644 --- a/flutter/lib/desktop/pages/desktop_home_page.dart +++ b/flutter/lib/desktop/pages/desktop_home_page.dart @@ -399,7 +399,15 @@ class _DesktopHomePageState extends State @override void onTrayIconMouseDown() { windowManager.show(); - windowManager.focus(); + } + + @override + void onTrayIconRightMouseDown() { + // linux does not support popup menu manually. + // linux will handle popup action ifself. + if (Platform.isMacOS || Platform.isWindows) { + trayManager.popUpContextMenu(); + } } @override diff --git a/flutter/lib/desktop/widgets/tabbar_widget.dart b/flutter/lib/desktop/widgets/tabbar_widget.dart index 1f849e453..229e8bd35 100644 --- a/flutter/lib/desktop/widgets/tabbar_widget.dart +++ b/flutter/lib/desktop/widgets/tabbar_widget.dart @@ -511,11 +511,11 @@ class WindowActionPanelState extends State if (res) { // hide for all window // note: the main window can be restored by tray icon - Future.delayed(Duration.zero, () { + Future.delayed(Duration.zero, () async { if (widget.isMainWindow) { - windowManager.hide(); + await windowManager.hide(); } else { - WindowController.fromWindowId(windowId!).hide(); + await WindowController.fromWindowId(windowId!).hide(); } }); } diff --git a/flutter/lib/utils/tray_manager.dart b/flutter/lib/utils/tray_manager.dart index 5c665c1bd..91550e1d8 100644 --- a/flutter/lib/utils/tray_manager.dart +++ b/flutter/lib/utils/tray_manager.dart @@ -16,15 +16,15 @@ Future initTray({List? extra_item}) async { 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.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 {