diff --git a/Cargo.toml b/Cargo.toml index eb23f4e..5d4355d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,7 @@ opengl = ["uuid", "x11/glx"] [dependencies] keyboard-types = { version = "0.6.1", default-features = false } -raw-window-handle = "0.4.2" +raw-window-handle = "0.5.0" [target.'cfg(target_os="linux")'.dependencies] xcb = { version = "0.9", features = ["thread", "xlib_xcb", "dri2"] } diff --git a/src/macos/window.rs b/src/macos/window.rs index 54046dd..3f85fb6 100644 --- a/src/macos/window.rs +++ b/src/macos/window.rs @@ -17,7 +17,10 @@ use keyboard_types::KeyboardEvent; use objc::{msg_send, runtime::Object, sel, sel_impl}; -use raw_window_handle::{AppKitHandle, HasRawWindowHandle, RawWindowHandle}; +use raw_window_handle::{ + AppKitDisplayHandle, AppKitWindowHandle, HasRawDisplayHandle, HasRawWindowHandle, + RawDisplayHandle, RawWindowHandle, +}; use crate::{ Event, EventStatus, Size, WindowEvent, WindowHandler, WindowInfo, WindowOpenOptions, @@ -62,7 +65,7 @@ unsafe impl HasRawWindowHandle for WindowHandle { } } - RawWindowHandle::AppKit(AppKitHandle::empty()) + RawWindowHandle::AppKit(AppKitWindowHandle::empty()) } } @@ -371,6 +374,7 @@ impl WindowState { /// Don't use this to create two simulataneous references to a single /// WindowState. Apparently, macOS blocks for the duration of an event, /// callback, meaning that this shouldn't be a problem in practice. + #[allow(clippy::mut_from_ref)] pub(super) unsafe fn from_field(obj: &Object) -> &mut Self { let state_ptr: *mut c_void = *obj.get_ivar(BASEVIEW_STATE_IVAR); @@ -476,7 +480,7 @@ unsafe impl HasRawWindowHandle for Window { fn raw_window_handle(&self) -> RawWindowHandle { let ns_window = self.ns_window.unwrap_or(ptr::null_mut()) as *mut c_void; - let mut handle = AppKitHandle::empty(); + let mut handle = AppKitWindowHandle::empty(); handle.ns_window = ns_window; handle.ns_view = self.ns_view as *mut c_void; @@ -484,6 +488,12 @@ unsafe impl HasRawWindowHandle for Window { } } +unsafe impl HasRawDisplayHandle for Window { + fn raw_display_handle(&self) -> raw_window_handle::RawDisplayHandle { + RawDisplayHandle::AppKit(AppKitDisplayHandle::empty()) + } +} + pub fn copy_to_clipboard(string: &str) { unsafe { let pb = NSPasteboard::generalPasteboard(nil); diff --git a/src/win/window.rs b/src/win/window.rs index 2af1abe..0be9d61 100644 --- a/src/win/window.rs +++ b/src/win/window.rs @@ -24,7 +24,10 @@ use std::os::windows::ffi::OsStrExt; use std::ptr::null_mut; use std::rc::Rc; -use raw_window_handle::{HasRawWindowHandle, RawWindowHandle, Win32Handle}; +use raw_window_handle::{ + HasRawDisplayHandle, HasRawWindowHandle, RawDisplayHandle, RawWindowHandle, Win32WindowHandle, + WindowsDisplayHandle, +}; const BV_WINDOW_MUST_CLOSE: UINT = WM_USER + 1; @@ -84,12 +87,12 @@ impl WindowHandle { unsafe impl HasRawWindowHandle for WindowHandle { fn raw_window_handle(&self) -> RawWindowHandle { if let Some(hwnd) = self.hwnd { - let mut handle = Win32Handle::empty(); + let mut handle = Win32WindowHandle::empty(); handle.hwnd = hwnd as *mut c_void; RawWindowHandle::Win32(handle) } else { - RawWindowHandle::Win32(Win32Handle::empty()) + RawWindowHandle::Win32(Win32WindowHandle::empty()) } } } @@ -757,13 +760,19 @@ impl Window<'_> { unsafe impl HasRawWindowHandle for Window<'_> { fn raw_window_handle(&self) -> RawWindowHandle { - let mut handle = Win32Handle::empty(); + let mut handle = Win32WindowHandle::empty(); handle.hwnd = self.state.hwnd as *mut c_void; RawWindowHandle::Win32(handle) } } +unsafe impl HasRawDisplayHandle for Window<'_> { + fn raw_display_handle(&self) -> RawDisplayHandle { + RawDisplayHandle::Windows(WindowsDisplayHandle::empty()) + } +} + pub fn copy_to_clipboard(data: &str) { todo!() } diff --git a/src/window.rs b/src/window.rs index c0ef1ac..7bcef25 100644 --- a/src/window.rs +++ b/src/window.rs @@ -1,6 +1,8 @@ use std::marker::PhantomData; -use raw_window_handle::{HasRawWindowHandle, RawWindowHandle}; +use raw_window_handle::{ + AppKitDisplayHandle, HasRawDisplayHandle, HasRawWindowHandle, RawDisplayHandle, RawWindowHandle, +}; use crate::event::{Event, EventStatus}; use crate::window_open_options::WindowOpenOptions; @@ -48,6 +50,12 @@ unsafe impl HasRawWindowHandle for WindowHandle { } } +unsafe impl HasRawDisplayHandle for WindowHandle { + fn raw_display_handle(&self) -> raw_window_handle::RawDisplayHandle { + RawDisplayHandle::AppKit(AppKitDisplayHandle::empty()) + } +} + pub trait WindowHandler { fn on_frame(&mut self, window: &mut Window); fn on_event(&mut self, window: &mut Window, event: Event) -> EventStatus; @@ -129,6 +137,12 @@ unsafe impl<'a> HasRawWindowHandle for Window<'a> { } } +unsafe impl<'a> HasRawDisplayHandle for Window<'a> { + fn raw_display_handle(&self) -> RawDisplayHandle { + self.window.raw_display_handle() + } +} + unsafe impl HasRawWindowHandle for RawWindowHandleWrapper { fn raw_window_handle(&self) -> RawWindowHandle { self.handle diff --git a/src/x11/window.rs b/src/x11/window.rs index fcd9083..e352248 100644 --- a/src/x11/window.rs +++ b/src/x11/window.rs @@ -6,7 +6,10 @@ use std::sync::Arc; use std::thread; use std::time::*; -use raw_window_handle::{HasRawWindowHandle, RawWindowHandle, XlibHandle}; +use raw_window_handle::{ + HasRawDisplayHandle, HasRawWindowHandle, RawDisplayHandle, RawWindowHandle, XlibDisplayHandle, + XlibWindowHandle, +}; use xcb::ffi::xcb_screen_t; use xcb::StructPtr; @@ -57,7 +60,7 @@ unsafe impl HasRawWindowHandle for WindowHandle { } } - RawWindowHandle::Xlib(XlibHandle::empty()) + RawWindowHandle::Xlib(XlibWindowHandle::empty()) } } @@ -686,14 +689,22 @@ impl Window { unsafe impl HasRawWindowHandle for Window { fn raw_window_handle(&self) -> RawWindowHandle { - let mut handle = XlibHandle::empty(); + let mut handle = XlibWindowHandle::empty(); handle.window = self.window_id as c_ulong; - handle.display = self.xcb_connection.conn.get_raw_dpy() as *mut c_void; RawWindowHandle::Xlib(handle) } } +unsafe impl HasRawDisplayHandle for Window { + fn raw_display_handle(&self) -> RawDisplayHandle { + let mut handle = XlibDisplayHandle::empty(); + handle.display = self.xcb_connection.conn.get_raw_dpy() as *mut c_void; + + RawDisplayHandle::Xlib(handle) + } +} + fn mouse_id(id: u8) -> MouseButton { match id { 1 => MouseButton::Left,