From: Olaf Wintermann Date: Sun, 29 Mar 2026 12:35:43 +0000 (+0200) Subject: add ui Application trait and implement toolkit app callbacks X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=37a5fb189c094e9b41c58db959ddda1935eea198;p=note.git add ui Application trait and implement toolkit app callbacks --- diff --git a/application/src/main.rs b/application/src/main.rs index 655e634..2a8d14e 100644 --- a/application/src/main.rs +++ b/application/src/main.rs @@ -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 index 0000000..275b3b8 --- /dev/null +++ b/ui-rs/src/ui/application.rs @@ -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 diff --git a/ui-rs/src/ui/mod.rs b/ui-rs/src/ui/mod.rs index 353f0a8..03628f1 100644 --- a/ui-rs/src/ui/mod.rs +++ b/ui-rs/src/ui/mod.rs @@ -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 diff --git a/ui-rs/src/ui/toolkit.rs b/ui-rs/src/ui/toolkit.rs index 9a44bda..f36d57c 100644 --- a/ui-rs/src/ui/toolkit.rs +++ b/ui-rs/src/ui/toolkit.rs @@ -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()); - } -}