From 07abebb13f35488a2027c4506abd1cd330f7b0fb Mon Sep 17 00:00:00 2001 From: "Moon D." Date: Mon, 24 Nov 2025 10:53:34 -0500 Subject: [PATCH 1/2] Wayland support --- ffi/src/lib.rs | 7 +++++-- renderer/src/lib.rs | 21 +++++++++++++++++---- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/ffi/src/lib.rs b/ffi/src/lib.rs index bde38a5..d55d93b 100644 --- a/ffi/src/lib.rs +++ b/ffi/src/lib.rs @@ -28,13 +28,16 @@ pub extern "C" fn processing_init() { #[unsafe(no_mangle)] pub extern "C" fn processing_create_surface( window_handle: u64, + display_handle: u64, width: u32, height: u32, scale_factor: f32, ) -> u64 { error::clear_error(); - error::check(|| renderer::create_surface(window_handle, width, height, scale_factor)) - .unwrap_or(0) + error::check(|| { + renderer::create_surface(window_handle, display_handle, width, height, scale_factor) + }) + .unwrap_or(0) } /// Destroy the surface associated with the given window ID. diff --git a/renderer/src/lib.rs b/renderer/src/lib.rs index 18c3162..0792e79 100644 --- a/renderer/src/lib.rs +++ b/renderer/src/lib.rs @@ -1,7 +1,7 @@ pub mod error; pub mod render; -use std::{cell::RefCell, num::NonZero, sync::OnceLock}; +use std::{cell::RefCell, ffi::c_void, num::NonZero, ptr::NonNull, sync::OnceLock}; use bevy::{ app::{App, AppExit}, @@ -95,6 +95,7 @@ impl HasDisplayHandle for GlfwWindow { /// actually create the surface. pub fn create_surface( window_handle: u64, + display_handle: u64, width: u32, height: u32, scale_factor: f32, @@ -132,7 +133,7 @@ pub fn create_surface( } }; - let window = AppKitWindowHandle::new(std::ptr::NonNull::new(ns_view_ptr).unwrap()); + let window = AppKitWindowHandle::new(NonNull::new(ns_view_ptr).unwrap()); let display = AppKitDisplayHandle::new(); ( RawWindowHandle::AppKit(window), @@ -178,8 +179,20 @@ pub fn create_surface( }; #[cfg(target_os = "linux")] - let (raw_window_handle, raw_display_handle) = - { todo!("implement linux raw window handle conversion") }; + let (raw_window_handle, raw_display_handle) = { + use raw_window_handle::{WaylandDisplayHandle, WaylandWindowHandle}; + + let window_handle_ptr = unsafe { NonNull::new_unchecked(window_handle as *mut c_void) }; + let window = WaylandWindowHandle::new(window_handle_ptr); + + let display_handle_ptr = unsafe { NonNull::new_unchecked(display_handle as *mut c_void) }; + let display = WaylandDisplayHandle::new(display_handle_ptr); + + ( + RawWindowHandle::Wayland(window), + RawDisplayHandle::Wayland(display), + ) + }; let glfw_window = GlfwWindow { window_handle: raw_window_handle, From 4023c906ce7edb0c8885ed168ad7c6940f14972c Mon Sep 17 00:00:00 2001 From: "Moon D." Date: Mon, 24 Nov 2025 16:56:53 -0500 Subject: [PATCH 2/2] Unwrap checked pointer, and error handling for null pointers --- renderer/src/lib.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/renderer/src/lib.rs b/renderer/src/lib.rs index 0792e79..f158562 100644 --- a/renderer/src/lib.rs +++ b/renderer/src/lib.rs @@ -182,10 +182,20 @@ pub fn create_surface( let (raw_window_handle, raw_display_handle) = { use raw_window_handle::{WaylandDisplayHandle, WaylandWindowHandle}; - let window_handle_ptr = unsafe { NonNull::new_unchecked(window_handle as *mut c_void) }; + if window_handle == 0 { + return Err(error::ProcessingError::HandleError( + HandleError::Unavailable, + )); + } + let window_handle_ptr = NonNull::new(window_handle as *mut c_void).unwrap(); let window = WaylandWindowHandle::new(window_handle_ptr); - let display_handle_ptr = unsafe { NonNull::new_unchecked(display_handle as *mut c_void) }; + if display_handle == 0 { + return Err(error::ProcessingError::HandleError( + HandleError::Unavailable, + )); + } + let display_handle_ptr = NonNull::new(display_handle as *mut c_void).unwrap(); let display = WaylandDisplayHandle::new(display_handle_ptr); (