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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user