Use HasDisplayHandle instead of deprecated HasRawDisplayHandle

Currently `connect` is unsafe because it doesn't take ownership of the
display or have a lifetime bound.
This commit is contained in:
Ian Douglas Scott 2024-01-16 21:28:25 -08:00
parent bf49c91331
commit 869737dadc
11 changed files with 24 additions and 22 deletions

View file

@ -12,7 +12,7 @@ keywords = ["clipboard", "window", "ui", "gui", "raw-window-handle"]
categories = ["gui"] categories = ["gui"]
[dependencies] [dependencies]
raw-window-handle = "0.6" raw-window-handle = { version = "0.6", features = ["std"] }
thiserror = "1.0" thiserror = "1.0"
[target.'cfg(windows)'.dependencies] [target.'cfg(windows)'.dependencies]

View file

@ -24,7 +24,7 @@ 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();

View file

@ -13,7 +13,8 @@ fn main() {
.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 event_loop
.run(move |event, elwt| match event { .run(move |event, elwt| match event {

View file

@ -14,7 +14,7 @@ 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!"))

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,18 +1,18 @@
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() {
Ok(RawDisplayHandle::Wayland(handle)) => Box::new(unsafe { RawDisplayHandle::Wayland(handle) => {
wayland::Clipboard::connect(handle.display.as_ptr()) Box::new(wayland::Clipboard::connect(handle.display.as_ptr())) as _
}) 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))