1
0
Fork 0

raw-window-handle 0.6.0 (windows only!!!!)

This commit is contained in:
Alex Janka 2024-02-08 15:17:50 +11:00
parent 50a5602bca
commit b3bbdea6c0
4 changed files with 44 additions and 36 deletions

View file

@ -15,12 +15,12 @@ edition = "2018"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
[features] [features]
default = [] default = ["opengl"]
opengl = ["uuid", "x11/glx"] opengl = ["uuid", "x11/glx"]
[dependencies] [dependencies]
keyboard-types = { version = "0.6.1", default-features = false } keyboard-types = { version = "0.6.1", default-features = false }
raw-window-handle = "0.5" raw-window-handle = "0.6"
[target.'cfg(target_os="linux")'.dependencies] [target.'cfg(target_os="linux")'.dependencies]
xcb = { version = "0.9", features = ["thread", "xlib_xcb", "dri2"] } xcb = { version = "0.9", features = ["thread", "xlib_xcb", "dri2"] }
@ -29,7 +29,20 @@ xcb-util = { version = "0.3", features = ["icccm"] }
nix = "0.22.0" nix = "0.22.0"
[target.'cfg(target_os="windows")'.dependencies] [target.'cfg(target_os="windows")'.dependencies]
winapi = { version = "0.3.8", features = ["libloaderapi", "winuser", "windef", "minwindef", "guiddef", "combaseapi", "wingdi", "errhandlingapi", "ole2", "oleidl", "shellapi", "winerror"] } winapi = { version = "0.3.8", features = [
"libloaderapi",
"winuser",
"windef",
"minwindef",
"guiddef",
"combaseapi",
"wingdi",
"errhandlingapi",
"ole2",
"oleidl",
"shellapi",
"winerror",
] }
uuid = { version = "0.8", features = ["v4"], optional = true } uuid = { version = "0.8", features = ["v4"], optional = true }
[target.'cfg(target_os="macos")'.dependencies] [target.'cfg(target_os="macos")'.dependencies]

View file

@ -35,11 +35,7 @@ impl GlContext {
return Err(GlError::InvalidWindowHandle); return Err(GlError::InvalidWindowHandle);
}; };
if handle.ns_view.is_null() { let parent_view = handle.ns_view.as_ptr() as id;
return Err(GlError::InvalidWindowHandle);
}
let parent_view = handle.ns_view as id;
let version = if config.version < (3, 2) && config.profile == Profile::Compatibility { let version = if config.version < (3, 2) && config.profile == Profile::Compatibility {
NSOpenGLProfileVersionLegacy NSOpenGLProfileVersionLegacy

View file

@ -47,7 +47,7 @@ impl WindowHandle {
} }
unsafe impl HasRawWindowHandle for WindowHandle { unsafe impl HasRawWindowHandle for WindowHandle {
fn raw_window_handle(&self) -> RawWindowHandle { fn raw_window_handle(&self) -> Result<RawWindowHandle, raw_window_handle::HandleError> {
self.state.window_inner.raw_window_handle() self.state.window_inner.raw_window_handle()
} }
} }
@ -103,18 +103,15 @@ impl WindowInner {
} }
} }
fn raw_window_handle(&self) -> RawWindowHandle { fn raw_window_handle(&self) -> Result<RawWindowHandle, raw_window_handle::HandleError> {
if self.open.get() { if self.open.get() {
let ns_window = self.ns_window.get().unwrap_or(ptr::null_mut()) as *mut c_void; Ok(RawWindowHandle::AppKit(AppKitWindowHandle::new(
std::ptr::NonNull::new(self.ns_view as *mut c_void)
let mut handle = AppKitWindowHandle::empty(); .ok_or(raw_window_handle::HandleError::Unavailable)?,
handle.ns_window = ns_window; )))
handle.ns_view = self.ns_view as *mut c_void; } else {
Err(raw_window_handle::HandleError::Unavailable)
return RawWindowHandle::AppKit(handle);
} }
RawWindowHandle::AppKit(AppKitWindowHandle::empty())
} }
} }
@ -139,7 +136,7 @@ impl<'a> Window<'a> {
let window_info = WindowInfo::from_logical_size(options.size, scaling); let window_info = WindowInfo::from_logical_size(options.size, scaling);
let handle = if let RawWindowHandle::AppKit(handle) = parent.raw_window_handle() { let handle = if let Ok(RawWindowHandle::AppKit(handle)) = parent.raw_window_handle() {
handle handle
} else { } else {
panic!("Not a macOS window"); panic!("Not a macOS window");
@ -162,7 +159,7 @@ impl<'a> Window<'a> {
let window_handle = Self::init(window_inner, window_info, build); let window_handle = Self::init(window_inner, window_info, build);
unsafe { unsafe {
let _: id = msg_send![handle.ns_view as *mut Object, addSubview: ns_view]; let _: id = msg_send![handle.ns_view.as_ptr() as *mut Object, addSubview: ns_view];
let () = msg_send![pool, drain]; let () = msg_send![pool, drain];
} }
@ -316,10 +313,9 @@ impl<'a> Window<'a> {
#[cfg(feature = "opengl")] #[cfg(feature = "opengl")]
fn create_gl_context(ns_window: Option<id>, ns_view: id, config: GlConfig) -> GlContext { fn create_gl_context(ns_window: Option<id>, ns_view: id, config: GlConfig) -> GlContext {
let mut handle = AppKitWindowHandle::empty(); let handle = RawWindowHandle::AppKit(AppKitWindowHandle::new(
handle.ns_window = ns_window.unwrap_or(ptr::null_mut()) as *mut c_void; std::ptr::NonNull::new(ns_view as *mut c_void).expect("Could not create window handle"),
handle.ns_view = ns_view as *mut c_void; ));
let handle = RawWindowHandle::AppKit(handle);
unsafe { GlContext::create(&handle, config).expect("Could not create OpenGL context") } unsafe { GlContext::create(&handle, config).expect("Could not create OpenGL context") }
} }
@ -394,14 +390,14 @@ impl WindowState {
} }
unsafe impl<'a> HasRawWindowHandle for Window<'a> { unsafe impl<'a> HasRawWindowHandle for Window<'a> {
fn raw_window_handle(&self) -> RawWindowHandle { fn raw_window_handle(&self) -> Result<RawWindowHandle, raw_window_handle::HandleError> {
self.inner.raw_window_handle() self.inner.raw_window_handle()
} }
} }
unsafe impl<'a> HasRawDisplayHandle for Window<'a> { unsafe impl<'a> HasRawDisplayHandle for Window<'a> {
fn raw_display_handle(&self) -> RawDisplayHandle { fn raw_display_handle(&self) -> Result<RawDisplayHandle, raw_window_handle::HandleError> {
RawDisplayHandle::AppKit(AppKitDisplayHandle::empty()) Ok(RawDisplayHandle::AppKit(AppKitDisplayHandle::new()))
} }
} }

View file

@ -1,7 +1,8 @@
use std::marker::PhantomData; use std::marker::PhantomData;
use raw_window_handle::{ use raw_window_handle::{
HasRawDisplayHandle, HasRawWindowHandle, RawDisplayHandle, RawWindowHandle, DisplayHandle, HasDisplayHandle, HasRawDisplayHandle, HasRawWindowHandle, HasWindowHandle,
RawDisplayHandle, RawWindowHandle,
}; };
use crate::event::{Event, EventStatus}; use crate::event::{Event, EventStatus};
@ -39,7 +40,7 @@ impl WindowHandle {
} }
unsafe impl HasRawWindowHandle for WindowHandle { unsafe impl HasRawWindowHandle for WindowHandle {
fn raw_window_handle(&self) -> RawWindowHandle { fn raw_window_handle(&self) -> Result<RawWindowHandle, raw_window_handle::HandleError> {
self.window_handle.raw_window_handle() self.window_handle.raw_window_handle()
} }
} }
@ -110,14 +111,16 @@ impl<'a> Window<'a> {
} }
} }
unsafe impl<'a> HasRawWindowHandle for Window<'a> { impl<'a> HasWindowHandle for Window<'a> {
fn raw_window_handle(&self) -> RawWindowHandle { fn window_handle(
self.window.raw_window_handle() &self,
) -> Result<raw_window_handle::WindowHandle<'_>, raw_window_handle::HandleError> {
Ok(unsafe { raw_window_handle::WindowHandle::borrow_raw(self.window.raw_window_handle()?) })
} }
} }
unsafe impl<'a> HasRawDisplayHandle for Window<'a> { impl<'a> HasDisplayHandle for Window<'a> {
fn raw_display_handle(&self) -> RawDisplayHandle { fn display_handle(&self) -> Result<DisplayHandle<'_>, raw_window_handle::HandleError> {
self.window.raw_display_handle() Ok(unsafe { DisplayHandle::borrow_raw(self.window.raw_display_handle()?) })
} }
} }