From cce758143e2efb2e94fd8da0134e2d4cc076b903 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Tue, 17 Oct 2023 13:57:01 -0700 Subject: [PATCH 1/6] Update `x11rb` and `smithay-clipboard` dependencies --- wayland/Cargo.toml | 2 +- x11/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wayland/Cargo.toml b/wayland/Cargo.toml index 70386c5..f3ae126 100644 --- a/wayland/Cargo.toml +++ b/wayland/Cargo.toml @@ -10,4 +10,4 @@ documentation = "https://docs.rs/clipboard_wayland" keywords = ["clipboard", "wayland"] [dependencies] -smithay-clipboard = "0.6" +smithay-clipboard = "0.7" diff --git a/x11/Cargo.toml b/x11/Cargo.toml index 8fa396e..cbfc18e 100644 --- a/x11/Cargo.toml +++ b/x11/Cargo.toml @@ -10,5 +10,5 @@ documentation = "https://docs.rs/clipboard_x11" keywords = ["clipboard", "x11"] [dependencies] -x11rb = "0.11" +x11rb = "0.13" thiserror = "1.0" From d6224e1b033180ac68f3837166bfaa0be17d2ca4 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Tue, 16 Jan 2024 20:45:19 -0800 Subject: [PATCH 2/6] Update `clipboard-win` --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 3bdacff..2830e0b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ raw-window-handle = "0.5" thiserror = "1.0" [target.'cfg(windows)'.dependencies] -clipboard-win = { version = "4.0", features = ["std"] } +clipboard-win = { version = "5.0", features = ["std"] } [target.'cfg(target_os = "macos")'.dependencies] clipboard_macos = { version = "0.1", path = "./macos" } From 555678e6ed81247bfbfa0e02e65849815d1fc209 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Tue, 16 Jan 2024 21:09:18 -0800 Subject: [PATCH 3/6] Update examples to winit 0.29 --- Cargo.toml | 2 +- examples/big_file.rs | 57 +++++++++++++++++++++++--------------------- examples/read.rs | 26 ++++++++++---------- examples/write.rs | 21 ++++++++-------- 4 files changed, 56 insertions(+), 50 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2830e0b..dcb371d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,7 @@ clipboard_wayland = { version = "0.2", path = "./wayland" } [dev-dependencies] rand = "0.8" -winit = "0.28" +winit = { version = "0.29", features = ["rwh_05"] } [workspace] members = [ diff --git a/examples/big_file.rs b/examples/big_file.rs index 9584b72..ac08f92 100644 --- a/examples/big_file.rs +++ b/examples/big_file.rs @@ -1,8 +1,9 @@ use rand::distributions::{Alphanumeric, Distribution}; use window_clipboard::Clipboard; use winit::{ - event::{ElementState, Event, KeyboardInput, VirtualKeyCode, WindowEvent}, - event_loop::{ControlFlow, EventLoop}, + event::{ElementState, Event, KeyEvent, WindowEvent}, + event_loop::EventLoop, + keyboard::Key, window::WindowBuilder, }; @@ -15,7 +16,7 @@ fn main() { .map(char::from) .collect(); - let event_loop = EventLoop::new(); + let event_loop = EventLoop::new().unwrap(); let window = WindowBuilder::new() .with_title("Press G to start the test!") @@ -27,28 +28,30 @@ fn main() { clipboard.write(data.clone()).unwrap(); - event_loop.run(move |event, _, control_flow| match event { - Event::WindowEvent { - event: - WindowEvent::KeyboardInput { - input: - KeyboardInput { - virtual_keycode: Some(VirtualKeyCode::G), - state: ElementState::Released, - .. - }, - .. - }, - .. - } => { - let new_data = clipboard.read().expect("Read data"); - assert_eq!(data, new_data, "Data is equal"); - println!("Data copied successfully!"); - } - Event::WindowEvent { - event: WindowEvent::CloseRequested, - window_id, - } if window_id == window.id() => *control_flow = ControlFlow::Exit, - _ => *control_flow = ControlFlow::Wait, - }); + event_loop + .run(move |event, elwt| match event { + Event::WindowEvent { + event: + WindowEvent::KeyboardInput { + event: + KeyEvent { + logical_key: Key::Character(c), + state: ElementState::Released, + .. + }, + .. + }, + .. + } if c == "G" => { + let new_data = clipboard.read().expect("Read data"); + assert_eq!(data, new_data, "Data is equal"); + println!("Data copied successfully!"); + } + Event::WindowEvent { + event: WindowEvent::CloseRequested, + window_id, + } if window_id == window.id() => elwt.exit(), + _ => {} + }) + .unwrap(); } diff --git a/examples/read.rs b/examples/read.rs index 6839347..2ef753e 100644 --- a/examples/read.rs +++ b/examples/read.rs @@ -1,12 +1,12 @@ use window_clipboard::Clipboard; use winit::{ event::{Event, WindowEvent}, - event_loop::{ControlFlow, EventLoop}, + event_loop::EventLoop, window::WindowBuilder, }; fn main() { - let event_loop = EventLoop::new(); + let event_loop = EventLoop::new().unwrap(); let window = WindowBuilder::new() .with_title("A fantastic window!") @@ -15,14 +15,16 @@ fn main() { let clipboard = Clipboard::connect(&window).expect("Connect to clipboard"); - event_loop.run(move |event, _, control_flow| match event { - Event::MainEventsCleared => { - println!("{:?}", clipboard.read()); - } - Event::WindowEvent { - event: WindowEvent::CloseRequested, - window_id, - } if window_id == window.id() => *control_flow = ControlFlow::Exit, - _ => *control_flow = ControlFlow::Wait, - }); + event_loop + .run(move |event, elwt| match event { + Event::AboutToWait => { + println!("{:?}", clipboard.read()); + } + Event::WindowEvent { + event: WindowEvent::CloseRequested, + window_id, + } if window_id == window.id() => elwt.exit(), + _ => {} + }) + .unwrap(); } diff --git a/examples/write.rs b/examples/write.rs index b72fed6..d3d8ae9 100644 --- a/examples/write.rs +++ b/examples/write.rs @@ -1,12 +1,12 @@ use window_clipboard::Clipboard; use winit::{ event::{Event, WindowEvent}, - event_loop::{ControlFlow, EventLoop}, + event_loop::EventLoop, window::WindowBuilder, }; fn main() { - let event_loop = EventLoop::new(); + let event_loop = EventLoop::new().unwrap(); let window = WindowBuilder::new() .with_title("A fantastic window!") @@ -20,12 +20,13 @@ fn main() { .write(String::from("Hello, world!")) .expect("Write to clipboard"); - event_loop.run(move |event, _, control_flow| match event { - Event::MainEventsCleared => {} - Event::WindowEvent { - event: WindowEvent::CloseRequested, - window_id, - } if window_id == window.id() => *control_flow = ControlFlow::Exit, - _ => *control_flow = ControlFlow::Wait, - }); + event_loop + .run(move |event, elwt| match event { + Event::WindowEvent { + event: WindowEvent::CloseRequested, + window_id, + } if window_id == window.id() => elwt.exit(), + _ => {} + }) + .unwrap(); } From bf49c91331cf3e4e785069bad1ef75d61607c302 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Tue, 16 Jan 2024 21:12:14 -0800 Subject: [PATCH 4/6] Update to raw-window-handle 0.6 --- Cargo.toml | 4 ++-- src/platform/linux.rs | 10 +++------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index dcb371d..477eee2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ keywords = ["clipboard", "window", "ui", "gui", "raw-window-handle"] categories = ["gui"] [dependencies] -raw-window-handle = "0.5" +raw-window-handle = "0.6" thiserror = "1.0" [target.'cfg(windows)'.dependencies] @@ -27,7 +27,7 @@ clipboard_wayland = { version = "0.2", path = "./wayland" } [dev-dependencies] rand = "0.8" -winit = { version = "0.29", features = ["rwh_05"] } +winit = "0.29" [workspace] members = [ diff --git a/src/platform/linux.rs b/src/platform/linux.rs index 16aa8c4..476e80d 100644 --- a/src/platform/linux.rs +++ b/src/platform/linux.rs @@ -10,13 +10,9 @@ pub fn connect( window: &W, ) -> Result, Box> { let clipboard = match window.raw_display_handle() { - RawDisplayHandle::Wayland(handle) => { - assert!(!handle.display.is_null()); - - Box::new(unsafe { - wayland::Clipboard::connect(handle.display as *mut _) - }) as _ - } + Ok(RawDisplayHandle::Wayland(handle)) => Box::new(unsafe { + wayland::Clipboard::connect(handle.display.as_ptr()) + }) as _, _ => Box::new(x11::Clipboard::connect()?) as _, }; From 869737dadc8da1c28e64d891b17c265765b45f57 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Tue, 16 Jan 2024 21:28:25 -0800 Subject: [PATCH 5/6] Use `HasDisplayHandle` instead of deprecated `HasRawDisplayHandle` Currently `connect` is unsafe because it doesn't take ownership of the display or have a lifetime bound. --- Cargo.toml | 2 +- examples/big_file.rs | 2 +- examples/read.rs | 3 ++- examples/write.rs | 2 +- src/lib.rs | 5 +++-- src/platform/android.rs | 4 ++-- src/platform/dummy.rs | 4 ++-- src/platform/ios.rs | 4 ++-- src/platform/linux.rs | 12 ++++++------ src/platform/macos.rs | 4 ++-- src/platform/windows.rs | 4 ++-- 11 files changed, 24 insertions(+), 22 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 477eee2..0c04c4c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ keywords = ["clipboard", "window", "ui", "gui", "raw-window-handle"] categories = ["gui"] [dependencies] -raw-window-handle = "0.6" +raw-window-handle = { version = "0.6", features = ["std"] } thiserror = "1.0" [target.'cfg(windows)'.dependencies] diff --git a/examples/big_file.rs b/examples/big_file.rs index ac08f92..5714059 100644 --- a/examples/big_file.rs +++ b/examples/big_file.rs @@ -24,7 +24,7 @@ fn main() { .unwrap(); let mut clipboard = - Clipboard::connect(&window).expect("Connect to clipboard"); + unsafe { Clipboard::connect(&window) }.expect("Connect to clipboard"); clipboard.write(data.clone()).unwrap(); diff --git a/examples/read.rs b/examples/read.rs index 2ef753e..f13f871 100644 --- a/examples/read.rs +++ b/examples/read.rs @@ -13,7 +13,8 @@ fn main() { .build(&event_loop) .unwrap(); - let clipboard = Clipboard::connect(&window).expect("Connect to clipboard"); + let clipboard = + unsafe { Clipboard::connect(&window) }.expect("Connect to clipboard"); event_loop .run(move |event, elwt| match event { diff --git a/examples/write.rs b/examples/write.rs index d3d8ae9..7b658cb 100644 --- a/examples/write.rs +++ b/examples/write.rs @@ -14,7 +14,7 @@ fn main() { .unwrap(); let mut clipboard = - Clipboard::connect(&window).expect("Connect to clipboard"); + unsafe { Clipboard::connect(&window) }.expect("Connect to clipboard"); clipboard .write(String::from("Hello, world!")) diff --git a/src/lib.rs b/src/lib.rs index b8e2aa6..016ed0f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -46,7 +46,7 @@ mod platform; #[path = "platform/dummy.rs"] mod platform; -use raw_window_handle::HasRawDisplayHandle; +use raw_window_handle::HasDisplayHandle; use std::error::Error; pub struct Clipboard { @@ -54,7 +54,8 @@ pub struct Clipboard { } impl Clipboard { - pub fn connect( + /// Safety: the display handle must be valid for the lifetime of `Clipboard` + pub unsafe fn connect( window: &W, ) -> Result> { let raw = platform::connect(window)?; diff --git a/src/platform/android.rs b/src/platform/android.rs index b808911..b0ac8b6 100644 --- a/src/platform/android.rs +++ b/src/platform/android.rs @@ -1,9 +1,9 @@ use crate::ClipboardProvider; -use raw_window_handle::HasRawDisplayHandle; +use raw_window_handle::HasDisplayHandle; use std::error::Error; -pub fn connect( +pub fn connect( _window: &W, ) -> Result, Box> { Ok(Box::new(Clipboard::new()?)) diff --git a/src/platform/dummy.rs b/src/platform/dummy.rs index edb02dc..8cf7418 100644 --- a/src/platform/dummy.rs +++ b/src/platform/dummy.rs @@ -1,10 +1,10 @@ use crate::ClipboardProvider; -use raw_window_handle::HasRawDisplayHandle; +use raw_window_handle::HasDisplayHandle; struct Dummy; -pub fn connect( +pub fn connect( _window: &W, ) -> Result, Box> { Ok(Box::new(Dummy)) diff --git a/src/platform/ios.rs b/src/platform/ios.rs index b64d8ed..84ae06a 100644 --- a/src/platform/ios.rs +++ b/src/platform/ios.rs @@ -1,9 +1,9 @@ use crate::ClipboardProvider; -use raw_window_handle::HasRawDisplayHandle; +use raw_window_handle::HasDisplayHandle; use std::error::Error; -pub fn connect( +pub fn connect( _window: &W, ) -> Result, Box> { Ok(Box::new(Clipboard::new()?)) diff --git a/src/platform/linux.rs b/src/platform/linux.rs index 476e80d..02b6da9 100644 --- a/src/platform/linux.rs +++ b/src/platform/linux.rs @@ -1,18 +1,18 @@ use crate::ClipboardProvider; -use raw_window_handle::{HasRawDisplayHandle, RawDisplayHandle}; +use raw_window_handle::{HasDisplayHandle, RawDisplayHandle}; use std::error::Error; pub use clipboard_wayland as wayland; pub use clipboard_x11 as x11; -pub fn connect( +pub unsafe fn connect( window: &W, ) -> Result, Box> { - let clipboard = match window.raw_display_handle() { - Ok(RawDisplayHandle::Wayland(handle)) => Box::new(unsafe { - wayland::Clipboard::connect(handle.display.as_ptr()) - }) as _, + let clipboard = match window.display_handle()?.as_raw() { + RawDisplayHandle::Wayland(handle) => { + Box::new(wayland::Clipboard::connect(handle.display.as_ptr())) as _ + } _ => Box::new(x11::Clipboard::connect()?) as _, }; diff --git a/src/platform/macos.rs b/src/platform/macos.rs index 4ebecc1..5b399e0 100644 --- a/src/platform/macos.rs +++ b/src/platform/macos.rs @@ -1,9 +1,9 @@ use crate::ClipboardProvider; -use raw_window_handle::HasRawDisplayHandle; +use raw_window_handle::HasDisplayHandle; use std::error::Error; -pub fn connect( +pub fn connect( _window: &W, ) -> Result, Box> { Ok(Box::new(clipboard_macos::Clipboard::new()?)) diff --git a/src/platform/windows.rs b/src/platform/windows.rs index 85a9136..a0c774b 100644 --- a/src/platform/windows.rs +++ b/src/platform/windows.rs @@ -1,11 +1,11 @@ use crate::ClipboardProvider; use clipboard_win::{get_clipboard_string, set_clipboard_string}; -use raw_window_handle::HasRawDisplayHandle; +use raw_window_handle::HasDisplayHandle; use std::error::Error; -pub fn connect( +pub fn connect( _window: &W, ) -> Result, Box> { Ok(Box::new(Clipboard)) From e8f2fbdaf0555eb52644ded84109c6c758a7cf33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Thu, 18 Jan 2024 08:55:30 +0100 Subject: [PATCH 6/6] Return `Result` in examples instead of `unwrap` --- examples/big_file.rs | 53 ++++++++++++++++++++++---------------------- examples/read.rs | 25 ++++++++++----------- examples/write.rs | 19 ++++++++-------- 3 files changed, 47 insertions(+), 50 deletions(-) diff --git a/examples/big_file.rs b/examples/big_file.rs index 5714059..f666812 100644 --- a/examples/big_file.rs +++ b/examples/big_file.rs @@ -1,13 +1,14 @@ use rand::distributions::{Alphanumeric, Distribution}; use window_clipboard::Clipboard; use winit::{ + error::EventLoopError, event::{ElementState, Event, KeyEvent, WindowEvent}, event_loop::EventLoop, keyboard::Key, window::WindowBuilder, }; -fn main() { +fn main() -> Result<(), EventLoopError> { let mut rng = rand::thread_rng(); let data: String = Alphanumeric @@ -28,30 +29,28 @@ fn main() { clipboard.write(data.clone()).unwrap(); - event_loop - .run(move |event, elwt| match event { - Event::WindowEvent { - event: - WindowEvent::KeyboardInput { - event: - KeyEvent { - logical_key: Key::Character(c), - state: ElementState::Released, - .. - }, - .. - }, - .. - } if c == "G" => { - let new_data = clipboard.read().expect("Read data"); - assert_eq!(data, new_data, "Data is equal"); - println!("Data copied successfully!"); - } - Event::WindowEvent { - event: WindowEvent::CloseRequested, - window_id, - } if window_id == window.id() => elwt.exit(), - _ => {} - }) - .unwrap(); + event_loop.run(move |event, elwt| match event { + Event::WindowEvent { + event: + WindowEvent::KeyboardInput { + event: + KeyEvent { + logical_key: Key::Character(c), + state: ElementState::Released, + .. + }, + .. + }, + .. + } if c == "G" => { + let new_data = clipboard.read().expect("Read data"); + assert_eq!(data, new_data, "Data is equal"); + println!("Data copied successfully!"); + } + Event::WindowEvent { + event: WindowEvent::CloseRequested, + window_id, + } if window_id == window.id() => elwt.exit(), + _ => {} + }) } diff --git a/examples/read.rs b/examples/read.rs index f13f871..ddbaf8b 100644 --- a/examples/read.rs +++ b/examples/read.rs @@ -1,11 +1,12 @@ use window_clipboard::Clipboard; use winit::{ + error::EventLoopError, event::{Event, WindowEvent}, event_loop::EventLoop, window::WindowBuilder, }; -fn main() { +fn main() -> Result<(), EventLoopError> { let event_loop = EventLoop::new().unwrap(); let window = WindowBuilder::new() @@ -16,16 +17,14 @@ fn main() { let clipboard = unsafe { Clipboard::connect(&window) }.expect("Connect to clipboard"); - event_loop - .run(move |event, elwt| match event { - Event::AboutToWait => { - println!("{:?}", clipboard.read()); - } - Event::WindowEvent { - event: WindowEvent::CloseRequested, - window_id, - } if window_id == window.id() => elwt.exit(), - _ => {} - }) - .unwrap(); + event_loop.run(move |event, elwt| match event { + Event::AboutToWait => { + println!("{:?}", clipboard.read()); + } + Event::WindowEvent { + event: WindowEvent::CloseRequested, + window_id, + } if window_id == window.id() => elwt.exit(), + _ => {} + }) } diff --git a/examples/write.rs b/examples/write.rs index 7b658cb..40e6263 100644 --- a/examples/write.rs +++ b/examples/write.rs @@ -1,11 +1,12 @@ use window_clipboard::Clipboard; use winit::{ + error::EventLoopError, event::{Event, WindowEvent}, event_loop::EventLoop, window::WindowBuilder, }; -fn main() { +fn main() -> Result<(), EventLoopError> { let event_loop = EventLoop::new().unwrap(); let window = WindowBuilder::new() @@ -20,13 +21,11 @@ fn main() { .write(String::from("Hello, world!")) .expect("Write to clipboard"); - event_loop - .run(move |event, elwt| match event { - Event::WindowEvent { - event: WindowEvent::CloseRequested, - window_id, - } if window_id == window.id() => elwt.exit(), - _ => {} - }) - .unwrap(); + event_loop.run(move |event, elwt| match event { + Event::WindowEvent { + event: WindowEvent::CloseRequested, + window_id, + } if window_id == window.id() => elwt.exit(), + _ => {} + }) }