diff --git a/flutter/lib/common/widgets/peer_card.dart b/flutter/lib/common/widgets/peer_card.dart index 5796c7d20..8df84af6c 100644 --- a/flutter/lib/common/widgets/peer_card.dart +++ b/flutter/lib/common/widgets/peer_card.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_hbb/common/widgets/address_book.dart'; @@ -446,6 +448,22 @@ abstract class BasePeerCard extends StatelessWidget { ); } + /// Only avaliable on Windows. + @protected + MenuEntryBase<String> _createShortCutAction(String id) { + return MenuEntryButton<String>( + childBuilder: (TextStyle? style) => Text( + translate('Create Desktop Shortcut'), + style: style, + ), + proc: () { + bind.mainCreateShortcut(id: id); + }, + padding: menuPadding, + dismissOnClicked: true, + ); + } + @protected Future<MenuEntryBase<String>> _forceAlwaysRelayAction(String id) async { const option = 'force-always-relay'; @@ -649,6 +667,9 @@ class RecentPeerCard extends BasePeerCard { menuItems.add(_rdpAction(context, peer.id)); } menuItems.add(_wolAction(peer.id)); + if (Platform.isWindows) { + menuItems.add(_createShortCutAction(peer.id)); + } menuItems.add(MenuEntryDivider()); menuItems.add(_renameAction(peer.id, false)); menuItems.add(_removeAction(peer.id, () async { @@ -681,6 +702,9 @@ class FavoritePeerCard extends BasePeerCard { menuItems.add(_rdpAction(context, peer.id)); } menuItems.add(_wolAction(peer.id)); + if (Platform.isWindows) { + menuItems.add(_createShortCutAction(peer.id)); + } menuItems.add(MenuEntryDivider()); menuItems.add(_renameAction(peer.id, false)); menuItems.add(_removeAction(peer.id, () async { @@ -715,6 +739,9 @@ class DiscoveredPeerCard extends BasePeerCard { menuItems.add(_rdpAction(context, peer.id)); } menuItems.add(_wolAction(peer.id)); + if (Platform.isWindows) { + menuItems.add(_createShortCutAction(peer.id)); + } menuItems.add(MenuEntryDivider()); menuItems.add(_removeAction(peer.id, () async {})); return menuItems; @@ -740,6 +767,9 @@ class AddressBookPeerCard extends BasePeerCard { menuItems.add(_rdpAction(context, peer.id)); } menuItems.add(_wolAction(peer.id)); + if (Platform.isWindows) { + menuItems.add(_createShortCutAction(peer.id)); + } menuItems.add(MenuEntryDivider()); menuItems.add(_renameAction(peer.id, false)); menuItems.add(_removeAction(peer.id, () async {})); diff --git a/src/core_main.rs b/src/core_main.rs index d22d4e71b..39b13999e 100644 --- a/src/core_main.rs +++ b/src/core_main.rs @@ -1,6 +1,10 @@ use hbb_common::log; -// shared by flutter and sciter main function +/// shared by flutter and sciter main function +/// +/// [Note] +/// If it returns [`None`], then the process will terminate, and flutter gui will not be started. +/// If it returns [`Some`], then the process will continue, and flutter gui will be started. pub fn core_main() -> Option<Vec<String>> { // https://docs.rs/flexi_logger/latest/flexi_logger/error_info/index.html#write // though async logger more efficient, but it also causes more problems, disable it for now @@ -223,6 +227,8 @@ fn import_config(path: &str) { /// /// [Note] /// this is for invoke new connection from dbus. +/// If it returns [`None`], then the process will terminate, and flutter gui will not be started. +/// If it returns [`Some`], then the process will continue, and flutter gui will be started. #[cfg(feature = "flutter")] fn core_main_invoke_new_connection(mut args: std::env::Args) -> Option<Vec<String>> { args.position(|element| { @@ -250,5 +256,5 @@ fn core_main_invoke_new_connection(mut args: std::env::Args) -> Option<Vec<Strin } } #[cfg(not(target_os = "linux"))] - return None; + return Some(Vec::new()); } diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index 3c9ce96b9..3a2e3f58e 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -973,6 +973,11 @@ pub fn main_wol(id: String) { crate::lan::send_wol(id) } +pub fn main_create_shortcut(_id: String) { + #[cfg(windows)] + create_shortcut(_id); +} + pub fn cm_send_chat(conn_id: i32, msg: String) { crate::ui_cm_interface::send_chat(conn_id, msg); }