From 01ab0cf1963ac842cb5b7ee07867a2ad16d1c7b5 Mon Sep 17 00:00:00 2001 From: dignow Date: Fri, 4 Aug 2023 20:58:14 +0800 Subject: [PATCH] tmp commit Signed-off-by: dignow --- .../desktop/pages/desktop_setting_page.dart | 4 ++-- flutter/lib/models/model.dart | 8 +++---- flutter/lib/utils/multi_window_manager.dart | 8 +++---- src/client/io_loop.rs | 15 ++++++++++-- src/flutter_ffi.rs | 8 +++---- src/ui_session_interface.rs | 24 ++++++++++++++++--- 6 files changed, 47 insertions(+), 20 deletions(-) diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index c84f126bd..9072643ea 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -326,9 +326,9 @@ class _GeneralState extends State<_General> { update: () { final useSeparateWindow = mainGetLocalBoolOptionSync(kOptionSeparateRemoteWindow); - // if (useSeparateWindow) { + if (useSeparateWindow) { rustDeskWinManager.separateWindows(); - // } + } }, ), ]; diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index 1a24067a0..a77b3b238 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -1656,13 +1656,13 @@ class FFI { final cb = ffiModel.startEventListener(sessionId, id); final useTextureRender = bind.mainUseTextureRender(); - final SimpleWrapper isPeerInfoSent = SimpleWrapper(false); + final SimpleWrapper isCacheRestored = SimpleWrapper(false); // Preserved for the rgba data. stream.listen((message) { if (closed) return; - if (isSessionAdded && !isPeerInfoSent.value) { - bind.sessionHandlePeerInfo(sessionId: sessionId); - isPeerInfoSent.value = true; + if (isSessionAdded && !isCacheRestored.value) { + bind.sessionRestoreCache(sessionId: sessionId); + isCacheRestored.value = true; } () async { if (message is EventToUI_Event) { diff --git a/flutter/lib/utils/multi_window_manager.dart b/flutter/lib/utils/multi_window_manager.dart index 939bc7934..8c4a5303c 100644 --- a/flutter/lib/utils/multi_window_manager.dart +++ b/flutter/lib/utils/multi_window_manager.dart @@ -49,10 +49,10 @@ class RustDeskMultiWindowManager { final String sessionIdList = await DesktopMultiWindow.invokeMethod( windowId, kWindowEventGetSessionIdList, null); final idList = sessionIdList.split(';'); - // if (idList.length <= 1) { - // continue; - // } - for (final idPair in idList) { + if (idList.length <= 1) { + continue; + } + for (final idPair in idList.sublist(1)) { final peerSession = idPair.split(','); var params = { 'type': WindowType.RemoteDesktop.index, diff --git a/src/client/io_loop.rs b/src/client/io_loop.rs index f50dc4737..7c0b3a193 100644 --- a/src/client/io_loop.rs +++ b/src/client/io_loop.rs @@ -1010,7 +1010,7 @@ impl Remote { Some(login_response::Union::PeerInfo(pi)) => { #[cfg(feature = "flutter")] { - *self.handler.pi.write().unwrap() = pi.clone(); + self.handler.cache_flutter.write().unwrap().pi = pi.clone(); } self.handler.handle_peer_info(pi); #[cfg(not(feature = "flutter"))] @@ -1059,9 +1059,20 @@ impl Remote { _ => {} }, Some(message::Union::CursorData(cd)) => { + #[cfg(feature = "flutter")] + { + let mut lock = self.handler.cache_flutter.write().unwrap(); + if !lock.cursor_data.contains_key(&cd.id) { + lock.cursor_data.insert(cd.id, cd.clone()); + } + } self.handler.set_cursor_data(cd); } Some(message::Union::CursorId(id)) => { + #[cfg(feature = "flutter")] + { + self.handler.cache_flutter.write().unwrap().cursor_id = id; + } self.handler.set_cursor_id(id.to_string()); } Some(message::Union::CursorPosition(cp)) => { @@ -1280,7 +1291,7 @@ impl Remote { Some(misc::Union::SwitchDisplay(s)) => { #[cfg(feature = "flutter")] { - *self.handler.switch_display.write().unwrap() = s.clone(); + self.handler.cache_flutter.write().unwrap().sp = s.clone(); } self.handler.handle_peer_switch_display(&s); self.video_sender.send(MediaData::Reset).ok(); diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index c0529171a..c0e96a487 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -1,7 +1,7 @@ #[cfg(not(any(target_os = "android", target_os = "ios")))] use crate::common::get_default_sound_input; use crate::{ - client::{file_trait::FileManager, Interface}, + client::file_trait::FileManager, common::is_keyboard_mode_supported, common::make_fd_to_json, flutter::{self, SESSIONS}, @@ -601,11 +601,9 @@ pub fn session_change_resolution(session_id: SessionID, display: i32, width: i32 } } -pub fn session_handle_peer_info(session_id: SessionID) { +pub fn session_restore_cache(session_id: SessionID) { if let Some(session) = SESSIONS.write().unwrap().get_mut(&session_id) { - let pi = session.pi.read().unwrap().clone(); - session.handle_peer_info(pi); - session.handle_peer_switch_display(&session.switch_display.read().unwrap()); + session.restore_flutter_cache(); } } diff --git a/src/ui_session_interface.rs b/src/ui_session_interface.rs index 32f8fe5bf..50bc23339 100644 --- a/src/ui_session_interface.rs +++ b/src/ui_session_interface.rs @@ -48,6 +48,15 @@ pub static IS_IN: AtomicBool = AtomicBool::new(false); const CHANGE_RESOLUTION_VALID_TIMEOUT_SECS: u64 = 15; +#[cfg(feature = "flutter")] +#[derive(Default)] +pub struct CacheFlutter { + pub pi: PeerInfo, + pub sp: SwitchDisplay, + pub cursor_data: HashMap, + pub cursor_id: u64, +} + #[derive(Clone, Default)] pub struct Session { pub session_id: SessionID, // different from the one in LoginConfigHandler, used for flutter UI message pass @@ -63,9 +72,7 @@ pub struct Session { pub server_clipboard_enabled: Arc>, pub last_change_display: Arc>, #[cfg(feature = "flutter")] - pub pi: Arc>, - #[cfg(feature = "flutter")] - pub switch_display: Arc>, + pub cache_flutter: Arc>, } #[derive(Clone)] @@ -1185,6 +1192,17 @@ impl Session { pub fn ctrl_alt_del(&self) { self.send_key_event(&crate::keyboard::client::event_ctrl_alt_del()); } + + #[cfg(feature = "flutter")] + pub fn restore_flutter_cache(&mut self) { + let pi = self.cache_flutter.read().unwrap().pi.clone(); + self.handle_peer_info(pi); + self.handle_peer_switch_display(&self.cache_flutter.read().unwrap().sp); + for (_, cd) in self.cache_flutter.read().unwrap().cursor_data.iter() { + self.set_cursor_data(cd.clone()); + } + self.set_cursor_id(self.cache_flutter.read().unwrap().cursor_id.to_string()); + } } #[tokio::main(flavor = "current_thread")]