]> uap-core.de Git - note.git/commitdiff
destroy boxed window data when a window is destroyed
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 12 Apr 2026 15:10:12 +0000 (17:10 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 12 Apr 2026 15:10:12 +0000 (17:10 +0200)
ui-rs/src/ui/ffi.rs
ui-rs/src/ui/window.rs

index 55d8b9b14e997ebb7117b94e6f8a0dbab91a4cc3..8e2da0666e192f54edab81abcd9176179f58f64f 100644 (file)
@@ -48,6 +48,7 @@ pub struct UiList {
 }
 
 pub type UiCallback = Option<extern "C" fn(event: *const UiEvent, *mut c_void)>;
+pub type UiDestructor = extern "C" fn(object: *mut c_void);
 
 
 #[repr(C)]
index ec01779dc98147bd1e8ff4c6fac3d0d28d45b0d8..6be3ff1cc4745d9636434a4798e266e1e81d08a8 100644 (file)
@@ -5,7 +5,7 @@ use std::ffi::{c_char, c_int, c_void};
 use std::ffi::CString;
 use std::marker::PhantomData;
 use crate::ui::toolkit;
-use crate::ui::ffi::UiObject;
+use crate::ui::ffi::{UiContext, UiDestructor, UiObject};
 
 extern "C" {
     fn ui_window(title: *const c_char) -> *mut UiObject;
@@ -18,8 +18,13 @@ extern "C" {
 
     fn ui_object_get_windowdata(obj: *const UiObject) -> *mut c_void;
     fn ui_object_set_windowdata(obj: *mut UiObject, data: *mut c_void);
+    fn ui_object_get_context(obj: *const UiObject) -> *mut UiContext;
+
+    fn ui_reg_destructor(ctx: *mut UiContext, data: *mut c_void, destructor: UiDestructor);
 }
 
+
+
 impl<T> toolkit::UiObject<T> {
     pub fn show(&self) {
         unsafe {
@@ -59,10 +64,21 @@ where F: FnOnce(&mut toolkit::UiObject<T>, &mut T) {
     let wdata_ptr = Box::into_raw(window_data);
     unsafe {
         ui_object_set_windowdata(objptr, wdata_ptr as *mut c_void);
+        let ctx = ui_object_get_context(objptr);
+        ui_reg_destructor(ctx, wdata_ptr as *mut c_void, destroy_boxed::<T>);
     }
     obj
 }
 
+extern "C" fn destroy_boxed<T>(data: *mut c_void) {
+    if data.is_null() {
+        return;
+    }
+   unsafe {
+       drop(Box::from_raw(data as *mut T));
+   }
+}
+
 pub fn window<T, F>(title: &str, data: T, create_ui: F) -> toolkit::UiObject<T>
 where F: FnOnce(&mut toolkit::UiObject<T>, &mut T)
 {