From 1f9655d6322f01adc28064737e75459c1e7afd86 Mon Sep 17 00:00:00 2001 From: Kingtous Date: Thu, 2 Jun 2022 14:51:09 +0800 Subject: [PATCH 1/2] opt: titlebar height autofit Signed-off-by: Kingtous --- .../desktop/pages/connection_tab_page.dart | 59 +++++++++---------- .../lib/desktop/pages/desktop_home_page.dart | 24 ++++---- .../lib/desktop/widgets/titlebar_widget.dart | 20 +++---- 3 files changed, 48 insertions(+), 55 deletions(-) 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..c42ed1b53 100644 --- a/flutter/lib/desktop/pages/desktop_home_page.dart +++ b/flutter/lib/desktop/pages/desktop_home_page.dart @@ -20,20 +20,16 @@ class _DesktopHomePageState extends State { 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( 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( From d81d7857221d918c8946adfe8615f56ef6874765 Mon Sep 17 00:00:00 2001 From: Kingtous Date: Thu, 2 Jun 2022 16:23:20 +0800 Subject: [PATCH 2/2] feat: add tray icon to status bar Signed-off-by: Kingtous --- flutter/assets/logo.ico | Bin 0 -> 67646 bytes .../lib/desktop/pages/connection_page.dart | 7 +--- .../lib/desktop/pages/desktop_home_page.dart | 34 ++++++++++++++++- flutter/lib/main.dart | 2 + flutter/lib/utils/tray_manager.dart | 22 +++++++++++ flutter/pubspec.lock | 36 ++++++++++++++++-- flutter/pubspec.yaml | 5 ++- 7 files changed, 92 insertions(+), 14 deletions(-) create mode 100644 flutter/assets/logo.ico create mode 100644 flutter/lib/utils/tray_manager.dart diff --git a/flutter/assets/logo.ico b/flutter/assets/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..5ebc028090888a67094e0f80600ad8eccbd7945f GIT binary patch literal 67646 zcmeHQYjjn`6+X21sH>~;LjhNR(017+wusg~WVI@7|MYKLi&BenZ}||4hPo`dj8GM=!x1bAC)zl25c_JyFePM2#niE}x5hFPR*@)-6xj_Yv*fK-7GJ z=-OqXllzH2D<@i0Nc8$(BEJ6!?QA}_OmzYBug@Ir%e{#HHJ9l49`M#oapmSsqNQVF z@rr(DUU#gGo0M)`BWgHBw5^nAB6Q4)KXKDFe|~ETkpC!l{*qge-mA4 zjL)0%FFQ86-}hzs{2MLKtKH*YUMD)RBce;34~=voE%<-+Vff`OMAu=HUggkEcOO3G zCtmMFbn{E1QwNEPMror1smp&``|bT=*n5+AuIv;i_7V+en{|YlzqYRs_=Fzp-9|L! zcka67e3p;#l;wZwZ((bP1h{b|IalM(f6)t$3k9Ohm(ULRM^b%3%JDxGeXtc%VDo5` ztB`p7FPo_1?vZ=!`;chN{YlY-l;S@FKEGlG>e(CWxH)^o-TqghkEc=^(C>WhiH`M* zkG`Mlw3OkW`(vM=t*%;5p-=Bt|F52>`bk8W&@Y+$QlM>ul;A(}Yec&@tLKC7Si8%e zk7c?3JdejCiZTQ91EJ@CIDG!cKG?m@ZuNiN`7ijDeTDkZD;MDhUW5*yEo1zD=NN1) zQICJ@9V=J6KcDM_OBg5iORho(rVe(0wnCi>B&I&k`N}7-NeG zjs<(o;r{=j{n<8_CCG7Sbx0`r&qTd=qS`BxonPNn7imW zb@LNnFAz^pxNVVfn^GMJ4gc&s|AF{ts#QsQBculFGy*tx|g8yRl zqeO*q9)&izBD|E{XR$oRZWFPhH8q~MCao?IB)B}ewZY(N! zKUGpL?fK_+|HboSC|yFjOm%G~<$6>+PP{+6@vZdWe>&F4iuRefp7b(~AGDuf-`03q zOt-7I6SeLokkfDN?SDDO=0#=lFO}Gca=W+njCJ#)bz-Hvj5X~F`hnW>U;d65K6QuT z`@gO?|EveI28)&NdNWb(!_wu`p8tK=HzgvwHcMmUo88;?&!4=;;40?#yb8}JEP7SC zjC%8rHgav1S7ajBuX#fnn?U&I{pQE^ij{HYOzARe%|Bzq`!Bo-&y~#|CXG!X{Id_( zQ|YyYk?YGANtaP?{;`(giom!Z_ZM>RmBuD8{{@2d)TEfWn3dT6}_W#`@ z=W%&OhueRWb`fa$vc+CY7`c8s<~JnEsWtz+MzdC6%^&ywavzk&Mi$$I(~It3-B=`D zM!osxu@TI3c@-Z2S@?=HHVN}5X@hh`aE!B*&yJDn=V;Hr=w6>q@Trp61d@K#U8v(u zde!jAx`72*(q+`1|D}1rMxYOH=u>HI0^xu1&%JZcDfpa-3H_wYs6GD^et@zH?DK8L z{`uDR-g5rYcO59hIvx?Zh;i{3<;$i$|6Im%Si>nI>olJOD}?=MGIHi9_B4D$ zY2HJ{KXW$s1=N9<-;t4~GemQq!`?7;b`)11_{<0HgSH5)V`x`K_`TA6rQCC#L&rb2 z1NLldhm25!=ZN25jDD1lIxzNryypY+mnzPIJBdD@4`W%OI=oBK}k%-?B zQal!CtKq&X>I5FI%hLV5gX~k=5?27qe`{e%k+Y>NW zg!xzzJ>a%U?$09cdy}o_ojOw~zs^5inL^7ypM|(b^jruhz%g+?2X@y7L~o*>#_y8p zN*A)f8#&wUXqEVQUd-b=d_8@{*E0-4%Rlonx)0Im!yO<~@&o&XDzq~?^SMRC;o~LS z^qpmv>yNx&bghG3>1Zc^4>kW>u4#kS)w3PAK%2Yd@9y|>d*S?v4k?uV!0po|{;y#R zJ^!o&GoQvDYMh7Qhg4O%^FJE(y4j?Z+Gi=7oy%#E&SfP)id1v4VTY{kW&0J zKC_>}dRmO{sgeea7rU*qQt|%J*gW!j#btSc*}bhxDaSwSz_=e`-^iX=bj80n)VlM( zaG3Z#ohj?F{+rJ^^TEEmx@SuA&p7gX9V$xkt_Xp(!?FC-*Tmr;>j`9q+j+ani2nAY zq;Su=k+S^Twlo{_Jgx8GK)XsrPVIBA|K|)5xmz?1&p|ECNgD6AUr2fWdHjaQJ z;Q2e&ANwBm=V<)qMVc}HTZ#H;EatB4duZ^PR{S&GJm)|9J2)4*5N*WIyPiW@kG{AY zPuwS{N8g|`;rjhJ>JNVR%NVRV31Yp0TV6Z)E$#S^#Ui6S(WJ+TK3E=ESI6_Lw($9i z)jK2Y$k;To-`^bJ@FhsY`|{4#!pFZyG-{P)6vG+;h_q66e7I)rfmiHLm>5B1} z55Zl@WcPMoY#Oc?CjAEMNETtfAMJ~`ur@E}p~${Gw>l#>ttQ_Cq8}6l0zJe_eq5R~r6NU+CrUDgxxcP_we@#zivnGdnQ;Gpwf!|C-tV2y0Ma{ExJH zga0O@1KQ|7Be>`t6#x7jJa4(-UmN~Qg5`2wVpk^Zv=?-hMXn@rcoZK>26x2iW-Q@QM7e zA7Fo!jIob&dgei3tcBe>^$z*s_P{iw1HRe7>x{7zcirO1V}Ar5A2^SYPPXYsSueC< z`G9UbcaW4FU!MgMdN6AYc$M z2p9wm0tNwtfI+|@U=T0}7z7Lg1_6VBLBJqj5HJWB1PlT;0`?Z^)cL$=7tON9bE%r6 z@je_s8jat^@h#DK>oJfy(KwD5pmwL~AR2S~)(1G_H=@ZcYarea { 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