From 7dcb28ce3342852ce5de337d13666c70eb7157a0 Mon Sep 17 00:00:00 2001 From: dignow Date: Mon, 7 Aug 2023 09:01:31 +0800 Subject: [PATCH 1/2] fix, separate window, event stream leak Signed-off-by: dignow --- .../lib/desktop/pages/remote_tab_page.dart | 1 - flutter/lib/models/native_model.dart | 4 ++- src/flutter.rs | 30 +++++++++++++------ src/flutter_ffi.rs | 13 ++++---- src/keyboard.rs | 8 +++++ src/plugin/callback_msg.rs | 1 + src/plugin/native_handlers/session.rs | 2 ++ src/plugin/plugins.rs | 8 +---- 8 files changed, 41 insertions(+), 26 deletions(-) diff --git a/flutter/lib/desktop/pages/remote_tab_page.dart b/flutter/lib/desktop/pages/remote_tab_page.dart index f2ceb9d8f..3762a2b52 100644 --- a/flutter/lib/desktop/pages/remote_tab_page.dart +++ b/flutter/lib/desktop/pages/remote_tab_page.dart @@ -20,7 +20,6 @@ import 'package:get/get.dart'; import 'package:bot_toast/bot_toast.dart'; import '../../common/widgets/dialog.dart'; -import '../../common/widgets/toolbar.dart'; import '../../models/platform_model.dart'; class _MenuTheme { diff --git a/flutter/lib/models/native_model.dart b/flutter/lib/models/native_model.dart index 51940bb18..d2e11e2c1 100644 --- a/flutter/lib/models/native_model.dart +++ b/flutter/lib/models/native_model.dart @@ -8,6 +8,7 @@ import 'package:ffi/ffi.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:flutter_hbb/consts.dart'; +import 'package:flutter_hbb/main.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:path_provider/path_provider.dart'; @@ -263,7 +264,8 @@ class PlatformFFI { /// Start listening to the Rust core's events and frames. void _startListenEvent(RustdeskImpl rustdeskImpl) { - var sink = rustdeskImpl.startGlobalEventStream(appType: _appType); + final appType = _appType == kAppTypeDesktopRemote ? '$_appType,$kWindowId' : _appType; + var sink = rustdeskImpl.startGlobalEventStream(appType: appType); sink.listen((message) { () async { try { diff --git a/src/flutter.rs b/src/flutter.rs index c0766c008..318c6c131 100644 --- a/src/flutter.rs +++ b/src/flutter.rs @@ -1093,16 +1093,28 @@ pub fn push_global_event(channel: &str, event: String) -> Option { Some(GLOBAL_EVENT_STREAM.read().unwrap().get(channel)?.add(event)) } -pub fn start_global_event_stream(s: StreamSink, app_type: String) -> ResultType<()> { - if let Some(_) = GLOBAL_EVENT_STREAM - .write() +#[inline] +pub fn get_global_event_channels() -> Vec { + GLOBAL_EVENT_STREAM + .read() .unwrap() - .insert(app_type.clone(), s) - { - log::warn!( - "Global event stream of type {} is started before, but now removed", - app_type - ); + .keys() + .cloned() + .collect() +} + +pub fn start_global_event_stream(s: StreamSink, app_type: String) -> ResultType<()> { + let app_type_values = app_type.split(",").collect::>(); + let mut lock = GLOBAL_EVENT_STREAM.write().unwrap(); + if !lock.contains_key(app_type_values[0]) { + lock.insert(app_type.clone(), s); + } else { + if let Some(_) = lock.insert(app_type.clone(), s) { + log::warn!( + "Global event stream of type {} is started before, but now removed", + app_type + ); + } } Ok(()) } diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index 74806915f..3c483dbce 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -955,15 +955,12 @@ pub fn main_remove_discovered(id: String) { } fn main_broadcast_message(data: &HashMap<&str, &str>) { - let apps = vec![ - flutter::APP_TYPE_DESKTOP_REMOTE, - flutter::APP_TYPE_DESKTOP_FILE_TRANSFER, - flutter::APP_TYPE_DESKTOP_PORT_FORWARD, - ]; - let event = serde_json::ser::to_string(&data).unwrap_or("".to_owned()); - for app in apps { - let _res = flutter::push_global_event(app, event.clone()); + for app in flutter::get_global_event_channels() { + if app == flutter::APP_TYPE_MAIN || app == flutter::APP_TYPE_CM { + continue; + } + let _res = flutter::push_global_event(&app, event.clone()); } } diff --git a/src/keyboard.rs b/src/keyboard.rs index a217d6a89..ca12cf4a1 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -52,6 +52,9 @@ lazy_static::lazy_static! { pub mod client { use super::*; + lazy_static::lazy_static! { + static ref IS_GRAB_STARTED: Arc> = Arc::new(Mutex::new(false)); + } pub fn get_keyboard_mode() -> String { #[cfg(not(any(feature = "flutter", feature = "cli")))] @@ -70,7 +73,12 @@ pub mod client { } pub fn start_grab_loop() { + let mut lock = IS_GRAB_STARTED.lock().unwrap(); + if *lock { + return; + } super::start_grab_loop(); + *lock = true; } #[cfg(not(any(target_os = "android", target_os = "ios")))] diff --git a/src/plugin/callback_msg.rs b/src/plugin/callback_msg.rs index 7ea0f7ae5..e634595e8 100644 --- a/src/plugin/callback_msg.rs +++ b/src/plugin/callback_msg.rs @@ -368,6 +368,7 @@ fn push_event_to_ui(channel: u16, peer: &str, content: &str) { m.insert("peer", &peer); m.insert("content", &content); let event = serde_json::to_string(&m).unwrap_or("".to_string()); + // Send to main and cm for (k, v) in MSG_TO_UI_FLUTTER_CHANNELS.iter() { if channel & k != 0 { let _res = flutter::push_global_event(v as _, event.to_string()); diff --git a/src/plugin/native_handlers/session.rs b/src/plugin/native_handlers/session.rs index f8c507a5b..fda07cd17 100644 --- a/src/plugin/native_handlers/session.rs +++ b/src/plugin/native_handlers/session.rs @@ -131,6 +131,8 @@ impl PluginNativeSessionHandler { let mut m = HashMap::new(); m.insert("name", MSG_TO_UI_TYPE_SESSION_CREATED); m.insert("session_id", &session_id); + // todo: APP_TYPE_DESKTOP_REMOTE is not used anymore. + // crate::flutter::APP_TYPE_DESKTOP_REMOTE + window id, is used for multi-window support. crate::flutter::push_global_event( crate::flutter::APP_TYPE_DESKTOP_REMOTE, serde_json::to_string(&m).unwrap_or("".to_string()), diff --git a/src/plugin/plugins.rs b/src/plugin/plugins.rs index d4ffc4539..b40ee4116 100644 --- a/src/plugin/plugins.rs +++ b/src/plugin/plugins.rs @@ -628,13 +628,7 @@ fn reload_ui(desc: &Desc, sync_to: Option<&str>) { // The first element is the "client" or "host". // The second element is the "main", "remote", "cm", "file transfer", "port forward". if v.len() >= 2 { - let available_channels = vec![ - flutter::APP_TYPE_MAIN, - flutter::APP_TYPE_DESKTOP_REMOTE, - flutter::APP_TYPE_CM, - flutter::APP_TYPE_DESKTOP_FILE_TRANSFER, - flutter::APP_TYPE_DESKTOP_PORT_FORWARD, - ]; + let available_channels = flutter::get_global_event_channels(); if available_channels.contains(&v[1]) { let _res = flutter::push_global_event(v[1], make_event(&ui)); } From 46233a0f4c71b1e82d469873aa2b9a8d1eb35a29 Mon Sep 17 00:00:00 2001 From: dignow Date: Mon, 7 Aug 2023 09:12:43 +0800 Subject: [PATCH 2/2] fix, event stream key Signed-off-by: dignow --- src/flutter.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/flutter.rs b/src/flutter.rs index 318c6c131..ae20b26a9 100644 --- a/src/flutter.rs +++ b/src/flutter.rs @@ -1107,7 +1107,7 @@ pub fn start_global_event_stream(s: StreamSink, app_type: String) -> Res let app_type_values = app_type.split(",").collect::>(); let mut lock = GLOBAL_EVENT_STREAM.write().unwrap(); if !lock.contains_key(app_type_values[0]) { - lock.insert(app_type.clone(), s); + lock.insert(app_type_values[0].to_string(), s); } else { if let Some(_) = lock.insert(app_type.clone(), s) { log::warn!(