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 'package:bot_toast/bot_toast.dart';
|
||||||
|
|
||||||
import '../../common/widgets/dialog.dart';
|
import '../../common/widgets/dialog.dart';
|
||||||
import '../../common/widgets/toolbar.dart';
|
|
||||||
import '../../models/platform_model.dart';
|
import '../../models/platform_model.dart';
|
||||||
|
|
||||||
class _MenuTheme {
|
class _MenuTheme {
|
||||||
|
@ -8,6 +8,7 @@ import 'package:ffi/ffi.dart';
|
|||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_hbb/consts.dart';
|
import 'package:flutter_hbb/consts.dart';
|
||||||
|
import 'package:flutter_hbb/main.dart';
|
||||||
import 'package:package_info_plus/package_info_plus.dart';
|
import 'package:package_info_plus/package_info_plus.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
|
||||||
@ -263,7 +264,8 @@ class PlatformFFI {
|
|||||||
|
|
||||||
/// Start listening to the Rust core's events and frames.
|
/// Start listening to the Rust core's events and frames.
|
||||||
void _startListenEvent(RustdeskImpl rustdeskImpl) {
|
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) {
|
sink.listen((message) {
|
||||||
() async {
|
() async {
|
||||||
try {
|
try {
|
||||||
|
@ -1093,17 +1093,29 @@ pub fn push_global_event(channel: &str, event: String) -> Option<bool> {
|
|||||||
Some(GLOBAL_EVENT_STREAM.read().unwrap().get(channel)?.add(event))
|
Some(GLOBAL_EVENT_STREAM.read().unwrap().get(channel)?.add(event))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn start_global_event_stream(s: StreamSink<String>, app_type: String) -> ResultType<()> {
|
#[inline]
|
||||||
if let Some(_) = GLOBAL_EVENT_STREAM
|
pub fn get_global_event_channels() -> Vec<String> {
|
||||||
.write()
|
GLOBAL_EVENT_STREAM
|
||||||
|
.read()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.insert(app_type.clone(), s)
|
.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!(
|
log::warn!(
|
||||||
"Global event stream of type {} is started before, but now removed",
|
"Global event stream of type {} is started before, but now removed",
|
||||||
app_type
|
app_type
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -955,15 +955,12 @@ pub fn main_remove_discovered(id: String) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn main_broadcast_message(data: &HashMap<&str, &str>) {
|
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());
|
let event = serde_json::ser::to_string(&data).unwrap_or("".to_owned());
|
||||||
for app in apps {
|
for app in flutter::get_global_event_channels() {
|
||||||
let _res = flutter::push_global_event(app, event.clone());
|
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 {
|
pub mod client {
|
||||||
use super::*;
|
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 {
|
pub fn get_keyboard_mode() -> String {
|
||||||
#[cfg(not(any(feature = "flutter", feature = "cli")))]
|
#[cfg(not(any(feature = "flutter", feature = "cli")))]
|
||||||
@ -70,7 +73,12 @@ pub mod client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn start_grab_loop() {
|
pub fn start_grab_loop() {
|
||||||
|
let mut lock = IS_GRAB_STARTED.lock().unwrap();
|
||||||
|
if *lock {
|
||||||
|
return;
|
||||||
|
}
|
||||||
super::start_grab_loop();
|
super::start_grab_loop();
|
||||||
|
*lock = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
#[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("peer", &peer);
|
||||||
m.insert("content", &content);
|
m.insert("content", &content);
|
||||||
let event = serde_json::to_string(&m).unwrap_or("".to_string());
|
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() {
|
for (k, v) in MSG_TO_UI_FLUTTER_CHANNELS.iter() {
|
||||||
if channel & k != 0 {
|
if channel & k != 0 {
|
||||||
let _res = flutter::push_global_event(v as _, event.to_string());
|
let _res = flutter::push_global_event(v as _, event.to_string());
|
||||||
|
@ -131,6 +131,8 @@ impl PluginNativeSessionHandler {
|
|||||||
let mut m = HashMap::new();
|
let mut m = HashMap::new();
|
||||||
m.insert("name", MSG_TO_UI_TYPE_SESSION_CREATED);
|
m.insert("name", MSG_TO_UI_TYPE_SESSION_CREATED);
|
||||||
m.insert("session_id", &session_id);
|
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::push_global_event(
|
||||||
crate::flutter::APP_TYPE_DESKTOP_REMOTE,
|
crate::flutter::APP_TYPE_DESKTOP_REMOTE,
|
||||||
serde_json::to_string(&m).unwrap_or("".to_string()),
|
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 first element is the "client" or "host".
|
||||||
// The second element is the "main", "remote", "cm", "file transfer", "port forward".
|
// The second element is the "main", "remote", "cm", "file transfer", "port forward".
|
||||||
if v.len() >= 2 {
|
if v.len() >= 2 {
|
||||||
let available_channels = vec![
|
let available_channels = flutter::get_global_event_channels();
|
||||||
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,
|
|
||||||
];
|
|
||||||
if available_channels.contains(&v[1]) {
|
if available_channels.contains(&v[1]) {
|
||||||
let _res = flutter::push_global_event(v[1], make_event(&ui));
|
let _res = flutter::push_global_event(v[1], make_event(&ui));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user