diff --git a/Cargo.toml b/Cargo.toml index f55a585..54dcde8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,19 @@ members = [ "crates/k-launcher-ui-egui", "crates/plugins/plugin-url", ] +default-members = [ + "crates/k-launcher", + "crates/k-launcher-config", + "crates/k-launcher-kernel", + "crates/k-launcher-os-bridge", + "crates/k-launcher-plugin-host", + "crates/k-launcher-ui", + "crates/plugins/plugin-apps", + "crates/plugins/plugin-calc", + "crates/plugins/plugin-cmd", + "crates/plugins/plugin-files", + "crates/plugins/plugin-url", +] resolver = "2" [workspace.dependencies] diff --git a/crates/k-launcher-ui/src/app.rs b/crates/k-launcher-ui/src/app.rs index 755a312..53f9de0 100644 --- a/crates/k-launcher-ui/src/app.rs +++ b/crates/k-launcher-ui/src/app.rs @@ -8,12 +8,21 @@ use iced::{ }; use k_launcher_config::AppearanceCfg; -use k_launcher_kernel::{AppLauncher, SearchEngine, SearchResult}; +use k_launcher_kernel::{AppLauncher, NullSearchEngine, SearchEngine, SearchResult}; use k_launcher_os_bridge::WindowConfig; static INPUT_ID: std::sync::LazyLock = std::sync::LazyLock::new(|| iced::widget::Id::new("search")); +#[derive(Clone)] +pub(crate) struct EngineHandle(Arc); + +impl std::fmt::Debug for EngineHandle { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str("EngineHandle") + } +} + fn rgba(c: &[f32; 4]) -> Color { Color::from_rgba8(c[0] as u8, c[1] as u8, c[2] as u8, c[3]) } @@ -53,6 +62,7 @@ pub enum Message { QueryChanged(String), ResultsReady(u64, Arc>), KeyPressed(KeyEvent), + EngineReady(EngineHandle), } fn update(state: &mut KLauncherApp, message: Message) -> Task { @@ -78,6 +88,14 @@ fn update(state: &mut KLauncherApp, message: Message) -> Task { } Task::none() } + Message::EngineReady(handle) => { + state.engine = handle.0; + if !state.query.is_empty() { + let q = state.query.clone(); + return Task::done(Message::QueryChanged(q)); + } + Task::none() + } Message::KeyPressed(event) => { let key = match event { KeyEvent::KeyPressed { key, .. } => key, @@ -254,7 +272,7 @@ fn subscription(_state: &KLauncherApp) -> Subscription { } pub fn run( - engine: Arc, + engine_factory: Arc Arc + Send + Sync>, launcher: Arc, window_cfg: &k_launcher_config::WindowCfg, appearance_cfg: AppearanceCfg, @@ -262,9 +280,18 @@ pub fn run( let wc = WindowConfig::from_cfg(window_cfg); iced::application( move || { - let app = KLauncherApp::new(engine.clone(), launcher.clone(), appearance_cfg.clone()); + let app = KLauncherApp::new( + Arc::new(NullSearchEngine), + launcher.clone(), + appearance_cfg.clone(), + ); let focus = iced::widget::operation::focus(INPUT_ID.clone()); - (app, focus) + let ef = engine_factory.clone(); + let init = Task::perform( + async move { tokio::task::spawn_blocking(move || ef()).await.unwrap() }, + |e| Message::EngineReady(EngineHandle(e)), + ); + (app, Task::batch([focus, init])) }, update, view, diff --git a/crates/k-launcher-ui/src/lib.rs b/crates/k-launcher-ui/src/lib.rs index febc564..4269f26 100644 --- a/crates/k-launcher-ui/src/lib.rs +++ b/crates/k-launcher-ui/src/lib.rs @@ -6,10 +6,10 @@ use k_launcher_config::{AppearanceCfg, WindowCfg}; use k_launcher_kernel::{AppLauncher, SearchEngine}; pub fn run( - engine: Arc, + engine_factory: Arc Arc + Send + Sync>, launcher: Arc, window_cfg: &WindowCfg, appearance_cfg: AppearanceCfg, ) -> iced::Result { - app::run(engine, launcher, window_cfg, appearance_cfg) + app::run(engine_factory, launcher, window_cfg, appearance_cfg) }