]> uap-core.de Git - note.git/commitdiff
add UiObject/UiDoc specific call_mainthread method, that gets a data reference
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Fri, 15 May 2026 17:34:13 +0000 (19:34 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Fri, 15 May 2026 17:34:13 +0000 (19:34 +0200)
application/src/main.rs
ui-rs/src/ui/toolkit.rs

index fe0c235d23780061536ea5d034a34fc6dee03506..1f2f184c2648d787ae95b2f4bddc02083052871b 100644 (file)
@@ -30,7 +30,6 @@ mod window;
 mod backend;
 
 use std::env;
-use tokio::sync::mpsc;
 use ui_rs::{ui};
 use ui_rs::ui::*;
 use crate::backend::{Backend, BackendHandle, DynCmd};
index 48e26f3edc692290450dd6c947371e09c0706ca7..64d518ac369287deba6c28318976d1433e320926 100644 (file)
@@ -174,6 +174,38 @@ impl<T: UiModel + UiActions> UiDoc<T> {
             ui_add_action(self.ctx.ptr, cstr.as_ptr(), Some(action_event_wrapper::<T>), ptr as *mut c_void);
         }
     }
+
+    pub fn call_mainthread<F>(&self, mut f: F)
+    where F: FnMut(&mut T) + 'static {
+        let doc = self.clone();
+        call_mainthread(move || {
+            let data = unsafe { doc.get_data_ptr() };
+            unsafe {
+                f(&mut *data);
+            }
+        });
+    }
+}
+
+impl<T> UiObject<T> {
+    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);
+        }
+    }
+
+    pub fn call_mainthread<F>(&self, mut f: F)
+    where F: FnMut(&mut T) + 'static {
+        let obj = self.clone();
+        call_mainthread(move || {
+            obj.window_data(|wdata| {
+                f(wdata);
+            });
+        });
+    }
 }
 
 pub trait UiModel {
@@ -687,6 +719,29 @@ pub unsafe fn ui_list_get<'a, T>(list: *const ffi::UiList, index: usize) -> Opti
 }
 
 
+/* ----------------------------------- Event Loop ---------------------------------- */
+
+pub fn call_mainthread<F>(f: F)
+where F: FnOnce() {
+    let b = Box::new(f);
+    let ptr = Box::into_raw(b);
+    unsafe {
+        ui_call_mainthread(mainthread_callback::<F>, ptr as *mut c_void);
+    }
+}
+
+extern "C" fn mainthread_callback<F>(data: *mut c_void) -> c_int
+where F: FnOnce() {
+    unsafe {
+        // Reconstruct the Box<F>
+        let callback: Box<F> = Box::from_raw(data as *mut F);
+
+        (*callback)();
+    }
+
+    0
+}
+
 /* ----------------------------------- Config ---------------------------------- */
 
 pub fn app_configdir() -> String {
@@ -721,27 +776,6 @@ pub fn app_set_configdir(path: &str) {
     }
 }
 
-pub fn call_mainthread<F>(f: F)
-where F: FnOnce() {
-    let b = Box::new(f);
-    let ptr = Box::into_raw(b);
-    unsafe {
-        ui_call_mainthread(mainthread_callback::<F>, ptr as *mut c_void);
-    }
-}
-
-extern "C" fn mainthread_callback<F>(data: *mut c_void) -> c_int
-where F: FnOnce() {
-    unsafe {
-        // Reconstruct the Box<F>
-        let callback: Box<F> = Box::from_raw(data as *mut F);
-
-        (*callback)();
-    }
-
-    0
-}
-
 /* -------------------------------- C functions -------------------------------- */
 
 extern "C" {