]> uap-core.de Git - note.git/commitdiff
add Rust toolkit initialization code
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 28 Mar 2026 17:38:22 +0000 (18:38 +0100)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 28 Mar 2026 17:38:22 +0000 (18:38 +0100)
application/build.rs
application/src/main.rs
ui-rs/build.rs
ui-rs/src/lib.rs
ui-rs/src/ui/ffi.rs [new file with mode: 0644]
ui-rs/src/ui/mod.rs [new file with mode: 0644]
ui-rs/src/ui/toolkit.rs [new file with mode: 0644]

index 55af0b4bf074e147eafea821dbf519479a1647d7..2a778e4ea1a6da84b97a12ecdfdcda22d1a11627 100644 (file)
@@ -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);
-                }
-            }
-        }
-    }
 }
index 3033f62664ff43a46745497bd2904d97919bfb84..655e634a77bc3ccdd86bd2e3bb6018404cb9fae3 100644 (file)
@@ -1,4 +1,7 @@
+use ui_rs::ui;
 
 fn main() {
+    ui::app_init(Default::default());
 
+    ui::app_main();
 }
index cf74f49f1b8a061d2517b8456ff1bb1dc5102fe9..a7608402b45c7df6d895a0317156d1397008ed38 100644 (file)
@@ -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);
+                }
+            }
+        }
+    }
+}
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6bae95df97a86ba99733b3ac0a40af71a8bdfa8b 100644 (file)
@@ -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 (file)
index 0000000..c4a27a8
--- /dev/null
@@ -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<extern "C" fn(event: *const UiEvent, *mut c_void)>;
+
diff --git a/ui-rs/src/ui/mod.rs b/ui-rs/src/ui/mod.rs
new file mode 100644 (file)
index 0000000..353f0a8
--- /dev/null
@@ -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 (file)
index 0000000..9a44bda
--- /dev/null
@@ -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());
+    }
+}