diff --git a/examples/launcher/main.rs b/examples/launcher/main.rs index 4650755..e4c3fdc 100644 --- a/examples/launcher/main.rs +++ b/examples/launcher/main.rs @@ -8,8 +8,7 @@ use gtk::Application; use gtk4 as gtk; use gtk4::CssProvider; use gtk4::StyleContext; -use once_cell::sync::Lazy; -use std::sync::Mutex; +use once_cell::sync::OnceCell; use gtk::gio; use gtk::glib; @@ -22,7 +21,7 @@ use self::application_object::ApplicationObject; use self::window::Window; const NUM_LAUNCHER_ITEMS: u8 = 10; -static TX: Lazy>>> = Lazy::new(|| Mutex::new(None)); +static TX: OnceCell> = OnceCell::new(); fn icon_source(icon: >k::Image, source: &Option) { match source { @@ -93,51 +92,51 @@ fn main() { app.connect_activate(move |app| { let (tx, mut rx) = postage::mpsc::channel(1); let mut launcher = spawn_launcher(tx.clone()); - { - let mut global_tx = TX.lock().unwrap(); - *global_tx = Some(tx.clone()); - } + if TX.set(tx).is_err() { + println!("failed to set global Sender. Exiting"); + std::process::exit(1); + }; - let window = Window::new(app); - let wclone = window.clone(); - window.show(); + let window = Window::new(app); + let wclone = window.clone(); + window.show(); - glib::MainContext::default().spawn_local(async move { - while let Some(event) = rx.recv().await { - match event { - Event::Search(search) => { - let _ = launcher.send(pop_launcher::Request::Search(search)).await; - } - Event::Activate(index) => { - let _ = launcher.send(pop_launcher::Request::Activate(index)).await; - } + glib::MainContext::default().spawn_local(async move { + while let Some(event) = rx.recv().await { + match event { + Event::Search(search) => { + let _ = launcher.send(pop_launcher::Request::Search(search)).await; + } + Event::Activate(index) => { + let _ = launcher.send(pop_launcher::Request::Activate(index)).await; + } - Event::Response(event) => { - if let pop_launcher::Response::Update(results) = event { - let model = window.model(); - let model_len = model.n_items(); - dbg!(&results); - let new_results: Vec = results - [0..std::cmp::min(results.len(), NUM_LAUNCHER_ITEMS.into())] - .iter() - .map(|result| ApplicationObject::new(result).upcast()) - .collect(); - model.splice(0, model_len, &new_results[..]); - } else if let pop_launcher::Response::DesktopEntry { - path, - gpu_preference: _gpu_preference, // TODO use GPU preference when launching app - } = event - { - let app_info = - DesktopAppInfo::new(&path.file_name().expect("desktop entry path needs to be a valid filename").to_string_lossy()) - .expect("failed to create a Desktop App info for launching the application."); - app_info - .launch(&[], Some(&wclone.display().app_launch_context().clone())).expect("failed to launch the application."); - } - } - } - } - }) + Event::Response(event) => { + if let pop_launcher::Response::Update(results) = event { + let model = window.model(); + let model_len = model.n_items(); + dbg!(&results); + let new_results: Vec = results + [0..std::cmp::min(results.len(), NUM_LAUNCHER_ITEMS.into())] + .iter() + .map(|result| ApplicationObject::new(result).upcast()) + .collect(); + model.splice(0, model_len, &new_results[..]); + } else if let pop_launcher::Response::DesktopEntry { + path, + gpu_preference: _gpu_preference, // TODO use GPU preference when launching app + } = event + { + let app_info = + DesktopAppInfo::new(&path.file_name().expect("desktop entry path needs to be a valid filename").to_string_lossy()) + .expect("failed to create a Desktop App info for launching the application."); + app_info + .launch(&[], Some(&wclone.display().app_launch_context().clone())).expect("failed to launch the application."); + } + } + } + } + }) }); app.run(); diff --git a/examples/launcher/window/mod.rs b/examples/launcher/window/mod.rs index 97d8f7b..d2492e3 100644 --- a/examples/launcher/window/mod.rs +++ b/examples/launcher/window/mod.rs @@ -69,10 +69,10 @@ impl Window { let id = id.get::().expect("App ID must be u32"); glib::MainContext::default().spawn_local(async move { - if let Ok(tx) = TX.lock() { - if let Some(tx) = &*tx { - let _ = tx.clone().send(crate::Event::Activate(id)).await; - }} + if let Some(tx) = TX.get() { + let mut tx = tx.clone(); + let _ = tx.send(crate::Event::Activate(id)).await; + } }); } })); @@ -89,10 +89,9 @@ impl Window { let id = id.get::().expect("App ID must be u32"); glib::MainContext::default().spawn_local(async move { - if let Ok(tx) = TX.lock() { - if let Some(tx) = &*tx { - let _ = tx.clone().send(crate::Event::Activate(id)).await; - } + if let Some(tx) = TX.get() { + let mut tx = tx.clone(); + let _ = tx.send(crate::Event::Activate(id)).await; } }); } @@ -102,10 +101,9 @@ impl Window { let search = search.text().to_string(); glib::MainContext::default().spawn_local(async move { - if let Ok(tx) = TX.lock() { - if let Some(tx) = &*tx { - let _ = tx.clone().send(crate::Event::Search(search)).await; - } + if let Some(tx) = TX.get() { + let mut tx = tx.clone(); + let _ = tx.send(crate::Event::Search(search)).await; } }); }); @@ -114,10 +112,9 @@ impl Window { let search = search.text().to_string(); glib::MainContext::default().spawn_local(async move { - if let Ok(tx) = TX.lock() { - if let Some(tx) = &*tx { - let _ = tx.clone().send(crate::Event::Search(search)).await; - } + if let Some(tx) = TX.get() { + let mut tx = tx.clone(); + let _ = tx.send(crate::Event::Search(search)).await; } }); });