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;
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 {
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)
{