mirror of
https://github.com/rustdesk/rustdesk.git
synced 2024-11-23 19:49:05 +08:00
comments (#9297)
* comments Signed-off-by: fufesou <linlong1266@gmail.com> * comments Signed-off-by: fufesou <linlong1266@gmail.com> --------- Signed-off-by: fufesou <linlong1266@gmail.com>
This commit is contained in:
parent
2922ebe22a
commit
a2792d1527
@ -272,6 +272,15 @@ impl ClipboardContext {
|
||||
}
|
||||
|
||||
fn get_formats(&mut self, formats: &[ClipboardFormat]) -> ResultType<Vec<ClipboardData>> {
|
||||
// If there're multiple threads or processes trying to access the clipboard at the same time,
|
||||
// the previous clipboard owner will fail to access the clipboard.
|
||||
// `GetLastError()` will return `ERROR_CLIPBOARD_NOT_OPEN` (OSError(1418): Thread does not have a clipboard open) at this time.
|
||||
// See https://github.com/rustdesk-org/arboard/blob/747ab2d9b40a5c9c5102051cf3b0bb38b4845e60/src/platform/windows.rs#L34
|
||||
//
|
||||
// This is a common case on Windows, so we retry here.
|
||||
// Related issues:
|
||||
// https://github.com/rustdesk/rustdesk/issues/9263
|
||||
// https://github.com/rustdesk/rustdesk/issues/9222#issuecomment-2329233175
|
||||
for i in 0..CLIPBOARD_GET_MAX_RETRY {
|
||||
match self.inner.get_formats(SUPPORTED_FORMATS) {
|
||||
Ok(data) => {
|
||||
|
@ -131,9 +131,12 @@ impl Handler {
|
||||
check_clipboard(&mut self.ctx, ClipboardSide::Host, false)
|
||||
}
|
||||
|
||||
// It's ok to do async operation in the clipboard service because:
|
||||
// 1. the clipboard is not used frequently.
|
||||
// 2. the clipboard handle is sync and will not block the main thread.
|
||||
// Read clipboard data from cm using ipc.
|
||||
//
|
||||
// We cannot use `#[tokio::main(flavor = "current_thread")]` here,
|
||||
// because the auto-managed tokio runtime (async context) will be dropped after the call.
|
||||
// The next call will create a new runtime, which will cause the previous stream to be unusable.
|
||||
// So we need to manage the tokio runtime manually.
|
||||
#[cfg(windows)]
|
||||
fn read_clipboard_from_cm_ipc(&mut self) -> ResultType<Vec<ClipboardNonFile>> {
|
||||
if self.rt.is_none() {
|
||||
|
Loading…
Reference in New Issue
Block a user