From 1f9a858ee2e9d21100394a7d63d1319175ab44e1 Mon Sep 17 00:00:00 2001 From: Adrien Prokopowicz <6529475+prokopyl@users.noreply.github.com> Date: Sun, 5 Jul 2026 02:04:28 +0200 Subject: [PATCH 1/2] wip --- examples/render_femtovg/src/main.rs | 7 +++++-- src/gl.rs | 4 ++-- src/platform/macos/gl.rs | 19 +++++++++++++++---- src/platform/win/gl.rs | 5 ++--- src/platform/x11/gl.rs | 8 +++----- 5 files changed, 27 insertions(+), 16 deletions(-) diff --git a/examples/render_femtovg/src/main.rs b/examples/render_femtovg/src/main.rs index edbb8a81..102b1f4c 100644 --- a/examples/render_femtovg/src/main.rs +++ b/examples/render_femtovg/src/main.rs @@ -6,6 +6,7 @@ use baseview::{ use femtovg::renderer::OpenGl; use femtovg::{Canvas, Color}; use std::cell::{Cell, RefCell}; +use std::ffi::CString; struct FemtovgExample { window_context: WindowContext, @@ -20,8 +21,10 @@ impl FemtovgExample { let gl_context = window_context.gl_context().unwrap(); unsafe { gl_context.make_current() }; - let renderer = - unsafe { OpenGl::new_from_function(|s| gl_context.get_proc_address(s)) }.unwrap(); + let renderer = unsafe { + OpenGl::new_from_function(|s| gl_context.get_proc_address(&CString::new(s).unwrap())) + } + .unwrap(); let mut canvas = Canvas::new(renderer).unwrap(); let size = window_context.size(); diff --git a/src/gl.rs b/src/gl.rs index 4b020535..edfc89f7 100644 --- a/src/gl.rs +++ b/src/gl.rs @@ -1,5 +1,5 @@ use crate::platform::gl::*; -use std::ffi::c_void; +use std::ffi::{c_void, CStr}; use std::marker::PhantomData; #[derive(Clone, Debug, PartialEq)] @@ -70,7 +70,7 @@ impl GlContext { self.inner.make_not_current(); } - pub fn get_proc_address(&self, symbol: &str) -> *const c_void { + pub fn get_proc_address(&self, symbol: &CStr) -> *const c_void { self.inner.get_proc_address(symbol) } diff --git a/src/platform/macos/gl.rs b/src/platform/macos/gl.rs index ff9b39fd..4d3a5f63 100644 --- a/src/platform/macos/gl.rs +++ b/src/platform/macos/gl.rs @@ -11,9 +11,9 @@ use objc2_app_kit::{ NSOpenGLPixelFormat, NSOpenGLProfileVersion3_2Core, NSOpenGLProfileVersion4_1Core, NSOpenGLProfileVersionLegacy, NSOpenGLView, NSView, }; -use objc2_core_foundation::{CFBundle, CFString}; +use objc2_core_foundation::{CFBundle, CFString, CFStringBuiltInEncodings}; use objc2_foundation::NSSize; -use std::ffi::c_void; +use std::ffi::{c_void, CStr}; use std::ptr::NonNull; pub type CreationFailedError = (); @@ -103,8 +103,19 @@ impl GlContext { NSOpenGLContext::clearCurrentContext(); } - pub fn get_proc_address(&self, symbol: &str) -> *const c_void { - let symbol_name = CFString::from_str(symbol); + pub fn get_proc_address(&self, symbol: &CStr) -> *const c_void { + // SAFETY: The string pointer is valid + let symbol_name = unsafe { + CFString::with_bytes( + None, + symbol.as_ptr().cast(), + symbol.count_bytes().try_into().unwrap(), + CFStringBuiltInEncodings::EncodingUTF8.0, + false, + ) + } + .unwrap(); + let framework_name = CFString::from_static_str("com.apple.opengl"); let framework = CFBundle::bundle_with_identifier(Some(&framework_name)).unwrap(); diff --git a/src/platform/win/gl.rs b/src/platform/win/gl.rs index 3cc0585a..128baf47 100644 --- a/src/platform/win/gl.rs +++ b/src/platform/win/gl.rs @@ -1,4 +1,4 @@ -use std::ffi::{c_void, CString, OsStr}; +use std::ffi::{c_void, CStr, CString, OsStr}; use std::os::windows::ffi::OsStrExt; use std::rc::Rc; use windows_sys::{ @@ -307,8 +307,7 @@ impl GlContextInner { wglMakeCurrent(self.hdc, std::ptr::null_mut()); } - pub fn get_proc_address(&self, symbol: &str) -> *const c_void { - let symbol = CString::new(symbol).unwrap(); + pub fn get_proc_address(&self, symbol: &CStr) -> *const c_void { let symbol_ptr = symbol.as_ptr().cast(); let addr = unsafe { diff --git a/src/platform/x11/gl.rs b/src/platform/x11/gl.rs index 360a0e37..11b7adaa 100644 --- a/src/platform/x11/gl.rs +++ b/src/platform/x11/gl.rs @@ -4,7 +4,7 @@ use crate::wrappers::glx::*; use crate::wrappers::xlib::{XErrorHandler, XLibError}; use crate::platform::x11::xcb_window::XcbWindow; -use std::ffi::{c_ulong, c_void, CString}; +use std::ffi::{c_ulong, c_void, CStr}; use std::rc::Rc; use x11_dl::error::OpenError; use x11_dl::glx::GLXContext; @@ -165,10 +165,8 @@ impl GlContextInner { self.window.get().into() } - pub fn get_proc_address(&self, symbol: &str) -> *const c_void { - let symbol = CString::new(symbol).unwrap(); - - match self.glx.get_proc_address(&symbol) { + pub fn get_proc_address(&self, symbol: &CStr) -> *const c_void { + match self.glx.get_proc_address(symbol) { Some(ptr) => ptr.as_ptr(), None => std::ptr::null(), } From 915a1fbcc0bca68c3c4b4c1054f2ae964e8dc43c Mon Sep 17 00:00:00 2001 From: Adrien Prokopowicz <6529475+prokopyl@users.noreply.github.com> Date: Sun, 12 Jul 2026 20:47:01 +0200 Subject: [PATCH 2/2] fix --- src/platform/win/gl.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/win/gl.rs b/src/platform/win/gl.rs index 128baf47..3e9b7a6f 100644 --- a/src/platform/win/gl.rs +++ b/src/platform/win/gl.rs @@ -1,4 +1,4 @@ -use std::ffi::{c_void, CStr, CString, OsStr}; +use std::ffi::{c_void, CStr, OsStr}; use std::os::windows::ffi::OsStrExt; use std::rc::Rc; use windows_sys::{