win_fix_multi_tab: win clipboard refactor
Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
@@ -1178,6 +1178,16 @@ impl<T: InvokeUiSession> Remote<T> {
|
||||
#[cfg(windows)]
|
||||
fn handle_cliprdr_msg(&self, clip: message_proto::Cliprdr) {
|
||||
if !self.handler.lc.read().unwrap().disable_clipboard {
|
||||
#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))]
|
||||
if let Some(message_proto::cliprdr::Union::FormatList(_)) = &clip.union {
|
||||
if self.client_conn_id
|
||||
!= clipboard::get_client_conn_id(&crate::flutter::get_cur_session_id())
|
||||
.unwrap_or(0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(clip) = crate::clipboard_file::msg_2_clip(clip) {
|
||||
ContextSend::proc(|context: &mut Box<CliprdrClientContext>| -> u32 {
|
||||
clipboard::server_clip_file(context, self.client_conn_id, clip)
|
||||
|
||||
@@ -567,7 +567,7 @@ pub fn make_fd_flutter(id: i32, entries: &Vec<FileEntry>, only_count: bool) -> S
|
||||
}
|
||||
|
||||
pub fn get_cur_session_id() -> String {
|
||||
*CUR_SESSION_ID.read().unwrap()
|
||||
CUR_SESSION_ID.read().unwrap().clone()
|
||||
}
|
||||
|
||||
pub fn set_cur_session_id(id: String) {
|
||||
|
||||
@@ -1052,6 +1052,10 @@ pub fn main_update_me() -> SyncReturn<bool> {
|
||||
SyncReturn(true)
|
||||
}
|
||||
|
||||
pub fn set_cur_session_id(id: String) {
|
||||
super::flutter::set_cur_session_id(id)
|
||||
}
|
||||
|
||||
pub fn install_show_run_without_install() -> SyncReturn<bool> {
|
||||
SyncReturn(show_run_without_install())
|
||||
}
|
||||
|
||||
@@ -259,7 +259,6 @@ impl<T: InvokeUiCM> IpcTaskRunner<T> {
|
||||
use hbb_common::config::LocalConfig;
|
||||
|
||||
// for tmp use, without real conn id
|
||||
let conn_id_tmp = -1;
|
||||
let mut write_jobs: Vec<fs::TransferJob> = Vec::new();
|
||||
let mut close = true;
|
||||
|
||||
@@ -321,9 +320,8 @@ impl<T: InvokeUiCM> IpcTaskRunner<T> {
|
||||
log::info!("cm ipc connection disconnect");
|
||||
break;
|
||||
}
|
||||
Data::PrivacyModeState(_) => {
|
||||
self.conn_id = conn_id_tmp;
|
||||
allow_err!(self.tx.send(data));
|
||||
Data::PrivacyModeState((id, _)) => {
|
||||
cm_inner_send(id, data);
|
||||
}
|
||||
Data::ClickTime(ms) => {
|
||||
CLICK_TIME.store(ms, Ordering::SeqCst);
|
||||
@@ -338,7 +336,6 @@ impl<T: InvokeUiCM> IpcTaskRunner<T> {
|
||||
#[cfg(windows)]
|
||||
{
|
||||
let conn_id = self.conn_id;
|
||||
|
||||
ContextSend::proc(|context: &mut Box<CliprdrClientContext>| -> u32 {
|
||||
clipboard::server_clip_file(context, conn_id, _clip)
|
||||
});
|
||||
@@ -380,12 +377,10 @@ impl<T: InvokeUiCM> IpcTaskRunner<T> {
|
||||
},
|
||||
}
|
||||
}
|
||||
if self.conn_id != 0 && self.conn_id != conn_id_tmp {
|
||||
self.cm.remove_connection(self.conn_id, close);
|
||||
}
|
||||
}
|
||||
|
||||
async fn ipc_task(stream: Connection, cm: ConnectionManager<T>) {
|
||||
log::debug!("ipc task begin");
|
||||
let (tx, rx) = mpsc::unbounded_channel::<Data>();
|
||||
let mut task_runner = Self {
|
||||
stream,
|
||||
@@ -401,6 +396,10 @@ impl<T: InvokeUiCM> IpcTaskRunner<T> {
|
||||
if task_runner.conn_id > 0 {
|
||||
task_runner.run().await;
|
||||
}
|
||||
if task_runner.conn_id > 0 {
|
||||
task_runner.cm.remove_connection(task_runner.conn_id, close);
|
||||
}
|
||||
log::debug!("ipc task end");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -731,3 +730,17 @@ fn send_raw(msg: Message, tx: &UnboundedSender<Data>) {
|
||||
err => allow_err!(err),
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
fn cm_inner_send(id: i32, data: Data) {
|
||||
let lock = CLIENTS.read().unwrap();
|
||||
if id != 0 {
|
||||
if let Some(s) = lock.get(&id) {
|
||||
allow_err!(s.tx.send(data));
|
||||
}
|
||||
} else {
|
||||
for s in lock.values() {
|
||||
allow_err!(s.tx.send(data.clone()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user