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"]
[dependencies]
raw-window-handle = "0.6"
raw-window-handle = { version = "0.6", features = ["std"] }
thiserror = "1.0"
[target.'cfg(windows)'.dependencies]

View file

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

View file

@ -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 {

View file

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

View file

@ -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<W: HasRawDisplayHandle>(
/// Safety: the display handle must be valid for the lifetime of `Clipboard`
pub unsafe fn connect<W: HasDisplayHandle>(
window: &W,
) -> Result<Self, Box<dyn Error>> {
let raw = platform::connect(window)?;

View file

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

View file

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

View file

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

View file

@ -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<W: HasRawDisplayHandle>(
pub unsafe fn connect<W: HasDisplayHandle>(
window: &W,
) -> Result<Box<dyn ClipboardProvider>, Box<dyn Error>> {
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 _,
};

View file

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

View file

@ -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<W: HasRawDisplayHandle>(
pub fn connect<W: HasDisplayHandle>(
_window: &W,
) -> Result<Box<dyn ClipboardProvider>, Box<dyn Error>> {
Ok(Box::new(Clipboard))