fix linux restore button and clipboard initial sync issue
This commit is contained in:
parent
7e1c56033b
commit
d825d30e53
@ -50,6 +50,20 @@ pub fn valid_for_capslock(evt: &KeyEvent) -> bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn create_clipboard_msg(content: String) -> Message {
|
||||||
|
let bytes = content.into_bytes();
|
||||||
|
let compressed = compress_func(&bytes, COMPRESS_LEVEL);
|
||||||
|
let compress = compressed.len() < bytes.len();
|
||||||
|
let content = if compress { compressed } else { bytes };
|
||||||
|
let mut msg = Message::new();
|
||||||
|
msg.set_clipboard(Clipboard {
|
||||||
|
compress,
|
||||||
|
content,
|
||||||
|
..Default::default()
|
||||||
|
});
|
||||||
|
msg
|
||||||
|
}
|
||||||
|
|
||||||
pub fn check_clipboard(
|
pub fn check_clipboard(
|
||||||
ctx: &mut ClipboardContext,
|
ctx: &mut ClipboardContext,
|
||||||
old: Option<&Arc<Mutex<String>>>,
|
old: Option<&Arc<Mutex<String>>>,
|
||||||
@ -61,18 +75,8 @@ pub fn check_clipboard(
|
|||||||
let changed = content != *old.lock().unwrap();
|
let changed = content != *old.lock().unwrap();
|
||||||
if changed {
|
if changed {
|
||||||
log::info!("{} update found on {}", CLIPBOARD_NAME, side);
|
log::info!("{} update found on {}", CLIPBOARD_NAME, side);
|
||||||
let bytes = content.clone().into_bytes();
|
*old.lock().unwrap() = content.clone();
|
||||||
*old.lock().unwrap() = content;
|
return Some(create_clipboard_msg(content));
|
||||||
let compressed = compress_func(&bytes, COMPRESS_LEVEL);
|
|
||||||
let compress = compressed.len() < bytes.len();
|
|
||||||
let content = if compress { compressed } else { bytes };
|
|
||||||
let mut msg = Message::new();
|
|
||||||
msg.set_clipboard(Clipboard {
|
|
||||||
compress,
|
|
||||||
content,
|
|
||||||
..Default::default()
|
|
||||||
});
|
|
||||||
return Some(msg);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,6 @@ pub use crate::common::{
|
|||||||
|
|
||||||
struct State {
|
struct State {
|
||||||
ctx: Option<ClipboardContext>,
|
ctx: Option<ClipboardContext>,
|
||||||
initialized: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for State {
|
impl Default for State {
|
||||||
@ -18,22 +17,18 @@ impl Default for State {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Self {
|
Self { ctx }
|
||||||
ctx,
|
|
||||||
initialized: false,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl super::service::Reset for State {
|
impl super::service::Reset for State {
|
||||||
fn reset(&mut self) {
|
fn reset(&mut self) {
|
||||||
*CONTENT.lock().unwrap() = Default::default();
|
*CONTENT.lock().unwrap() = Default::default();
|
||||||
self.initialized = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new() -> GenericService {
|
pub fn new() -> GenericService {
|
||||||
let sp = GenericService::new(NAME, false);
|
let sp = GenericService::new(NAME, true);
|
||||||
sp.repeat::<State, _>(INTERVAL, run);
|
sp.repeat::<State, _>(INTERVAL, run);
|
||||||
sp
|
sp
|
||||||
}
|
}
|
||||||
@ -41,13 +36,16 @@ pub fn new() -> GenericService {
|
|||||||
fn run(sp: GenericService, state: &mut State) -> ResultType<()> {
|
fn run(sp: GenericService, state: &mut State) -> ResultType<()> {
|
||||||
if let Some(ctx) = state.ctx.as_mut() {
|
if let Some(ctx) = state.ctx.as_mut() {
|
||||||
if let Some(msg) = check_clipboard(ctx, None) {
|
if let Some(msg) = check_clipboard(ctx, None) {
|
||||||
if !state.initialized {
|
|
||||||
state.initialized = true;
|
|
||||||
// ignore clipboard update before service start
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
sp.send(msg);
|
sp.send(msg);
|
||||||
}
|
}
|
||||||
|
sp.snapshot(|sps| {
|
||||||
|
let txt = crate::CONTENT.lock().unwrap().clone();
|
||||||
|
if !txt.is_empty() {
|
||||||
|
let msg_out = crate::create_clipboard_msg(txt);
|
||||||
|
sps.send_shared(Arc::new(msg_out));
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
})?;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,9 @@ function stateChanged() {
|
|||||||
cur_window_state = view.windowState;
|
cur_window_state = view.windowState;
|
||||||
adjustBorder();
|
adjustBorder();
|
||||||
adaptDisplay();
|
adaptDisplay();
|
||||||
if (!is_linux) view.focus = handler; // this cause windows always topmost on linux
|
if (cur_window_state != View.WINDOW_MINIMIZED) {
|
||||||
|
view.focus = handler; // to make focus away from restore/maximize button, so that enter key work
|
||||||
|
}
|
||||||
var fs = view.windowState == View.WINDOW_FULL_SCREEN;
|
var fs = view.windowState == View.WINDOW_FULL_SCREEN;
|
||||||
var el = $(#fullscreen);
|
var el = $(#fullscreen);
|
||||||
if (el) el.attributes.toggleClass("active", fs);
|
if (el) el.attributes.toggleClass("active", fs);
|
||||||
|
@ -9,6 +9,7 @@ use hbb_common::{
|
|||||||
fs, log,
|
fs, log,
|
||||||
message_proto::*,
|
message_proto::*,
|
||||||
protobuf::Message as _,
|
protobuf::Message as _,
|
||||||
|
sleep,
|
||||||
tokio::{
|
tokio::{
|
||||||
self,
|
self,
|
||||||
sync::mpsc,
|
sync::mpsc,
|
||||||
@ -1145,7 +1146,7 @@ impl Remote {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn start_clipboard(&mut self) -> Option<std::sync::mpsc::Sender<()>> {
|
fn start_clipboard(&mut self) -> Option<std::sync::mpsc::Sender<()>> {
|
||||||
if self.handler.is_file_transfer() {
|
if self.handler.is_file_transfer() || self.handler.is_port_forward() {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
let (tx, rx) = std::sync::mpsc::channel();
|
let (tx, rx) = std::sync::mpsc::channel();
|
||||||
@ -1430,6 +1431,23 @@ impl Remote {
|
|||||||
}
|
}
|
||||||
Some(login_response::Union::peer_info(pi)) => {
|
Some(login_response::Union::peer_info(pi)) => {
|
||||||
self.handler.handle_peer_info(pi);
|
self.handler.handle_peer_info(pi);
|
||||||
|
if !(self.handler.is_file_transfer()
|
||||||
|
|| self.handler.is_port_forward()
|
||||||
|
|| !*self.clipboard.read().unwrap()
|
||||||
|
|| !*self.keyboard.read().unwrap()
|
||||||
|
|| self.handler.lc.read().unwrap().disable_clipboard)
|
||||||
|
{
|
||||||
|
let txt = self.old_clipboard.lock().unwrap().clone();
|
||||||
|
if !txt.is_empty() {
|
||||||
|
let msg_out = crate::create_clipboard_msg(txt);
|
||||||
|
let sender = self.sender.clone();
|
||||||
|
tokio::spawn(async move {
|
||||||
|
// due to clipboard service interval time
|
||||||
|
sleep(common::CLIPBOARD_INTERVAL as f32 / 1_000.).await;
|
||||||
|
sender.send(Data::Message(msg_out)).ok();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
@ -1587,7 +1605,7 @@ impl Interface for Handler {
|
|||||||
pi_sciter.set_item("sas_enabled", pi.sas_enabled);
|
pi_sciter.set_item("sas_enabled", pi.sas_enabled);
|
||||||
if self.is_file_transfer() {
|
if self.is_file_transfer() {
|
||||||
if pi.username.is_empty() {
|
if pi.username.is_empty() {
|
||||||
self.on_error("No active user logged on, please connect and logon first.");
|
self.on_error("No active console user logged on, please connect and logon first.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if !self.is_port_forward() {
|
} else if !self.is_port_forward() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user