utils: Add a spawn helper

This commit is contained in:
Bilal Elmoussaoui 2023-04-11 22:51:55 +02:00
parent be3e550565
commit f652ef0e31
6 changed files with 33 additions and 22 deletions

View file

@ -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;
}));
}

View file

@ -27,3 +27,13 @@ where
});
receiver.await.unwrap()
}
pub fn spawn<F>(fut: F)
where
F: std::future::Future + 'static,
{
let ctx = gtk::glib::MainContext::default();
ctx.spawn_local(async move {
fut.await;
});
}

View file

@ -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;
}));
}))

View file

@ -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::<T>(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::<T, T::Item>().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::<T, T::Item>().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::<T, T::Item>().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::<T, T::Item>(filters).await {
tracing::error!("Failed to restore from a file {err}");
win.add_toast(adw::Toast::new(&gettext("Failed to restore from a file")));

View file

@ -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 {

View file

@ -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 {