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/connection_tab_page.dart b/flutter/lib/desktop/pages/connection_tab_page.dart index 5ebf7b54e..8d18b2f24 100644 --- a/flutter/lib/desktop/pages/connection_tab_page.dart +++ b/flutter/lib/desktop/pages/connection_tab_page.dart @@ -64,37 +64,34 @@ class _ConnectionTabPageState extends State animationDuration: Duration.zero, child: Column( children: [ - SizedBox( - height: 50, - child: DesktopTitleBar( - child: TabBar( - isScrollable: true, - labelColor: Colors.white, - physics: NeverScrollableScrollPhysics(), - indicatorColor: Colors.white, - tabs: connectionIds - .map((e) => Tab( - child: Row( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text(e), - SizedBox( - width: 4, - ), - InkWell( - onTap: () { - onRemoveId(e); - }, - child: Icon( - Icons.highlight_remove, - size: 20, - )) - ], - ), - )) - .toList()), - ), + DesktopTitleBar( + child: TabBar( + isScrollable: true, + labelColor: Colors.white, + physics: NeverScrollableScrollPhysics(), + indicatorColor: Colors.white, + tabs: connectionIds + .map((e) => Tab( + child: Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text(e), + SizedBox( + width: 4, + ), + InkWell( + onTap: () { + onRemoveId(e); + }, + child: Icon( + Icons.highlight_remove, + size: 20, + )) + ], + ), + )) + .toList()), ), Expanded( child: TabBarView( diff --git a/flutter/lib/desktop/pages/desktop_home_page.dart b/flutter/lib/desktop/pages/desktop_home_page.dart index fdffda031..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,26 +18,22 @@ 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( body: Column( children: [ - Row( - children: [ - DesktopTitleBar( - child: Center( - child: Text( - "RustDesk", - style: TextStyle( - color: Colors.white, - fontSize: 20, - fontWeight: FontWeight.bold), - ), - ), - ) - ], + DesktopTitleBar( + child: Center( + child: Text( + "RustDesk", + style: TextStyle( + color: Colors.white, + fontSize: 20, + fontWeight: FontWeight.bold), + ), + ), ), Expanded( child: Container( @@ -207,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/desktop/widgets/titlebar_widget.dart b/flutter/lib/desktop/widgets/titlebar_widget.dart index f98b7cc79..ecb68d513 100644 --- a/flutter/lib/desktop/widgets/titlebar_widget.dart +++ b/flutter/lib/desktop/widgets/titlebar_widget.dart @@ -12,16 +12,16 @@ class DesktopTitleBar extends StatelessWidget { @override Widget build(BuildContext context) { - return Expanded( - child: Container( - decoration: const BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [backgroundStartColor, backgroundEndColor], - stops: [0.0, 1.0]), - ), - child: WindowTitleBarBox( + return Container( + decoration: const BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [backgroundStartColor, backgroundEndColor], + stops: [0.0, 1.0]), + ), + child: WindowTitleBarBox( + child: SizedBox( child: Row( children: [ Expanded( 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