diff options
Diffstat (limited to 'crates/flasher-qt/src/main.rs')
| -rw-r--r-- | crates/flasher-qt/src/main.rs | 50 |
1 files changed, 36 insertions, 14 deletions
diff --git a/crates/flasher-qt/src/main.rs b/crates/flasher-qt/src/main.rs index f131bc5..e304418 100644 --- a/crates/flasher-qt/src/main.rs +++ b/crates/flasher-qt/src/main.rs @@ -1,21 +1,43 @@ -use qmetaobject::{QmlEngine, QString, QVariant}; -use std::fs; +use std::{ + env, + ffi::CString, + fs, + os::raw::{c_char, c_int}, +}; const BOARDS: &str = include_str!("../../../alt-rootfs-installer/SUPPORTED-BOARDS"); -const QML: &str = include_str!("../qml/Main.qml"); + +unsafe extern "C" { + fn run_qt_app( + argc: c_int, + argv: *mut *mut c_char, + boards: *const c_char, + drives: *const c_char, + ) -> c_int; +} fn main() { - let mut engine = QmlEngine::new(); - engine.set_property( - QString::from("supportedBoardsText"), - QVariant::from(QString::from(BOARDS)), - ); - engine.set_property( - QString::from("availableDrivesText"), - QVariant::from(QString::from(available_drives().join("\n"))), - ); - engine.load_data(QML.into()); - engine.exec(); + let arguments: Vec<CString> = env::args() + .map(|arg| CString::new(arg).expect("application argument contains a NUL byte")) + .collect(); + let mut argument_pointers: Vec<*mut c_char> = arguments + .iter() + .map(|arg| arg.as_ptr().cast_mut()) + .collect(); + let boards = CString::new(BOARDS).expect("board list contains a NUL byte"); + let drives = CString::new(available_drives().join("\n")) + .expect("drive description contains a NUL byte"); + + // QApplication only borrows argv and the two strings for the duration of + // this call; all backing CStrings remain alive until the event loop exits. + unsafe { + run_qt_app( + argument_pointers.len() as c_int, + argument_pointers.as_mut_ptr(), + boards.as_ptr(), + drives.as_ptr(), + ); + } } fn available_drives() -> Vec<String> { |