]> uap-core.de Git - note.git/commitdiff
add ui Application trait and implement toolkit app callbacks
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 29 Mar 2026 12:35:43 +0000 (14:35 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 29 Mar 2026 12:35:43 +0000 (14:35 +0200)
application/src/main.rs
ui-rs/src/ui/application.rs [new file with mode: 0644]
ui-rs/src/ui/mod.rs
ui-rs/src/ui/toolkit.rs

index 655e634a77bc3ccdd86bd2e3bb6018404cb9fae3..2a8d14ea44bd08120b3c14a3e435fed007c72b49 100644 (file)
@@ -3,5 +3,14 @@ use ui_rs::ui;
 fn main() {
     ui::app_init(Default::default());
 
-    ui::app_main();
+    let mut app = App;
+    ui::app_run(&mut app);
+}
+
+struct App;
+
+impl ui::Application for App {
+    fn on_startup(&self) {
+
+    }
 }
diff --git a/ui-rs/src/ui/application.rs b/ui-rs/src/ui/application.rs
new file mode 100644 (file)
index 0000000..275b3b8
--- /dev/null
@@ -0,0 +1,50 @@
+#[allow(unused_imports)]
+
+use std::ffi::{c_char, c_int, c_void, CString};
+use crate::ui::ffi::{UiCallback, UiEvent};
+
+pub trait Application {
+    fn on_startup(&self);
+
+    fn on_exit(&self) { }
+}
+
+
+extern "C" {
+    fn ui_main();
+
+    fn ui_onstartup(callback: UiCallback, userdata: *mut c_void);
+    fn ui_onexit(callback: UiCallback, userdata: *mut c_void);
+}
+
+extern "C" fn app_startup(_event: *const UiEvent, data: *mut c_void) {
+    unsafe {
+        let app_ptr = data as *mut AppWrapper;
+        let app_ref: &mut AppWrapper = &mut *app_ptr;
+        app_ref.app.on_startup();
+    }
+}
+
+extern "C" fn app_exit(_event: *const UiEvent, data: *mut c_void) {
+    unsafe {
+        let app_ptr = data as *mut AppWrapper;
+        let app_ref: &mut AppWrapper = &mut *app_ptr;
+        app_ref.app.on_exit();
+    }
+}
+
+pub fn app_run(app: &mut dyn Application) {
+    let mut wrapper = AppWrapper { app: app };
+    unsafe {
+        let ptr: *mut AppWrapper = &mut wrapper;
+        let c_ptr: *mut c_void = ptr as *mut c_void;
+        ui_onstartup(Some(app_startup), c_ptr);
+        ui_onexit(Some(app_exit), c_ptr);
+        ui_main();
+    }
+}
+
+#[repr(C)]
+struct AppWrapper<'a> {
+    app: &'a mut dyn Application,
+}
\ No newline at end of file
index 353f0a87e696f5bd811a3e6da07b4c19e1ab69ac..03628f1dbe3f03b18901f38ac507dce123b43d79 100644 (file)
@@ -1,4 +1,6 @@
 mod ffi;
 mod toolkit;
+mod application;
 
-pub use toolkit::*;
\ No newline at end of file
+pub use toolkit::*;
+pub use application::*;
\ No newline at end of file
index 9a44bdac5bcdc7c91fc6745ded70a1ee0bd8bedc..f36d57cdd160aa1b701523cc4ac1a5b834acbf34 100644 (file)
@@ -1,35 +1,19 @@
 #![allow(dead_code)]
 
-use std::ffi::{c_char, c_int, c_void, CString};
-use super::ffi::*;
+use std::ffi::{c_char, c_int, CString};
 
 extern "C" {
     fn ui_init(appname: *const c_char, argc: c_int, argv: *const *const c_char);
-    fn ui_main();
-
-    fn ui_onstartup(callback: UiCallback, userdata: *mut c_void);
 }
 
 pub fn app_init(appname: &str) {
     unsafe {
         let c_str = if appname.len() > 0 {
-            let s = CString::new(appname).unwrap();
-            s.as_ptr()
-        } else {
-            std::ptr::null()
-        };
+                                    let s = CString::new(appname).unwrap();
+                                    s.as_ptr()
+                                } else {
+                                    std::ptr::null()
+                                };
         ui_init(c_str, 0, std::ptr::null());
     }
 }
-
-pub fn app_main() {
-    unsafe {
-        ui_main();
-    }
-}
-
-pub fn onstartup(callback: UiCallback) {
-    unsafe {
-        ui_onstartup(callback, std::ptr::null_mut());
-    }
-}