From 31356b342ab997ba836e6b61b03351d8cd15951f Mon Sep 17 00:00:00 2001 From: Aaron Gorodetzky Date: Wed, 25 Oct 2023 16:47:57 -0400 Subject: [PATCH] Update RWH code for x11 --- src/lib.rs | 4 ++-- src/x11.rs | 40 +++++++++++++++++++++++++++------------- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index ea781f1..aee4a0e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,4 @@ -use raw_window_handle::HasRawWindowHandle; +use raw_window_handle::{HasDisplayHandle, HasWindowHandle}; use std::ffi::c_void; use std::marker::PhantomData; @@ -73,7 +73,7 @@ pub struct GlContext { impl GlContext { pub unsafe fn create( - parent: &impl HasRawWindowHandle, + parent: &(impl HasWindowHandle + HasDisplayHandle), config: GlConfig, ) -> Result { platform::GlContext::create(parent, config).map(|context| GlContext { diff --git a/src/x11.rs b/src/x11.rs index 573617f..f49408a 100644 --- a/src/x11.rs +++ b/src/x11.rs @@ -1,7 +1,7 @@ use std::ffi::{c_void, CString}; use std::os::raw::{c_int, c_ulong}; -use raw_window_handle::{HasRawWindowHandle, RawWindowHandle}; +use raw_window_handle::{HasDisplayHandle, HasRawDisplayHandle, HasRawWindowHandle, HasWindowHandle, RawDisplayHandle, RawWindowHandle, WindowHandle}; use x11::glx; use x11::xlib; @@ -44,22 +44,36 @@ pub struct GlContext { impl GlContext { pub unsafe fn create( - parent: &impl HasRawWindowHandle, + parent: &(impl HasWindowHandle + HasDisplayHandle), config: GlConfig, ) -> Result { - let handle = if let RawWindowHandle::Xlib(handle) = parent.raw_window_handle() { - handle - } else { - return Err(GlError::InvalidWindowHandle); + + let raw_handle = match parent.display_handle() { + Ok(handle) => handle.as_raw(), + Err(_) => return Err(GlError::InvalidWindowHandle), }; - if handle.display.is_null() { - return Err(GlError::InvalidWindowHandle); - } + let handle = match raw_handle { + RawDisplayHandle::Xlib(handle) => handle, + _ => return Err(GlError::CreationFailed), + }; + + let raw_window = match parent.window_handle() { + Ok(window) => window.as_raw(), + Err(_) => return Err(GlError::InvalidWindowHandle), + }; + + let window_id = match raw_window { + RawWindowHandle::Xlib(handle) => handle.window, + _ => return Err(GlError::InvalidWindowHandle), + }; let prev_callback = xlib::XSetErrorHandler(Some(err_handler)); - let display = handle.display as *mut xlib::_XDisplay; + let display = match handle.display { + Some(non_null) => non_null.as_ptr() as *mut xlib::_XDisplay, + None => return Err(GlError::InvalidWindowHandle), + }; let screen = xlib::XDefaultScreen(display); @@ -134,14 +148,14 @@ impl GlContext { return Err(GlError::CreationFailed); } - glx::glXMakeCurrent(display, handle.window, context); - glXSwapIntervalEXT(display, handle.window, config.vsync as i32); + glx::glXMakeCurrent(display, window_id, context); + glXSwapIntervalEXT(display, window_id, config.vsync as i32); glx::glXMakeCurrent(display, 0, std::ptr::null_mut()); xlib::XSetErrorHandler(prev_callback); Ok(GlContext { - window: handle.window, + window: window_id, display, context, })