pub _data: PhantomData<T>
}
+impl<T> Clone for UiObject<T> {
+ fn clone(&self) -> Self {
+ unsafe {
+ ui_object_ref(self.ptr);
+ }
+ UiObject {
+ ptr: self.ptr,
+ ctx: UiContext { ptr: self.ctx.ptr },
+ _data: PhantomData
+ }
+ }
+}
+
+impl<T> Drop for UiObject<T> {
+ fn drop(&mut self) {
+ unsafe {
+ ui_object_unref(self.ptr);
+ }
+ }
+}
pub struct UiText {
pub ptr: *mut ffi::UiText
type UiListCountFunc = extern "C" fn(*const ffi::UiList) -> c_int;
extern "C" {
+ pub fn ui_object_ref(obj: *mut ffi::UiObject);
+ pub fn ui_object_unref(obj: *mut ffi::UiObject);
+
fn ui_list_new(ctx: *mut ffi::UiContext, name: *const c_char) -> *mut ffi::UiList;
fn ui_list_new2(ctx: *mut ffi::UiContext, name: *const c_char, init: UiListInitFunc, userdata: *mut c_void) -> *mut ffi::UiList;
fn ui_list_class_set_first(list: *mut ffi::UiList, func: UiListFirstFunc);
use std::ffi::{c_char, c_int, c_void};
use std::ffi::CString;
use std::marker::PhantomData;
-use crate::ui::{event, ffi, toolkit, AppContext, EventWrapper, NoAppData, UiActions, UiModel};
+use crate::ui::{event, ffi, toolkit, ui_object_ref, AppContext, EventWrapper, NoAppData, UiActions, UiModel};
use crate::ui::ffi::{UiButtonArgs, UiCallback, UiContext, UiDestructor, UiDialogArgs, UiObject};
use crate::ui::widget::widget_fn;
WindowType::Simple => ui_simple_window(str.as_ptr())
}
};
+ // because we use additional reference counting in the Rust UiObject wrapper,
+ // we always increase the reference counter here
+ unsafe {
+ ui_object_ref(objptr);
+ }
let ctxptr = unsafe {
ui_object_get_context(objptr)
// call ui building closure
create_ui(&mut obj, wdata);
-
+
obj
}