#![allow(dead_code)]
use std::ffi::{c_char, c_void, CStr, CString};
-use crate::ui::{event, ffi, UiDouble, UiInteger, UiString, UiText, UiRange, ListSelection};
+use crate::ui::{event, ffi, UiDouble, UiInteger, UiString, UiText, UiRange, ListSelection, UiObject};
use crate::ui::ffi::{UiEvent};
pub struct Event<'a, T> {
+ pub obj: &'a mut UiObject<T>,
pub data: &'a mut T,
pub event_type: EventType<'a>,
pub intval: i32,
let mut event_data = get_event_data(e);
let event_type = get_event_type(&mut event_data);
+ let obj_ptr = unsafe { ui_event_get_obj(e) };
+ let mut obj: UiObject<T> = UiObject::from_ptr(obj_ptr);
+
let mut event = Event {
+ obj: &mut obj,
data: wdata,
event_type: event_type,
intval: ev_int,
}
extern "C" {
+ fn ui_event_get_obj(event: *const UiEvent) -> *mut ffi::UiObject;
fn ui_event_get_windowdata(event: *const UiEvent) -> *const c_void;
fn ui_event_get_document(event: *const UiEvent) -> *const c_void;
fn ui_event_get_eventdata(event: *const UiEvent) -> *mut c_void;
}
impl<T> UiObject<T> {
+ pub fn from_ptr(ptr: *mut ffi::UiObject) -> UiObject<T> {
+ let ctx_ptr = unsafe { ui_object_get_context(ptr) };
+ unsafe {
+ ui_object_ref(ptr);
+ }
+ UiObject {
+ ptr: ptr,
+ ctx: UiContext::from_ptr(ctx_ptr),
+ _data: PhantomData
+ }
+ }
+
pub fn window_data<F>(self, mut f: F)
where F: FnMut(&mut T) {
unsafe {
let wdata_ptr: *mut T = ui_object_get_windowdata(self.ptr).cast();
- assert!(!wdata_ptr.is_null());
- f(&mut *wdata_ptr);
+ if !wdata_ptr.is_null() {
+ f(&mut *wdata_ptr);
+ }
}
}