fix, separate window, event stream leak
Signed-off-by: dignow <linlong1265@gmail.com>
This commit is contained in:
parent
6111042907
commit
7dcb28ce33
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -1093,16 +1093,28 @@ pub fn push_global_event(channel: &str, event: String) -> Option<bool> {
|
||||
Some(GLOBAL_EVENT_STREAM.read().unwrap().get(channel)?.add(event))
|
||||
}
|
||||
|
||||
pub fn start_global_event_stream(s: StreamSink<String>, app_type: String) -> ResultType<()> {
|
||||
if let Some(_) = GLOBAL_EVENT_STREAM
|
||||
.write()
|
||||
#[inline]
|
||||
pub fn get_global_event_channels() -> Vec<String> {
|
||||
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<String>, app_type: String) -> ResultType<()> {
|
||||
let app_type_values = app_type.split(",").collect::<Vec<&str>>();
|
||||
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(())
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -52,6 +52,9 @@ lazy_static::lazy_static! {
|
||||
|
||||
pub mod client {
|
||||
use super::*;
|
||||
lazy_static::lazy_static! {
|
||||
static ref IS_GRAB_STARTED: Arc<Mutex<bool>> = 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")))]
|
||||
|
@ -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());
|
||||
|
@ -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()),
|
||||
|
@ -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));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user