Merge pull request #24 from ids1024/raw-window-handle-0.6

Raw window handle 0.6
This commit is contained in:
Héctor Ramón 2024-01-18 08:56:30 +01:00 committed by GitHub
commit d7c9e8a2f7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 57 additions and 56 deletions

View file

@ -12,11 +12,11 @@ keywords = ["clipboard", "window", "ui", "gui", "raw-window-handle"]
categories = ["gui"] categories = ["gui"]
[dependencies] [dependencies]
raw-window-handle = "0.5" raw-window-handle = { version = "0.6", features = ["std"] }
thiserror = "1.0" thiserror = "1.0"
[target.'cfg(windows)'.dependencies] [target.'cfg(windows)'.dependencies]
clipboard-win = { version = "4.0", features = ["std"] } clipboard-win = { version = "5.0", features = ["std"] }
[target.'cfg(target_os = "macos")'.dependencies] [target.'cfg(target_os = "macos")'.dependencies]
clipboard_macos = { version = "0.1", path = "./macos" } clipboard_macos = { version = "0.1", path = "./macos" }
@ -27,7 +27,7 @@ clipboard_wayland = { version = "0.2", path = "./wayland" }
[dev-dependencies] [dev-dependencies]
rand = "0.8" rand = "0.8"
winit = "0.28" winit = "0.29"
[workspace] [workspace]
members = [ members = [

View file

@ -1,12 +1,14 @@
use rand::distributions::{Alphanumeric, Distribution}; use rand::distributions::{Alphanumeric, Distribution};
use window_clipboard::Clipboard; use window_clipboard::Clipboard;
use winit::{ use winit::{
event::{ElementState, Event, KeyboardInput, VirtualKeyCode, WindowEvent}, error::EventLoopError,
event_loop::{ControlFlow, EventLoop}, event::{ElementState, Event, KeyEvent, WindowEvent},
event_loop::EventLoop,
keyboard::Key,
window::WindowBuilder, window::WindowBuilder,
}; };
fn main() { fn main() -> Result<(), EventLoopError> {
let mut rng = rand::thread_rng(); let mut rng = rand::thread_rng();
let data: String = Alphanumeric let data: String = Alphanumeric
@ -15,7 +17,7 @@ fn main() {
.map(char::from) .map(char::from)
.collect(); .collect();
let event_loop = EventLoop::new(); let event_loop = EventLoop::new().unwrap();
let window = WindowBuilder::new() let window = WindowBuilder::new()
.with_title("Press G to start the test!") .with_title("Press G to start the test!")
@ -23,24 +25,24 @@ fn main() {
.unwrap(); .unwrap();
let mut clipboard = let mut clipboard =
Clipboard::connect(&window).expect("Connect to clipboard"); unsafe { Clipboard::connect(&window) }.expect("Connect to clipboard");
clipboard.write(data.clone()).unwrap(); clipboard.write(data.clone()).unwrap();
event_loop.run(move |event, _, control_flow| match event { event_loop.run(move |event, elwt| match event {
Event::WindowEvent { Event::WindowEvent {
event: event:
WindowEvent::KeyboardInput { WindowEvent::KeyboardInput {
input: event:
KeyboardInput { KeyEvent {
virtual_keycode: Some(VirtualKeyCode::G), logical_key: Key::Character(c),
state: ElementState::Released, state: ElementState::Released,
.. ..
}, },
.. ..
}, },
.. ..
} => { } if c == "G" => {
let new_data = clipboard.read().expect("Read data"); let new_data = clipboard.read().expect("Read data");
assert_eq!(data, new_data, "Data is equal"); assert_eq!(data, new_data, "Data is equal");
println!("Data copied successfully!"); println!("Data copied successfully!");
@ -48,7 +50,7 @@ fn main() {
Event::WindowEvent { Event::WindowEvent {
event: WindowEvent::CloseRequested, event: WindowEvent::CloseRequested,
window_id, window_id,
} if window_id == window.id() => *control_flow = ControlFlow::Exit, } if window_id == window.id() => elwt.exit(),
_ => *control_flow = ControlFlow::Wait, _ => {}
}); })
} }

View file

@ -1,28 +1,30 @@
use window_clipboard::Clipboard; use window_clipboard::Clipboard;
use winit::{ use winit::{
error::EventLoopError,
event::{Event, WindowEvent}, event::{Event, WindowEvent},
event_loop::{ControlFlow, EventLoop}, event_loop::EventLoop,
window::WindowBuilder, window::WindowBuilder,
}; };
fn main() { fn main() -> Result<(), EventLoopError> {
let event_loop = EventLoop::new(); let event_loop = EventLoop::new().unwrap();
let window = WindowBuilder::new() let window = WindowBuilder::new()
.with_title("A fantastic window!") .with_title("A fantastic window!")
.build(&event_loop) .build(&event_loop)
.unwrap(); .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, _, control_flow| match event { event_loop.run(move |event, elwt| match event {
Event::MainEventsCleared => { Event::AboutToWait => {
println!("{:?}", clipboard.read()); println!("{:?}", clipboard.read());
} }
Event::WindowEvent { Event::WindowEvent {
event: WindowEvent::CloseRequested, event: WindowEvent::CloseRequested,
window_id, window_id,
} if window_id == window.id() => *control_flow = ControlFlow::Exit, } if window_id == window.id() => elwt.exit(),
_ => *control_flow = ControlFlow::Wait, _ => {}
}); })
} }

View file

@ -1,12 +1,13 @@
use window_clipboard::Clipboard; use window_clipboard::Clipboard;
use winit::{ use winit::{
error::EventLoopError,
event::{Event, WindowEvent}, event::{Event, WindowEvent},
event_loop::{ControlFlow, EventLoop}, event_loop::EventLoop,
window::WindowBuilder, window::WindowBuilder,
}; };
fn main() { fn main() -> Result<(), EventLoopError> {
let event_loop = EventLoop::new(); let event_loop = EventLoop::new().unwrap();
let window = WindowBuilder::new() let window = WindowBuilder::new()
.with_title("A fantastic window!") .with_title("A fantastic window!")
@ -14,18 +15,17 @@ fn main() {
.unwrap(); .unwrap();
let mut clipboard = let mut clipboard =
Clipboard::connect(&window).expect("Connect to clipboard"); unsafe { Clipboard::connect(&window) }.expect("Connect to clipboard");
clipboard clipboard
.write(String::from("Hello, world!")) .write(String::from("Hello, world!"))
.expect("Write to clipboard"); .expect("Write to clipboard");
event_loop.run(move |event, _, control_flow| match event { event_loop.run(move |event, elwt| match event {
Event::MainEventsCleared => {}
Event::WindowEvent { Event::WindowEvent {
event: WindowEvent::CloseRequested, event: WindowEvent::CloseRequested,
window_id, window_id,
} if window_id == window.id() => *control_flow = ControlFlow::Exit, } if window_id == window.id() => elwt.exit(),
_ => *control_flow = ControlFlow::Wait, _ => {}
}); })
} }

View file

@ -46,7 +46,7 @@ mod platform;
#[path = "platform/dummy.rs"] #[path = "platform/dummy.rs"]
mod platform; mod platform;
use raw_window_handle::HasRawDisplayHandle; use raw_window_handle::HasDisplayHandle;
use std::error::Error; use std::error::Error;
pub struct Clipboard { pub struct Clipboard {
@ -54,7 +54,8 @@ pub struct Clipboard {
} }
impl Clipboard { impl Clipboard {
pub fn connect<W: HasRawDisplayHandle>( /// Safety: the display handle must be valid for the lifetime of `Clipboard`
pub unsafe fn connect<W: HasDisplayHandle>(
window: &W, window: &W,
) -> Result<Self, Box<dyn Error>> { ) -> Result<Self, Box<dyn Error>> {
let raw = platform::connect(window)?; let raw = platform::connect(window)?;

View file

@ -1,9 +1,9 @@
use crate::ClipboardProvider; use crate::ClipboardProvider;
use raw_window_handle::HasRawDisplayHandle; use raw_window_handle::HasDisplayHandle;
use std::error::Error; use std::error::Error;
pub fn connect<W: HasRawDisplayHandle>( pub fn connect<W: HasDisplayHandle>(
_window: &W, _window: &W,
) -> Result<Box<dyn ClipboardProvider>, Box<dyn Error>> { ) -> Result<Box<dyn ClipboardProvider>, Box<dyn Error>> {
Ok(Box::new(Clipboard::new()?)) Ok(Box::new(Clipboard::new()?))

View file

@ -1,10 +1,10 @@
use crate::ClipboardProvider; use crate::ClipboardProvider;
use raw_window_handle::HasRawDisplayHandle; use raw_window_handle::HasDisplayHandle;
struct Dummy; struct Dummy;
pub fn connect<W: HasRawDisplayHandle>( pub fn connect<W: HasDisplayHandle>(
_window: &W, _window: &W,
) -> Result<Box<dyn ClipboardProvider>, Box<dyn std::error::Error>> { ) -> Result<Box<dyn ClipboardProvider>, Box<dyn std::error::Error>> {
Ok(Box::new(Dummy)) Ok(Box::new(Dummy))

View file

@ -1,9 +1,9 @@
use crate::ClipboardProvider; use crate::ClipboardProvider;
use raw_window_handle::HasRawDisplayHandle; use raw_window_handle::HasDisplayHandle;
use std::error::Error; use std::error::Error;
pub fn connect<W: HasRawDisplayHandle>( pub fn connect<W: HasDisplayHandle>(
_window: &W, _window: &W,
) -> Result<Box<dyn ClipboardProvider>, Box<dyn Error>> { ) -> Result<Box<dyn ClipboardProvider>, Box<dyn Error>> {
Ok(Box::new(Clipboard::new()?)) Ok(Box::new(Clipboard::new()?))

View file

@ -1,21 +1,17 @@
use crate::ClipboardProvider; use crate::ClipboardProvider;
use raw_window_handle::{HasRawDisplayHandle, RawDisplayHandle}; use raw_window_handle::{HasDisplayHandle, RawDisplayHandle};
use std::error::Error; use std::error::Error;
pub use clipboard_wayland as wayland; pub use clipboard_wayland as wayland;
pub use clipboard_x11 as x11; pub use clipboard_x11 as x11;
pub fn connect<W: HasRawDisplayHandle>( pub unsafe fn connect<W: HasDisplayHandle>(
window: &W, window: &W,
) -> Result<Box<dyn ClipboardProvider>, Box<dyn Error>> { ) -> Result<Box<dyn ClipboardProvider>, Box<dyn Error>> {
let clipboard = match window.raw_display_handle() { let clipboard = match window.display_handle()?.as_raw() {
RawDisplayHandle::Wayland(handle) => { RawDisplayHandle::Wayland(handle) => {
assert!(!handle.display.is_null()); Box::new(wayland::Clipboard::connect(handle.display.as_ptr())) as _
Box::new(unsafe {
wayland::Clipboard::connect(handle.display as *mut _)
}) as _
} }
_ => Box::new(x11::Clipboard::connect()?) as _, _ => Box::new(x11::Clipboard::connect()?) as _,
}; };

View file

@ -1,9 +1,9 @@
use crate::ClipboardProvider; use crate::ClipboardProvider;
use raw_window_handle::HasRawDisplayHandle; use raw_window_handle::HasDisplayHandle;
use std::error::Error; use std::error::Error;
pub fn connect<W: HasRawDisplayHandle>( pub fn connect<W: HasDisplayHandle>(
_window: &W, _window: &W,
) -> Result<Box<dyn ClipboardProvider>, Box<dyn Error>> { ) -> Result<Box<dyn ClipboardProvider>, Box<dyn Error>> {
Ok(Box::new(clipboard_macos::Clipboard::new()?)) Ok(Box::new(clipboard_macos::Clipboard::new()?))

View file

@ -1,11 +1,11 @@
use crate::ClipboardProvider; use crate::ClipboardProvider;
use clipboard_win::{get_clipboard_string, set_clipboard_string}; use clipboard_win::{get_clipboard_string, set_clipboard_string};
use raw_window_handle::HasRawDisplayHandle; use raw_window_handle::HasDisplayHandle;
use std::error::Error; use std::error::Error;
pub fn connect<W: HasRawDisplayHandle>( pub fn connect<W: HasDisplayHandle>(
_window: &W, _window: &W,
) -> Result<Box<dyn ClipboardProvider>, Box<dyn Error>> { ) -> Result<Box<dyn ClipboardProvider>, Box<dyn Error>> {
Ok(Box::new(Clipboard)) Ok(Box::new(Clipboard))

View file

@ -10,4 +10,4 @@ documentation = "https://docs.rs/clipboard_wayland"
keywords = ["clipboard", "wayland"] keywords = ["clipboard", "wayland"]
[dependencies] [dependencies]
smithay-clipboard = "0.6" smithay-clipboard = "0.7"

View file

@ -10,5 +10,5 @@ documentation = "https://docs.rs/clipboard_x11"
keywords = ["clipboard", "x11"] keywords = ["clipboard", "x11"]
[dependencies] [dependencies]
x11rb = "0.11" x11rb = "0.13"
thiserror = "1.0" thiserror = "1.0"