diff --git a/src/application.rs b/src/application.rs index 9ffb205..b9cdcd5 100644 --- a/src/application.rs +++ b/src/application.rs @@ -16,7 +16,7 @@ use crate::{ keyring, start as start_search_provider, Account, OTPUri, Provider, ProvidersModel, SearchProviderAction, FAVICONS_PATH, RUNTIME, SECRET_SERVICE, SETTINGS, }, - utils::spawn_tokio_blocking, + utils::{spawn, spawn_tokio_blocking}, widgets::{PreferencesWindow, ProvidersDialog, Window}, }; @@ -179,8 +179,7 @@ mod imp { }), ); - let ctx = glib::MainContext::default(); - ctx.spawn_local(clone!(@strong app => async move { + spawn(clone!(@strong app => async move { app.start_search_provider().await; })); } diff --git a/src/utils.rs b/src/utils.rs index 8db44cd..92fdec0 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -27,3 +27,13 @@ where }); receiver.await.unwrap() } + +pub fn spawn(fut: F) +where + F: std::future::Future + 'static, +{ + let ctx = gtk::glib::MainContext::default(); + ctx.spawn_local(async move { + fut.await; + }); +} diff --git a/src/widgets/preferences/password_page.rs b/src/widgets/preferences/password_page.rs index 1d1ec62..273aa8c 100644 --- a/src/widgets/preferences/password_page.rs +++ b/src/widgets/preferences/password_page.rs @@ -8,7 +8,12 @@ use gtk::{ subclass::prelude::*, }; -use crate::{config, models::keyring, utils::spawn_tokio, widgets::ErrorRevealer}; +use crate::{ + config, + models::keyring, + utils::{spawn, spawn_tokio}, + widgets::ErrorRevealer, +}; mod imp { use glib::subclass::InitializingObject; @@ -138,16 +143,14 @@ impl PasswordPage { let actions = self.actions(); let save_password = gio::ActionEntry::builder("save_password") .activate(clone!(@weak self as page => move |_, _, _| { - let ctx = glib::MainContext::default(); - ctx.spawn_local(clone!(@weak page => async move { + spawn(clone!(@weak page => async move { page.save().await; })); })) .build(); let reset_password = gio::ActionEntry::builder("reset_password") .activate(clone!(@weak self as page => move |_, _, _| { - let ctx = glib::MainContext::default(); - ctx.spawn_local(clone!(@weak page => async move { + spawn(clone!(@weak page => async move { page.reset_password().await; })); })) diff --git a/src/widgets/preferences/window.rs b/src/widgets/preferences/window.rs index 2e47ed4..e1e05b9 100644 --- a/src/widgets/preferences/window.rs +++ b/src/widgets/preferences/window.rs @@ -15,6 +15,7 @@ use crate::{ Operation, Restorable, RestorableItem, }, models::{ProvidersModel, SETTINGS}, + utils::spawn, widgets::screenshot, }; @@ -243,8 +244,7 @@ impl PreferencesWindow { let action = gio::ActionEntry::builder(T::IDENTIFIER) .activate(clone!(@weak self as win => move |_, _,_| { - let ctx = glib::MainContext::default(); - ctx.spawn_local(clone!(@weak win => async move { + spawn(clone!(@weak win => async move { if let Err(err) = win.backup_into_file::(filters).await { tracing::error!("Failed to backup into a file {err}"); win.add_toast(adw::Toast::new(&gettext("Failed to create a backup"))); @@ -360,8 +360,7 @@ impl PreferencesWindow { let camera_action = gio::ActionEntry::builder(&format!("{}.camera", T::IDENTIFIER)) .activate(clone!(@weak self as win=> move |_, _, _| { win.imp().actions.activate_action("show_camera_page", None); - let ctx = glib::MainContext::default(); - ctx.spawn_local(clone!(@weak win => async move { + spawn(clone!(@weak win => async move { if let Err(err) = win.restore_from_camera::().await { tracing::error!("Failed to restore from camera {err}"); win.add_toast(adw::Toast::new(&gettext("Failed to restore from camera"))); @@ -372,8 +371,7 @@ impl PreferencesWindow { let screenshot_action = gio::ActionEntry::builder(&format!("{}.screenshot", T::IDENTIFIER)) .activate(clone!(@weak self as win => move |_, _, _| { - let ctx = glib::MainContext::default(); - ctx.spawn_local(clone!(@weak win => async move { + spawn(clone!(@weak win => async move { if let Err(err) = win.restore_from_screenshot::().await { tracing::error!("Failed to restore from a screenshot {err}"); win.add_toast(adw::Toast::new(&gettext("Failed to restore from a screenshot"))); @@ -383,8 +381,7 @@ impl PreferencesWindow { .build(); let file_action = gio::ActionEntry::builder(&format!("{}.file", T::IDENTIFIER)) .activate(clone!(@weak self as win => move |_, _, _| { - let ctx = glib::MainContext::default(); - ctx.spawn_local(clone!(@weak win => async move { + spawn(clone!(@weak win => async move { if let Err(err) = win.restore_from_image::().await { tracing::error!("Failed to restore from an image {err}"); win.add_toast(adw::Toast::new(&gettext("Failed to restore from an image"))); @@ -397,8 +394,7 @@ impl PreferencesWindow { } else { let action = gio::ActionEntry::builder(T::IDENTIFIER) .activate(clone!(@weak self as win => move |_, _, _| { - let ctx = glib::MainContext::default(); - ctx.spawn_local(clone!(@weak win => async move { + spawn(clone!(@weak win => async move { if let Err(err) = win.restore_from_file::(filters).await { tracing::error!("Failed to restore from a file {err}"); win.add_toast(adw::Toast::new(&gettext("Failed to restore from a file"))); diff --git a/src/widgets/providers/image.rs b/src/widgets/providers/image.rs index 078acc5..c8ffccf 100644 --- a/src/widgets/providers/image.rs +++ b/src/widgets/providers/image.rs @@ -5,7 +5,10 @@ use gtk::{ subclass::prelude::*, }; -use crate::models::{Provider, FAVICONS_PATH, RUNTIME, SETTINGS}; +use crate::{ + models::{Provider, FAVICONS_PATH, RUNTIME, SETTINGS}, + utils::spawn, +}; pub enum ImageAction { Ready(String), @@ -194,7 +197,7 @@ impl ProviderImage { let join_handle = RUNTIME.spawn(future); imp.join_handle.borrow_mut().replace(join_handle); - glib::MainContext::default().spawn_local(clone!(@weak self as this => async move { + spawn(clone!(@weak self as this => async move { let imp = this.imp(); imp.was_downloaded.set(true); match receiver.await { diff --git a/src/widgets/url_row.rs b/src/widgets/url_row.rs index 77c1267..b77d718 100644 --- a/src/widgets/url_row.rs +++ b/src/widgets/url_row.rs @@ -10,6 +10,7 @@ mod imp { use adw::subclass::prelude::*; use super::*; + use crate::utils::spawn; #[derive(Default, glib::Properties)] #[properties(wrapper_type = super::UrlRow)] @@ -44,8 +45,7 @@ mod imp { let gesture = gtk::GestureClick::new(); gesture.connect_pressed(clone!(@weak obj as row => move |_,_,_,_| { if let Some(uri) = row.imp().uri.borrow().clone() { - let ctx = glib::MainContext::default(); - ctx.spawn_local(async move { + spawn(async move { let file = gio::File::for_uri(&uri); let launcher = gtk::FileLauncher::new(Some(&file)); if let Err(err) = launcher.launch_future(gtk::Window::NONE).await {