Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update raw-window-handle to v0.6 #1670

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Unreleased

- **Breaking:** updated `raw-window-handle` dependency to `0.6`.
- Bump MSRV from `1.65` to `1.70`.

# Version 0.31.3
4 changes: 2 additions & 2 deletions glutin-winit/Cargo.toml
Original file line number Diff line number Diff line change
@@ -20,8 +20,8 @@ wayland = ["glutin/wayland", "winit/wayland"]

[dependencies]
glutin = { version = "0.31.0", path = "../glutin", default-features = false }
raw-window-handle = "0.5.2"
winit = { version = "0.29.2", default-features = false, features = ["rwh_05"] }
raw-window-handle = "0.6"
winit = { version = "0.29.2", default-features = false, features = ["rwh_06"] }

[build-dependencies]
cfg_aliases = "0.1.1"
12 changes: 8 additions & 4 deletions glutin-winit/src/lib.rs
Original file line number Diff line number Diff line change
@@ -21,9 +21,9 @@ use glutin::platform::x11::X11GlConfigExt;
use glutin::prelude::*;

#[cfg(wgl_backend)]
use raw_window_handle::HasRawWindowHandle;
use raw_window_handle::HasWindowHandle;

use raw_window_handle::{HasRawDisplayHandle, RawWindowHandle};
use raw_window_handle::{HasDisplayHandle, RawWindowHandle};
use winit::error::OsError;
use winit::event_loop::EventLoopWindowTarget;
use winit::window::{Window, WindowBuilder};
@@ -104,7 +104,10 @@ impl DisplayBuilder {
};

#[cfg(wgl_backend)]
let raw_window_handle = window.as_ref().map(|window| window.raw_window_handle());
let raw_window_handle = window
.as_ref()
.and_then(|window| window.window_handle().ok())
.map(|handle| handle.as_raw());
#[cfg(not(wgl_backend))]
let raw_window_handle = None;

@@ -170,7 +173,8 @@ fn create_display<T>(
ApiPreference::FallbackEgl => DisplayApiPreference::WglThenEgl(_raw_window_handle),
};

unsafe { Ok(Display::new(window_target.raw_display_handle(), _preference)?) }
let handle = window_target.display_handle()?.as_raw();
unsafe { Ok(Display::new(handle, _preference)?) }
}

/// Finalize [`Window`] creation by applying the options from the [`Config`], be
9 changes: 5 additions & 4 deletions glutin-winit/src/window.rs
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@ use glutin::surface::{
GlSurface, ResizeableSurface, Surface, SurfaceAttributes, SurfaceAttributesBuilder,
SurfaceTypeTrait, WindowSurface,
};
use raw_window_handle::HasRawWindowHandle;
use raw_window_handle::{HandleError, HasWindowHandle};
use winit::window::Window;

/// [`Window`] extensions for working with [`glutin`] surfaces.
@@ -25,7 +25,7 @@ pub trait GlWindow {
fn build_surface_attributes(
&self,
builder: SurfaceAttributesBuilder<WindowSurface>,
) -> SurfaceAttributes<WindowSurface>;
) -> Result<SurfaceAttributes<WindowSurface>, HandleError>;

/// Resize the surface to the window inner size.
///
@@ -51,9 +51,10 @@ impl GlWindow for Window {
fn build_surface_attributes(
&self,
builder: SurfaceAttributesBuilder<WindowSurface>,
) -> SurfaceAttributes<WindowSurface> {
) -> Result<SurfaceAttributes<WindowSurface>, HandleError> {
let (w, h) = self.inner_size().non_zero().expect("invalid zero inner size");
builder.build(self.raw_window_handle(), w, h)
let handle = self.window_handle()?.as_raw();
Ok(builder.build(handle, w, h))
}

fn resize_surface(
2 changes: 1 addition & 1 deletion glutin/Cargo.toml
Original file line number Diff line number Diff line change
@@ -23,7 +23,7 @@ wayland = ["wayland-sys", "egl"]
bitflags = "2.2.1"
libloading = { version = "0.8.0", optional = true }
once_cell = "1.13"
raw-window-handle = "0.5.2"
raw-window-handle = "0.6"

[target.'cfg(windows)'.dependencies]
glutin_egl_sys = { version = "0.6.0", path = "../glutin_egl_sys", optional = true }
36 changes: 16 additions & 20 deletions glutin/src/api/cgl/surface.rs
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@ use std::marker::PhantomData;
use std::num::NonZeroU32;

use objc2::rc::Id;
use objc2_app_kit::{NSView, NSWindow};
use objc2_app_kit::NSView;
use objc2_foundation::{run_on_main, MainThreadBound, MainThreadMarker};
use raw_window_handle::RawWindowHandle;

@@ -59,28 +59,19 @@ impl Display {

// SAFETY: Validity of the view and window is ensured by caller
// This function makes sure the window is non null.
let ns_view = if let Some(ns_view) = unsafe { Id::retain(native_window.ns_view.cast()) } {
let ns_view = if let Some(ns_view) =
unsafe { Id::retain(native_window.ns_view.as_ptr().cast()) }
{
ns_view
} else {
return Err(ErrorKind::NotSupported("ns_view of provided native window is nil").into());
};
let ns_view = MainThreadBound::new(ns_view, mtm);

let ns_window =
if let Some(ns_window) = unsafe { Id::retain(native_window.ns_window.cast()) } {
ns_window
} else {
return Err(
ErrorKind::NotSupported("ns_window of provided native window is nil").into()
);
};
let ns_window = MainThreadBound::new(ns_window, mtm);

let surface = Surface {
display: self.clone(),
config: config.clone(),
ns_view,
ns_window,
_nosync: PhantomData,
_ty: PhantomData,
};
@@ -93,7 +84,6 @@ pub struct Surface<T: SurfaceTypeTrait> {
display: Display,
config: Config,
pub(crate) ns_view: MainThreadBound<Id<NSView>>,
ns_window: MainThreadBound<Id<NSWindow>>,
_nosync: PhantomData<*const std::ffi::c_void>,
_ty: PhantomData<T>,
}
@@ -110,21 +100,27 @@ impl<T: SurfaceTypeTrait> GlSurface<T> for Surface<T> {
}

fn width(&self) -> Option<u32> {
let window = &self.ns_window;
let view = &self.ns_view;
run_on_main(|mtm| {
let scale_factor = window.get(mtm).backingScaleFactor();
let frame = view.get(mtm).frame();
let view = view.get(mtm);
let scale_factor = match view.window() {
Some(window) => window.backingScaleFactor(),
None => 1.0,
};
let frame = view.frame();
Some((frame.size.width * scale_factor) as u32)
})
}

fn height(&self) -> Option<u32> {
let window = &self.ns_window;
let view = &self.ns_view;
run_on_main(|mtm| {
let scale_factor = window.get(mtm).backingScaleFactor();
let frame = view.get(mtm).frame();
let view = view.get(mtm);
let scale_factor = match view.window() {
Some(window) => window.backingScaleFactor(),
None => 1.0,
};
let frame = view.frame();
Some((frame.size.height * scale_factor) as u32)
})
}
6 changes: 3 additions & 3 deletions glutin/src/api/egl/config.rs
Original file line number Diff line number Diff line change
@@ -196,8 +196,8 @@ impl Display {
// XXX This can't be done by passing visual in the EGL attributes
// when calling `eglChooseConfig` since the visual is ignored.
match template.native_window {
Some(RawWindowHandle::Xcb(xcb)) if xcb.visual_id > 0 => {
xcb.visual_id as u32 == config.native_visual()
Some(RawWindowHandle::Xcb(xcb)) => {
xcb.visual_id.map_or(false, |id| id.get() == config.native_visual())
},
Some(RawWindowHandle::Xlib(xlib)) if xlib.visual_id > 0 => {
xlib.visual_id as u32 == config.native_visual()
@@ -386,7 +386,7 @@ impl X11GlConfigExt for Config {
match *self.inner.display.inner._native_display? {
raw_window_handle::RawDisplayHandle::Xlib(display_handle) => unsafe {
let xid = self.native_visual();
X11VisualInfo::from_xid(display_handle.display as *mut _, xid as _)
X11VisualInfo::from_xid(display_handle.display?.as_ptr() as *mut _, xid as _)
},
_ => None,
}
51 changes: 25 additions & 26 deletions glutin/src/api/egl/display.rs
Original file line number Diff line number Diff line change
@@ -14,6 +14,8 @@ use glutin_egl_sys::egl::types::{EGLAttrib, EGLDisplay, EGLint};
use once_cell::sync::OnceCell;

use raw_window_handle::RawDisplayHandle;
#[cfg(x11_platform)]
use raw_window_handle::XlibDisplayHandle;

use crate::config::ConfigTemplate;
use crate::context::Version;
@@ -239,21 +241,24 @@ impl Display {
let extensions = CLIENT_EXTENSIONS.get().unwrap();

let mut attrs = Vec::<EGLAttrib>::with_capacity(5);
let (platform, mut display) = match display {
let (platform, display) = match display {
#[cfg(wayland_platform)]
RawDisplayHandle::Wayland(handle)
if extensions.contains("EGL_KHR_platform_wayland") =>
{
(egl::PLATFORM_WAYLAND_KHR, handle.display)
(egl::PLATFORM_WAYLAND_KHR, handle.display.as_ptr())
},
#[cfg(x11_platform)]
RawDisplayHandle::Xlib(handle) if extensions.contains("EGL_KHR_platform_x11") => {
attrs.push(egl::PLATFORM_X11_SCREEN_KHR as EGLAttrib);
attrs.push(handle.screen as EGLAttrib);
(egl::PLATFORM_X11_KHR, handle.display)
(
egl::PLATFORM_X11_KHR,
handle.display.map_or(egl::DEFAULT_DISPLAY as *mut _, |d| d.as_ptr()),
)
},
RawDisplayHandle::Gbm(handle) if extensions.contains("EGL_KHR_platform_gbm") => {
(egl::PLATFORM_GBM_KHR, handle.gbm_device)
(egl::PLATFORM_GBM_KHR, handle.gbm_device.as_ptr())
},
RawDisplayHandle::Android(_) if extensions.contains("EGL_KHR_platform_android") => {
(egl::PLATFORM_ANDROID_KHR, egl::DEFAULT_DISPLAY as *mut _)
@@ -265,11 +270,6 @@ impl Display {
},
};

// Be explicit here.
if display.is_null() {
display = egl::DEFAULT_DISPLAY as *mut _;
MarijnS95 marked this conversation as resolved.
Show resolved Hide resolved
}

// Push at the end so we can pop it on failure
let mut has_display_reference = extensions.contains("EGL_KHR_display_reference");
if has_display_reference {
@@ -315,18 +315,21 @@ impl Display {

let mut attrs = Vec::<EGLint>::with_capacity(5);
let mut legacy = false;
let (platform, mut display) = match display {
let (platform, display) = match display {
#[cfg(wayland_platform)]
RawDisplayHandle::Wayland(handle)
if extensions.contains("EGL_EXT_platform_wayland") =>
{
(egl::PLATFORM_WAYLAND_EXT, handle.display)
(egl::PLATFORM_WAYLAND_EXT, handle.display.as_ptr())
},
#[cfg(x11_platform)]
RawDisplayHandle::Xlib(handle) if extensions.contains("EGL_EXT_platform_x11") => {
attrs.push(egl::PLATFORM_X11_SCREEN_EXT as EGLint);
attrs.push(handle.screen as EGLint);
(egl::PLATFORM_X11_EXT, handle.display)
(
egl::PLATFORM_X11_EXT,
handle.display.map_or(egl::DEFAULT_DISPLAY as *mut _, |d| d.as_ptr()),
)
},
#[cfg(x11_platform)]
RawDisplayHandle::Xcb(handle)
@@ -335,10 +338,13 @@ impl Display {
{
attrs.push(egl::PLATFORM_XCB_SCREEN_EXT as EGLint);
attrs.push(handle.screen as EGLint);
(egl::PLATFORM_XCB_EXT, handle.connection)
(
egl::PLATFORM_XCB_EXT,
handle.connection.map_or(egl::DEFAULT_DISPLAY as *mut _, |c| c.as_ptr()),
)
},
RawDisplayHandle::Gbm(handle) if extensions.contains("EGL_MESA_platform_gbm") => {
(egl::PLATFORM_GBM_MESA, handle.gbm_device)
(egl::PLATFORM_GBM_MESA, handle.gbm_device.as_ptr())
},
RawDisplayHandle::Windows(..) if extensions.contains("EGL_ANGLE_platform_angle") => {
// Only CreateWindowSurface appears to work with Angle.
@@ -352,11 +358,6 @@ impl Display {
},
};

// Be explicit here.
if display.is_null() {
display = egl::DEFAULT_DISPLAY as *mut _;
}

// Push at the end so we can pop it on failure
let mut has_display_reference = extensions.contains("EGL_KHR_display_reference");
if has_display_reference {
@@ -404,10 +405,12 @@ impl Display {
}

fn get_display(egl: &Egl, display: RawDisplayHandle) -> Result<EglDisplay> {
let mut display = match display {
RawDisplayHandle::Gbm(handle) => handle.gbm_device,
let display = match display {
RawDisplayHandle::Gbm(handle) => handle.gbm_device.as_ptr(),
#[cfg(x11_platform)]
RawDisplayHandle::Xlib(handle) => handle.display,
RawDisplayHandle::Xlib(XlibDisplayHandle { display, .. }) => {
display.map_or(egl::DEFAULT_DISPLAY as *mut _, |d| d.as_ptr())
MarijnS95 marked this conversation as resolved.
Show resolved Hide resolved
},
RawDisplayHandle::Android(_) => egl::DEFAULT_DISPLAY as *mut _,
_ => {
return Err(
@@ -416,10 +419,6 @@ impl Display {
},
};

if display.is_null() {
display = egl::DEFAULT_DISPLAY as *mut _;
}

let display = unsafe { egl.GetDisplay(display) };
Self::check_display_error(display).map(EglDisplay::Legacy)
}
36 changes: 5 additions & 31 deletions glutin/src/api/egl/surface.rs
Original file line number Diff line number Diff line change
@@ -472,14 +472,10 @@ impl NativeWindow {
let native_window = match raw_window_handle {
#[cfg(wayland_platform)]
RawWindowHandle::Wayland(window_handle) => unsafe {
if window_handle.surface.is_null() {
return Err(ErrorKind::BadNativeWindow.into());
}

let ptr = ffi_dispatch!(
wayland_egl_handle(),
wl_egl_window_create,
window_handle.surface.cast(),
window_handle.surface.as_ptr().cast(),
_width.get() as _,
_height.get() as _
);
@@ -497,37 +493,15 @@ impl NativeWindow {
Self::Xlib(window_handle.window as _)
},
#[cfg(x11_platform)]
RawWindowHandle::Xcb(window_handle) => {
if window_handle.window == 0 {
return Err(ErrorKind::BadNativeWindow.into());
}

Self::Xcb(window_handle.window as _)
},
RawWindowHandle::Xcb(window_handle) => Self::Xcb(window_handle.window.get() as _),
#[cfg(android_platform)]
RawWindowHandle::AndroidNdk(window_handle) => {
if window_handle.a_native_window.is_null() {
return Err(ErrorKind::BadNativeWindow.into());
}

Self::Android(window_handle.a_native_window)
Self::Android(window_handle.a_native_window.as_ptr())
},
#[cfg(windows)]
RawWindowHandle::Win32(window_handle) => {
if window_handle.hwnd.is_null() {
return Err(ErrorKind::BadNativeWindow.into());
}

Self::Win32(window_handle.hwnd as _)
},
RawWindowHandle::Win32(window_handle) => Self::Win32(window_handle.hwnd.get() as _),
#[cfg(free_unix)]
RawWindowHandle::Gbm(window_handle) => {
if window_handle.gbm_surface.is_null() {
return Err(ErrorKind::BadNativeWindow.into());
}

Self::Gbm(window_handle.gbm_surface)
},
RawWindowHandle::Gbm(window_handle) => Self::Gbm(window_handle.gbm_surface.as_ptr()),
_ => {
return Err(
ErrorKind::NotSupported("provided native window is not supported").into()
9 changes: 3 additions & 6 deletions glutin/src/api/glx/display.rs
Original file line number Diff line number Diff line change
@@ -44,12 +44,9 @@ impl Display {
) -> Result<Self> {
// Don't load GLX when unsupported platform was requested.
let (display, screen) = match display {
RawDisplayHandle::Xlib(handle) => {
if handle.display.is_null() {
return Err(ErrorKind::BadDisplay.into());
}

(GlxDisplay(handle.display as *mut _), handle.screen as i32)
RawDisplayHandle::Xlib(handle) => match handle.display {
Some(display) => (GlxDisplay(display.as_ptr() as *mut _), handle.screen as i32),
None => return Err(ErrorKind::BadDisplay.into()),
},
_ => {
return Err(
Loading