diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ddc5886..29bb856a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ hijacking `set_decorations` for this purpose. - On macOS and iOS, corrected the auto trait impls of `EventLoopProxy`. - On iOS, add touch pressure information for touch events. +- Implement `raw_window_handle::HasRawWindowHandle` for `Window` type on all supported platforms. - On macOS, fix the signature of `-[NSView drawRect:]`. # 0.20.0 Alpha 2 (2019-07-09) diff --git a/Cargo.toml b/Cargo.toml index 5fb8a88b..3d87c38b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ libc = "0.2" log = "0.4" serde = { version = "1", optional = true, features = ["serde_derive"] } derivative = "1.0.2" +raw-window-handle = "0.1" [dev-dependencies] image = "0.21" diff --git a/src/platform_impl/ios/window.rs b/src/platform_impl/ios/window.rs index 4e2167fc..46bc5c2e 100644 --- a/src/platform_impl/ios/window.rs +++ b/src/platform_impl/ios/window.rs @@ -1,3 +1,4 @@ +use raw_window_handle::{ios::IOSHandle, RawWindowHandle}; use std::{ collections::VecDeque, ops::{Deref, DerefMut}, @@ -250,6 +251,16 @@ impl Inner { pub fn id(&self) -> WindowId { self.window.into() } + + pub fn raw_window_handle(&self) -> RawWindowHandle { + let handle = IOSHandle { + ui_window: self.window as _, + ui_view: self.view as _, + ui_view_controller: self.view_controller as _, + ..IOSHandle::empty() + }; + RawWindowHandle::IOS(handle) + } } pub struct Window { diff --git a/src/platform_impl/linux/mod.rs b/src/platform_impl/linux/mod.rs index f036f9f0..420fa469 100644 --- a/src/platform_impl/linux/mod.rs +++ b/src/platform_impl/linux/mod.rs @@ -3,6 +3,7 @@ use std::{collections::VecDeque, env, ffi::CStr, fmt, mem::MaybeUninit, os::raw::*, sync::Arc}; use parking_lot::Mutex; +use raw_window_handle::RawWindowHandle; use smithay_client_toolkit::reexports::client::ConnectError; pub use self::x11::XNotSupported; @@ -440,6 +441,13 @@ impl Window { &Window::Wayland(ref window) => MonitorHandle::Wayland(window.primary_monitor()), } } + + pub fn raw_window_handle(&self) -> RawWindowHandle { + match self { + &Window::X(ref window) => RawWindowHandle::X11(window.raw_window_handle()), + &Window::Wayland(ref window) => RawWindowHandle::Wayland(window.raw_window_handle()), + } + } } unsafe extern "C" fn x_error_callback( diff --git a/src/platform_impl/linux/wayland/window.rs b/src/platform_impl/linux/wayland/window.rs index b4a04aa7..ddd4b4b9 100644 --- a/src/platform_impl/linux/wayland/window.rs +++ b/src/platform_impl/linux/wayland/window.rs @@ -1,3 +1,4 @@ +use raw_window_handle::unix::WaylandHandle; use std::{ collections::VecDeque, sync::{Arc, Mutex, Weak}, @@ -333,6 +334,14 @@ impl Window { pub fn primary_monitor(&self) -> MonitorHandle { primary_monitor(&self.outputs) } + + pub fn raw_window_handle(&self) -> WaylandHandle { + WaylandHandle { + surface: self.surface().as_ref().c_ptr() as *mut _, + display: self.display().as_ref().c_ptr() as *mut _, + ..WaylandHandle::empty() + } + } } impl Drop for Window { diff --git a/src/platform_impl/linux/x11/window.rs b/src/platform_impl/linux/x11/window.rs index e65d8836..0e63261c 100644 --- a/src/platform_impl/linux/x11/window.rs +++ b/src/platform_impl/linux/x11/window.rs @@ -1,3 +1,4 @@ +use raw_window_handle::unix::X11Handle; use std::{ cmp, collections::HashSet, @@ -1375,4 +1376,13 @@ impl UnownedWindow { .unwrap() .insert(WindowId(self.xwindow)); } + + #[inline] + pub fn raw_window_handle(&self) -> X11Handle { + X11Handle { + window: self.xwindow, + display: self.xconn.display as _, + ..X11Handle::empty() + } + } } diff --git a/src/platform_impl/macos/window.rs b/src/platform_impl/macos/window.rs index d0b0a557..75adf8a3 100644 --- a/src/platform_impl/macos/window.rs +++ b/src/platform_impl/macos/window.rs @@ -1,3 +1,4 @@ +use raw_window_handle::{macos::MacOSHandle, RawWindowHandle}; use std::{ collections::VecDeque, f64, @@ -904,6 +905,16 @@ impl UnownedWindow { pub fn primary_monitor(&self) -> MonitorHandle { monitor::primary_monitor() } + + #[inline] + pub fn raw_window_handle(&self) -> RawWindowHandle { + let handle = MacOSHandle { + ns_window: *self.ns_window as *mut _, + ns_view: *self.ns_view as *mut _, + ..MacOSHandle::empty() + }; + RawWindowHandle::MacOS(handle) + } } impl WindowExtMacOS for UnownedWindow { diff --git a/src/platform_impl/windows/window.rs b/src/platform_impl/windows/window.rs index 39f6b478..8704ccfb 100644 --- a/src/platform_impl/windows/window.rs +++ b/src/platform_impl/windows/window.rs @@ -1,6 +1,7 @@ #![cfg(target_os = "windows")] use parking_lot::Mutex; +use raw_window_handle::{windows::WindowsHandle, RawWindowHandle}; use std::{ cell::Cell, ffi::OsStr, @@ -339,6 +340,15 @@ impl Window { self.window.0 } + #[inline] + pub fn raw_window_handle(&self) -> RawWindowHandle { + let handle = WindowsHandle { + hwnd: self.window.0 as *mut _, + ..WindowsHandle::empty() + }; + RawWindowHandle::Windows(handle) + } + #[inline] pub fn set_cursor_icon(&self, cursor: CursorIcon) { self.window_state.lock().mouse.cursor = cursor; diff --git a/src/window.rs b/src/window.rs index 36079051..0afb8354 100644 --- a/src/window.rs +++ b/src/window.rs @@ -721,6 +721,12 @@ impl Window { } } +unsafe impl raw_window_handle::HasRawWindowHandle for Window { + fn raw_window_handle(&self) -> raw_window_handle::RawWindowHandle { + self.window.raw_window_handle() + } +} + /// Describes the appearance of the mouse cursor. #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]