diff --git a/flutter/assets/logo.ico b/flutter/assets/logo.ico new file mode 100644 index 000000000..5ebc02809 Binary files /dev/null and b/flutter/assets/logo.ico differ diff --git a/flutter/lib/desktop/pages/connection_page.dart b/flutter/lib/desktop/pages/connection_page.dart index 6659986d8..c88c52e32 100644 --- a/flutter/lib/desktop/pages/connection_page.dart +++ b/flutter/lib/desktop/pages/connection_page.dart @@ -52,12 +52,7 @@ class _ConnectionPageState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ getUpdateUI(), - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - getSearchBarUI(), - ], - ), + getSearchBarUI(), SizedBox(height: 12), getPeers(), ]), diff --git a/flutter/lib/desktop/pages/desktop_home_page.dart b/flutter/lib/desktop/pages/desktop_home_page.dart index c42ed1b53..97104cbf3 100644 --- a/flutter/lib/desktop/pages/desktop_home_page.dart +++ b/flutter/lib/desktop/pages/desktop_home_page.dart @@ -1,9 +1,13 @@ -import 'package:flutter/material.dart'; +import 'dart:io'; + +import 'package:flutter/material.dart' hide MenuItem; import 'package:flutter_hbb/common.dart'; import 'package:flutter_hbb/desktop/pages/connection_page.dart'; import 'package:flutter_hbb/desktop/widgets/titlebar_widget.dart'; import 'package:flutter_hbb/models/model.dart'; import 'package:provider/provider.dart'; +import 'package:tray_manager/tray_manager.dart'; +import 'package:window_manager/window_manager.dart'; class DesktopHomePage extends StatefulWidget { DesktopHomePage({Key? key}) : super(key: key); @@ -14,7 +18,7 @@ class DesktopHomePage extends StatefulWidget { const borderColor = Color(0xFF2F65BA); -class _DesktopHomePageState extends State { +class _DesktopHomePageState extends State with TrayListener { @override Widget build(BuildContext context) { return Scaffold( @@ -203,4 +207,30 @@ class _DesktopHomePageState extends State { buildRecentSession(BuildContext context) { return Center(child: Text("waiting implementation")); } + + @override + void onTrayMenuItemClick(MenuItem menuItem) { + print("click ${menuItem.key}"); + switch (menuItem.key) { + case "quit": + exit(0); + case "show": + windowManager.show(); + break; + default: + break; + } + } + + @override + void initState() { + super.initState(); + trayManager.addListener(this); + } + + @override + void dispose() { + trayManager.removeListener(this); + super.dispose(); + } } diff --git a/flutter/lib/main.dart b/flutter/lib/main.dart index 336f5dda6..21dc649bd 100644 --- a/flutter/lib/main.dart +++ b/flutter/lib/main.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hbb/desktop/pages/desktop_home_page.dart'; import 'package:flutter_hbb/desktop/screen/desktop_remote_screen.dart'; import 'package:flutter_hbb/utils/multi_window_manager.dart'; +import 'package:flutter_hbb/utils/tray_manager.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:provider/provider.dart'; import 'package:window_manager/window_manager.dart'; @@ -52,6 +53,7 @@ void runRustDeskApp(List args) async { break; } } else { + initTray(); FFI.serverModel.startService(); runApp(App()); doWhenWindowReady(() { diff --git a/flutter/lib/utils/tray_manager.dart b/flutter/lib/utils/tray_manager.dart new file mode 100644 index 000000000..d911932e5 --- /dev/null +++ b/flutter/lib/utils/tray_manager.dart @@ -0,0 +1,22 @@ +import 'dart:io'; + +import 'package:flutter_hbb/models/model.dart'; +import 'package:tray_manager/tray_manager.dart'; + +Future initTray({List? extra_item}) async { + List items = [ + MenuItem(key: "show", label: translate("show rustdesk")), + MenuItem.separator(), + MenuItem(key: "quit", label: translate("quit rustdesk")), + ]; + 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") + ]); +} diff --git a/flutter/pubspec.lock b/flutter/pubspec.lock index f46c07982..b4cde8caf 100644 --- a/flutter/pubspec.lock +++ b/flutter/pubspec.lock @@ -222,8 +222,8 @@ packages: dependency: "direct main" description: path: "." - ref: "4aab101f17f02312dc45311eb3009cc0ea5357c1" - resolved-ref: "4aab101f17f02312dc45311eb3009cc0ea5357c1" + ref: "704718b2853723b615675e048f1f385cbfb209a6" + resolved-ref: "704718b2853723b615675e048f1f385cbfb209a6" url: "https://github.com/Kingtous/rustdesk_desktop_multi_window" source: git version: "0.0.1" @@ -408,7 +408,7 @@ packages: name: flutter_smart_dialog url: "https://pub.dartlang.org" source: hosted - version: "4.3.2" + version: "4.3.2+1" flutter_test: dependency: "direct dev" description: flutter @@ -566,6 +566,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.4" + menu_base: + dependency: transitive + description: + name: menu_base + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.1" meta: dependency: transitive description: @@ -771,6 +778,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.1.0" + screen_retriever: + dependency: transitive + description: + name: screen_retriever + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.2" settings_ui: dependency: "direct main" description: @@ -848,6 +862,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.1" + shortid: + dependency: transitive + description: + name: shortid + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.2" sky_engine: dependency: transitive description: flutter @@ -930,6 +951,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.0" + tray_manager: + dependency: "direct main" + description: + name: tray_manager + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.7" tuple: dependency: "direct main" description: @@ -1076,7 +1104,7 @@ packages: name: window_manager url: "https://pub.dartlang.org" source: hosted - version: "0.2.3" + version: "0.2.5" xdg_directories: dependency: transitive description: diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml index a4417c25c..5ff7cc6a0 100644 --- a/flutter/pubspec.yaml +++ b/flutter/pubspec.yaml @@ -58,13 +58,14 @@ dependencies: url: https://github.com/SoLongAndThanksForAllThePizza/flutter_rust_bridge ref: master path: frb_dart - window_manager: ^0.2.3 + window_manager: ^0.2.5 desktop_multi_window: git: url: https://github.com/Kingtous/rustdesk_desktop_multi_window - ref: 4aab101f17f02312dc45311eb3009cc0ea5357c1 + ref: 704718b2853723b615675e048f1f385cbfb209a6 bitsdojo_window: ^0.1.2 freezed_annotation: ^2.0.3 + tray_manager: 0.1.7 dev_dependencies: flutter_launcher_icons: ^0.9.1