From b6c1816833c435db1cf1acf179a3245bea29adce Mon Sep 17 00:00:00 2001 From: dignow Date: Mon, 4 Sep 2023 12:11:35 +0800 Subject: [PATCH 1/7] fix generating id Signed-off-by: dignow --- flutter/lib/models/server_model.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/flutter/lib/models/server_model.dart b/flutter/lib/models/server_model.dart index 00c5490e0..9fb91f463 100644 --- a/flutter/lib/models/server_model.dart +++ b/flutter/lib/models/server_model.dart @@ -40,6 +40,8 @@ class ServerModel with ChangeNotifier { late String _emptyIdShow; late final IDTextEditingController _serverId; + final _serverPasswd = + TextEditingController(text: translate("Generating ...")); final tabController = DesktopTabController(tabType: DesktopTabType.cm); @@ -61,9 +63,6 @@ class ServerModel with ChangeNotifier { int get connectStatus => _connectStatus; - TextEditingController get _serverPasswd => - TextEditingController(text: translate("Generating ...")); - String get verificationMethod { final index = [ kUseTemporaryPassword, From ea41a60057d03a7ad746ec4e1dc250b5b44a9c50 Mon Sep 17 00:00:00 2001 From: dignow Date: Mon, 4 Sep 2023 14:17:54 +0800 Subject: [PATCH 2/7] fix, the session image covers android toolbar Signed-off-by: dignow --- flutter/lib/common.dart | 3 +++ flutter/lib/desktop/pages/remote_page.dart | 5 +++- .../lib/desktop/widgets/remote_toolbar.dart | 17 +++++++++----- flutter/lib/mobile/pages/remote_page.dart | 5 +++- flutter/lib/models/model.dart | 23 +++++++++++-------- 5 files changed, 35 insertions(+), 18 deletions(-) diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index 208c7f7c8..672adca75 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -614,6 +614,7 @@ class OverlayDialogManager { int _tagCount = 0; OverlayEntry? _mobileActionsOverlayEntry; + RxBool mobileActionsOverlayVisible = false.obs; void setOverlayState(OverlayKeyState overlayKeyState) { _overlayKeyState = overlayKeyState; @@ -780,12 +781,14 @@ class OverlayDialogManager { }); overlayState.insert(overlay); _mobileActionsOverlayEntry = overlay; + mobileActionsOverlayVisible.value = true; } void hideMobileActionsOverlay() { if (_mobileActionsOverlayEntry != null) { _mobileActionsOverlayEntry!.remove(); _mobileActionsOverlayEntry = null; + mobileActionsOverlayVisible.value = false; return; } } diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index 7e6e8ff86..f265f1895 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -279,7 +279,10 @@ class _RemotePageState extends State _ffi.ffiModel.pi.isSet.isTrue && _ffi.ffiModel.waitForFirstImage.isTrue ? emptyOverlay() - : Offstage(), + : () { + _ffi.ffiModel.tryShowAndroidActionsOverlay(); + return Offstage(); + }(), // Use Overlay to enable rebuild every time on menu button click. _ffi.ffiModel.pi.isSet.isTrue ? Overlay(initialEntries: [ diff --git a/flutter/lib/desktop/widgets/remote_toolbar.dart b/flutter/lib/desktop/widgets/remote_toolbar.dart index 9d6dec496..b59ae3736 100644 --- a/flutter/lib/desktop/widgets/remote_toolbar.dart +++ b/flutter/lib/desktop/widgets/remote_toolbar.dart @@ -101,6 +101,9 @@ class ToolbarState { class _ToolbarTheme { static const Color blueColor = MyTheme.button; static const Color hoverBlueColor = MyTheme.accent; + static Color inactiveColor = Colors.grey[800]!; + static Color hoverInactiveColor = Colors.grey[850]!; + static const Color redColor = Colors.redAccent; static const Color hoverRedColor = Colors.red; // kMinInteractiveDimension @@ -543,9 +546,9 @@ class _PinMenu extends StatelessWidget { assetName: state.pin ? "assets/pinned.svg" : "assets/unpinned.svg", tooltip: state.pin ? 'Unpin Toolbar' : 'Pin Toolbar', onPressed: state.switchPin, - color: state.pin ? _ToolbarTheme.blueColor : Colors.grey[800]!, + color: state.pin ? _ToolbarTheme.blueColor : _ToolbarTheme.inactiveColor, hoverColor: - state.pin ? _ToolbarTheme.hoverBlueColor : Colors.grey[850]!, + state.pin ? _ToolbarTheme.hoverBlueColor : _ToolbarTheme.hoverInactiveColor, ), ); } @@ -558,13 +561,15 @@ class _MobileActionMenu extends StatelessWidget { @override Widget build(BuildContext context) { if (!ffi.ffiModel.isPeerAndroid) return Offstage(); - return _IconMenuButton( + return Obx(()=>_IconMenuButton( assetName: 'assets/actions_mobile.svg', tooltip: 'Mobile Actions', onPressed: () => ffi.dialogManager.toggleMobileActionsOverlay(ffi: ffi), - color: _ToolbarTheme.blueColor, - hoverColor: _ToolbarTheme.hoverBlueColor, - ); + color: ffi.dialogManager.mobileActionsOverlayVisible.isTrue + ? _ToolbarTheme.blueColor : _ToolbarTheme.inactiveColor, + hoverColor: ffi.dialogManager.mobileActionsOverlayVisible.isTrue + ? _ToolbarTheme.hoverBlueColor : _ToolbarTheme.hoverInactiveColor, + )); } } diff --git a/flutter/lib/mobile/pages/remote_page.dart b/flutter/lib/mobile/pages/remote_page.dart index ff650d3c9..519e228f8 100644 --- a/flutter/lib/mobile/pages/remote_page.dart +++ b/flutter/lib/mobile/pages/remote_page.dart @@ -266,7 +266,10 @@ class _RemotePageState extends State { gFFI.ffiModel.pi.isSet.isTrue && gFFI.ffiModel.waitForFirstImage.isTrue ? emptyOverlay() - : Offstage(), + : () { + gFFI.ffiModel.tryShowAndroidActionsOverlay(); + return Offstage(); + }(), _bottomWidget(), gFFI.ffiModel.pi.isSet.isFalse ? emptyOverlay() : Offstage(), ], diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index 95b5094df..a1f22242e 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -554,23 +554,13 @@ class FfiModel with ChangeNotifier { } final connType = parent.target?.connType; - if (isPeerAndroid) { _touchMode = true; - if (connType == ConnType.defaultConn && - parent.target != null && - parent.target!.ffiModel.permissions['keyboard'] != false) { - Timer( - const Duration(milliseconds: 100), - () => parent.target!.dialogManager - .showMobileActionsOverlay(ffi: parent.target!)); - } } else { _touchMode = await bind.sessionGetOption( sessionId: sessionId, arg: 'touch-mode') != ''; } - if (connType == ConnType.fileTransfer) { parent.target?.fileModel.onReady(); } else if (connType == ConnType.defaultConn) { @@ -616,6 +606,19 @@ class FfiModel with ChangeNotifier { notifyListeners(); } + tryShowAndroidActionsOverlay({int delayMSecs = 10}) { + if (isPeerAndroid) { + if (parent.target?.connType == ConnType.defaultConn && + parent.target != null && + parent.target!.ffiModel.permissions['keyboard'] != false) { + Timer( + Duration(milliseconds: delayMSecs), + () => parent.target!.dialogManager + .showMobileActionsOverlay(ffi: parent.target!)); + } + } + } + handleResolutions(String id, dynamic resolutions) { try { final List dynamicArray = jsonDecode(resolutions as String); From cd2541a9d2177899d39efe387ddc7266c3a47960 Mon Sep 17 00:00:00 2001 From: rustdesk Date: Mon, 4 Sep 2023 15:50:13 +0800 Subject: [PATCH 3/7] fix docker issue #5595 --- src/core_main.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core_main.rs b/src/core_main.rs index 7e328d278..7b7b4b590 100644 --- a/src/core_main.rs +++ b/src/core_main.rs @@ -222,6 +222,8 @@ pub fn core_main() -> Option> { log::info!("start --uninstall-service"); crate::platform::uninstall_service(false); } else if args[0] == "--service" { + #[cfg(target_os = "macos")] + crate::platform::macos::hide_dock(); log::info!("start --service"); crate::start_os_service(); return None; From 8235bca664b31259a5ebb65b097c9ba64a92080b Mon Sep 17 00:00:00 2001 From: rustdesk Date: Mon, 4 Sep 2023 16:22:56 +0800 Subject: [PATCH 4/7] fix mac uninstall service --- src/platform/macos.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/platform/macos.rs b/src/platform/macos.rs index fa6f630ca..78e52faf4 100644 --- a/src/platform/macos.rs +++ b/src/platform/macos.rs @@ -240,6 +240,11 @@ pub fn uninstall_service(show_new_window: bool) -> bool { uninstalled ); if uninstalled { + if !show_new_window { + let _ = crate::ipc::close_all_instances(); + // leave ipc a little time + std::thread::sleep(std::time::Duration::from_millis(300)); + } crate::ipc::set_option("stop-service", "Y"); std::process::Command::new("launchctl") .args(&["remove", &format!("{}_server", crate::get_full_name())]) @@ -255,13 +260,6 @@ pub fn uninstall_service(show_new_window: bool) -> bool { .spawn() .ok(); } - std::process::Command::new("pkill") - .arg(crate::get_app_name()) - .status() - .ok(); - let _ = crate::ipc::close_all_instances(); - // leave ipc a little time - std::thread::sleep(std::time::Duration::from_millis(300)); quit_gui(); } } From 85e82d0bd57929c1693af766ce3dab82c1997498 Mon Sep 17 00:00:00 2001 From: fufesou Date: Mon, 4 Sep 2023 23:21:47 +0800 Subject: [PATCH 5/7] fix, mobile connecting canvas color Signed-off-by: fufesou --- flutter/lib/mobile/pages/remote_page.dart | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/flutter/lib/mobile/pages/remote_page.dart b/flutter/lib/mobile/pages/remote_page.dart index 519e228f8..838545d0c 100644 --- a/flutter/lib/mobile/pages/remote_page.dart +++ b/flutter/lib/mobile/pages/remote_page.dart @@ -92,12 +92,16 @@ class _RemotePageState extends State { removeSharedStates(widget.id); } - Widget emptyOverlay() => BlockableOverlay( + // to-do: It should be better to use transparent color instead of the bgColor. + // But for now, the transparent color will cause the canvas to be white. + // I'm sure that the white color is caused by the Overlay widget in BlockableOverlay. + // But I don't know why and how to fix it. + Widget emptyOverlay(Color bgColor) => BlockableOverlay( /// the Overlay key will be set with _blockableOverlayState in BlockableOverlay /// see override build() in [BlockableOverlay] state: _blockableOverlayState, underlying: Container( - color: Colors.transparent, + color: bgColor, ), ); @@ -265,13 +269,13 @@ class _RemotePageState extends State { children: [ gFFI.ffiModel.pi.isSet.isTrue && gFFI.ffiModel.waitForFirstImage.isTrue - ? emptyOverlay() + ? emptyOverlay(MyTheme.canvasColor) : () { gFFI.ffiModel.tryShowAndroidActionsOverlay(); return Offstage(); }(), _bottomWidget(), - gFFI.ffiModel.pi.isSet.isFalse ? emptyOverlay() : Offstage(), + gFFI.ffiModel.pi.isSet.isFalse ? emptyOverlay(MyTheme.canvasColor) : Offstage(), ], )), body: Overlay( From 7242d03f568beec3819e0a1aa6235c8e21258780 Mon Sep 17 00:00:00 2001 From: rustdesk Date: Tue, 5 Sep 2023 15:09:41 +0800 Subject: [PATCH 6/7] change target android sdk to 33 --- flutter/android/app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flutter/android/app/build.gradle b/flutter/android/app/build.gradle index 326689e5e..f4dc69e41 100644 --- a/flutter/android/app/build.gradle +++ b/flutter/android/app/build.gradle @@ -46,7 +46,7 @@ android { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.carriez.flutter_hbb" minSdkVersion 21 - targetSdkVersion 31 + targetSdkVersion 33 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } From f1c0f1d0a4c8ecb5d8190ebd44d422d826eddf6c Mon Sep 17 00:00:00 2001 From: rustdesk Date: Tue, 5 Sep 2023 17:44:49 +0800 Subject: [PATCH 7/7] prepare for https://github.com/rustdesk/rustdesk-server-pro/discussions/65 --- src/common.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/common.rs b/src/common.rs index 36ca972b2..8477c9e62 100644 --- a/src/common.rs +++ b/src/common.rs @@ -779,12 +779,18 @@ pub fn get_sysinfo() -> serde_json::Value { os = format!("{os} - {}", system.os_version().unwrap_or_default()); } let hostname = hostname(); // sys.hostname() return localhost on android in my test - serde_json::json!({ + use serde_json::json; + let mut out = json!({ "cpu": format!("{cpu}{num_cpus}/{num_pcpus} cores"), "memory": format!("{memory}GB"), "os": os, "hostname": hostname, - }) + }); + #[cfg(not(any(target_os = "android", target_os = "ios")))] + { + out["username"] = json!(crate::platform::get_active_username()); + } + out } #[inline]