From: Olaf Wintermann Date: Sat, 13 Jun 2026 15:32:24 +0000 (+0200) Subject: add UiContext onattach/ondetach callbacks X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=HEAD;p=note.git add UiContext onattach/ondetach callbacks --- diff --git a/ui-rs/src/ui/event.rs b/ui-rs/src/ui/event.rs index a691e9a..2610d95 100644 --- a/ui-rs/src/ui/event.rs +++ b/ui-rs/src/ui/event.rs @@ -331,6 +331,17 @@ pub extern "C" fn untyped_event_wrapper(e: *const ffi::UiEvent, data: *mut c_voi } +pub struct SimpleEventWrapper { + pub callback: Box +} + +pub extern "C" fn simple_event_wrapper(_e: *const ffi::UiEvent, data: *mut c_void) { + unsafe { + let wrapper = &mut *(data as *mut SimpleEventWrapper); + (wrapper.callback)(); + } +} + pub struct SubListEvent { /// SubList index pub sublist_index: usize, diff --git a/ui-rs/src/ui/toolkit.rs b/ui-rs/src/ui/toolkit.rs index 5fc3452..1bae830 100644 --- a/ui-rs/src/ui/toolkit.rs +++ b/ui-rs/src/ui/toolkit.rs @@ -30,14 +30,14 @@ use std::any::Any; use std::ffi::{c_char, c_int, c_void, CStr, CString}; -use crate::ui::{action_event_wrapper, event, ffi, ui_object_get_context, ui_object_get_windowdata, ui_reg_destructor, ui_remove_destructor, untyped_event_wrapper, ActionEventWrapper, Event, EventWrapper, SubList, UntypedEventWrapper, RUST_TYPED_OBJECT_BOX_ANY}; +use crate::ui::{action_event_wrapper, event, ffi, simple_event_wrapper, ui_object_get_context, ui_object_get_windowdata, ui_reg_destructor, ui_remove_destructor, untyped_event_wrapper, ActionEventWrapper, Event, EventWrapper, SimpleEventWrapper, SubList, UntypedEventWrapper, RUST_TYPED_OBJECT_BOX_ANY}; use std::marker::PhantomData; use std::mem; use std::ptr::null_mut; use std::slice::{Iter, IterMut}; use std::sync::{Arc, Mutex}; -use crate::ui::ffi::{UiCallback, UiThreadFunc}; +use crate::ui::ffi::{UiCallback, UiEvent, UiThreadFunc}; pub struct UiContext { pub ptr: *mut ffi::UiContext @@ -86,6 +86,38 @@ impl UiContext { } } + pub fn onattach(&self, f: F) + where F: FnMut() + 'static { + let wrapper = Box::new(SimpleEventWrapper { callback: Box::new(f) }); + let ptr = self.reg_box(wrapper); + unsafe { + ui_onattach(self.ptr, Some(simple_event_wrapper), ptr as *mut c_void); + } + } + + pub fn ondetach(&self, f: F) + where F: FnMut() + 'static { + let wrapper = Box::new(SimpleEventWrapper { callback: Box::new(f) }); + let ptr = self.reg_box(wrapper); + unsafe { + ui_ondetach(self.ptr, Some(simple_event_wrapper), ptr as *mut c_void); + } + } + + pub fn onattach_action(&self, action: &str) { + let cstr = CString::new(action).unwrap(); + unsafe { + ui_onattach_action(self.ptr, cstr.as_ptr()); + } + } + + pub fn ondetach_action(&self, action: &str) { + let cstr = CString::new(action).unwrap(); + unsafe { + ui_ondetach_action(self.ptr, cstr.as_ptr()); + } + } + pub fn list(&self) -> UiList { let mut ls = UiList::::default(); ls.init(self, None); @@ -1254,6 +1286,10 @@ extern "C" { fn ui_document_context(doc: *mut c_void) -> *mut ffi::UiContext; fn ui_attach_document(ctx: *mut ffi::UiContext, doc: *mut c_void); fn ui_detach_document(ctx: *mut ffi::UiContext, doc: *mut c_void); + fn ui_onattach(ctx: *mut ffi::UiContext, callback: UiCallback, data: *mut c_void); + fn ui_ondetach(ctx: *mut ffi::UiContext, callback: UiCallback, data: *mut c_void); + fn ui_onattach_action(ctx: *mut ffi::UiContext, action: *const c_char); + fn ui_ondetach_action(ctx: *mut ffi::UiContext, action: *const c_char); fn ui_context_document(ctx: *mut ffi::UiContext) -> *mut c_void; fn ui_context_obj(ctx: *mut ffi::UiContext) -> *mut ffi::UiObject;