From a63c3443e7345bb7a95c4fcff26e4fef1552c0c2 Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Sat, 28 Mar 2026 18:38:22 +0100 Subject: [PATCH] add Rust toolkit initialization code --- application/build.rs | 30 -------------------------- application/src/main.rs | 3 +++ ui-rs/build.rs | 33 ++++++++++++++++++++++++++++- ui-rs/src/lib.rs | 1 + ui-rs/src/ui/ffi.rs | 47 +++++++++++++++++++++++++++++++++++++++++ ui-rs/src/ui/mod.rs | 4 ++++ ui-rs/src/ui/toolkit.rs | 35 ++++++++++++++++++++++++++++++ 7 files changed, 122 insertions(+), 31 deletions(-) create mode 100644 ui-rs/src/ui/ffi.rs create mode 100644 ui-rs/src/ui/mod.rs create mode 100644 ui-rs/src/ui/toolkit.rs diff --git a/application/build.rs b/application/build.rs index 55af0b4..2a778e4 100644 --- a/application/build.rs +++ b/application/build.rs @@ -1,33 +1,3 @@ -use std::path::Path; -use std::fs; - fn main() { - let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap(); - let lib_dir = Path::new(&manifest_dir).join("../build/lib"); - let config_mk = Path::new(&manifest_dir).join("../config.mk"); - - println!("cargo:rustc-link-search=native={}", lib_dir.display()); - println!("cargo:rustc-link-lib=static=uitk"); - println!("cargo:rustc-link-lib=static=ucx"); - let content = fs::read_to_string(&config_mk) - .expect(&format!("Failed to read {}", config_mk.display())); - for line in content.lines() { - if line.starts_with("TK_LDFLAGS") { - let parts: Vec<&str> = line.split_whitespace().collect(); - for token in &parts[2..] { - if let Some(lib) = token.strip_prefix("-l") { - println!("cargo:rustc-link-lib={}", lib); - } else if token.starts_with("-L") { - let path = &token[2..]; - println!("cargo:rustc-link-search=native={}", path); - } else if token.starts_with("-R") { - let path = &token[2..]; - println!("cargo:rustc-link-arg=-Wl,-rpath,{}", path); - } else { - println!("cargo:rustc-link-arg={}", token); - } - } - } - } } diff --git a/application/src/main.rs b/application/src/main.rs index 3033f62..655e634 100644 --- a/application/src/main.rs +++ b/application/src/main.rs @@ -1,4 +1,7 @@ +use ui_rs::ui; fn main() { + ui::app_init(Default::default()); + ui::app_main(); } diff --git a/ui-rs/build.rs b/ui-rs/build.rs index cf74f49..a760840 100644 --- a/ui-rs/build.rs +++ b/ui-rs/build.rs @@ -1,3 +1,34 @@ +use std::path::Path; +use std::fs; + fn main() { + let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap(); + let lib_dir = Path::new(&manifest_dir).join("../build/lib"); + let config_mk = Path::new(&manifest_dir).join("../config.mk"); + + println!("cargo:rustc-link-search=native={}", lib_dir.display()); + println!("cargo:rustc-link-lib=static=uitk"); + println!("cargo:rustc-link-lib=static=ucx"); -} \ No newline at end of file + // read the toolkit linker flags from the config.mk file + let content = fs::read_to_string(&config_mk) + .expect(&format!("Failed to read {}", config_mk.display())); + for line in content.lines() { + if line.starts_with("TK_LDFLAGS += ") || line.starts_with("TK_LDFLAGS = ") { + let parts: Vec<&str> = line.split_whitespace().collect(); + for token in &parts[2..] { + if let Some(lib) = token.strip_prefix("-l") { + println!("cargo:rustc-link-lib={}", lib); + } else if token.starts_with("-L") { + let path = &token[2..]; + println!("cargo:rustc-link-search=native={}", path); + } else if token.starts_with("-R") { + let path = &token[2..]; + println!("cargo:rustc-link-arg=-Wl,-rpath,{}", path); + } else { + println!("cargo:rustc-link-arg={}", token); + } + } + } + } +} diff --git a/ui-rs/src/lib.rs b/ui-rs/src/lib.rs index e69de29..6bae95d 100644 --- a/ui-rs/src/lib.rs +++ b/ui-rs/src/lib.rs @@ -0,0 +1 @@ +pub mod ui; diff --git a/ui-rs/src/ui/ffi.rs b/ui-rs/src/ui/ffi.rs new file mode 100644 index 0000000..c4a27a8 --- /dev/null +++ b/ui-rs/src/ui/ffi.rs @@ -0,0 +1,47 @@ +#![allow(dead_code)] + +use std::ffi::c_void; + + +#[repr(C)] +pub struct UiContext { + _private: [u8; 0], +} + +#[repr(C)] +pub struct UiObject { + _private: [u8; 0], +} + +#[repr(C)] +pub struct UiEvent { + _private: [u8; 0], +} + +#[repr(C)] +pub struct UiString { + _private: [u8; 0], +} + +#[repr(C)] +pub struct UiInteger { + _private: [u8; 0], +} + +#[repr(C)] +pub struct UiDouble { + _private: [u8; 0], +} + +#[repr(C)] +pub struct UiRange { + _private: [u8; 0], +} + +#[repr(C)] +pub struct UiList { + _private: [u8; 0], +} + +pub type UiCallback = Option; + diff --git a/ui-rs/src/ui/mod.rs b/ui-rs/src/ui/mod.rs new file mode 100644 index 0000000..353f0a8 --- /dev/null +++ b/ui-rs/src/ui/mod.rs @@ -0,0 +1,4 @@ +mod ffi; +mod toolkit; + +pub use toolkit::*; \ No newline at end of file diff --git a/ui-rs/src/ui/toolkit.rs b/ui-rs/src/ui/toolkit.rs new file mode 100644 index 0000000..9a44bda --- /dev/null +++ b/ui-rs/src/ui/toolkit.rs @@ -0,0 +1,35 @@ +#![allow(dead_code)] + +use std::ffi::{c_char, c_int, c_void, CString}; +use super::ffi::*; + +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() + }; + 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()); + } +} -- 2.47.3