diff --git a/podcasts-gtk/src/widgets/appnotif.rs b/podcasts-gtk/src/widgets/appnotif.rs index e896763..603869a 100644 --- a/podcasts-gtk/src/widgets/appnotif.rs +++ b/podcasts-gtk/src/widgets/appnotif.rs @@ -18,6 +18,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later use glib; +use glib::clone; use gtk; use gtk::prelude::*; @@ -82,21 +83,17 @@ impl InAppNotification { let notif = InAppNotification::default(); notif.text.set_text(&text); - let revealer_weak = notif.revealer.downgrade(); let mut time = 0; - let id = timeout_add(250, move || { - if time < timer { - time += 250; - return glib::Continue(true); - }; - - let revealer = match revealer_weak.upgrade() { - Some(r) => r, - None => return glib::Continue(false), - }; - - callback(revealer) - }); + let id = timeout_add( + 250, + clone!(@weak notif.revealer as revealer => @default-return glib::Continue(false), move || { + if time < timer { + time += 250; + return glib::Continue(true); + }; + callback(revealer) + }), + ); let id = Rc::new(RefCell::new(Some(id))); if undo_callback.is_some() { diff --git a/podcasts-gtk/src/widgets/home_view.rs b/podcasts-gtk/src/widgets/home_view.rs index a51b10d..219a41b 100644 --- a/podcasts-gtk/src/widgets/home_view.rs +++ b/podcasts-gtk/src/widgets/home_view.rs @@ -22,6 +22,8 @@ use failure::Error; use gtk::{self, prelude::*, Adjustment}; +use glib::clone; + use crossbeam_channel::Sender; use libhandy::{Column, ColumnExt}; use podcasts_data::dbqueries; @@ -135,17 +137,11 @@ impl HomeView { } }; - let home_weak = Rc::downgrade(&home); - let callback = move || { - let home = match home_weak.upgrade() { - Some(h) => h, - None => return, - }; - + let callback = clone!(@weak home => move || { if let Some(ref v) = vadj { home.view.set_adjustments(None, Some(v)) }; - }; + }); lazy_load_full(episodes, func, callback); home.view.container().show_all(); diff --git a/podcasts-gtk/src/widgets/shows_view.rs b/podcasts-gtk/src/widgets/shows_view.rs index 868ef81..8b7731c 100644 --- a/podcasts-gtk/src/widgets/shows_view.rs +++ b/podcasts-gtk/src/widgets/shows_view.rs @@ -17,6 +17,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later +use glib::clone; use gtk::{self, prelude::*, Adjustment, Align, SelectionMode}; use crossbeam_channel::Sender; @@ -83,16 +84,14 @@ impl ShowsView { fn populate_flowbox(shows: &Rc, vadj: Option) -> Result<(), Error> { let ignore = get_ignored_shows()?; let podcasts = dbqueries::get_podcasts_filter(&ignore)?; - let show_weak = Rc::downgrade(&shows); let flowbox_weak = shows.flowbox.downgrade(); let constructor = move |parent| ShowsChild::new(&parent).child; - let callback = move || { - match (show_weak.upgrade(), &vadj) { - (Some(ref shows), Some(ref v)) => shows.view.set_adjustments(None, Some(v)), - _ => (), - }; - }; + let callback = clone!(@weak shows => move || { + if vadj.is_some() { + shows.view.set_adjustments(None, vadj.as_ref()) + } + }); lazy_load(podcasts, flowbox_weak, constructor, callback); Ok(())