From aac4c3aef4fa7dd42b3464be86d26debad66d7c1 Mon Sep 17 00:00:00 2001 From: elkowar <5300871+elkowar@users.noreply.github.com> Date: Wed, 27 Jul 2022 18:49:58 +0200 Subject: [PATCH] hotfix: fix panic because of deallocated GTK widget being called in handler (fixes #478) --- crates/eww/src/widgets/def_widget_macro.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/eww/src/widgets/def_widget_macro.rs b/crates/eww/src/widgets/def_widget_macro.rs index 8fa8bc3..cf46f75 100644 --- a/crates/eww/src/widgets/def_widget_macro.rs +++ b/crates/eww/src/widgets/def_widget_macro.rs @@ -43,9 +43,13 @@ macro_rules! def_widget { crate::state::scope::Listener { needed_variables: required_vars, f: Box::new({ + // create a weak reference to the widget, such that this listener doesn't prevent the actual widget from + // getting deallocated (garbage collected by the gtk runtime) let $gtk_widget = gdk::glib::clone::Downgrade::downgrade(&$gtk_widget); move |$scope_graph, values| { - let $gtk_widget = gdk::glib::clone::Upgrade::upgrade(&$gtk_widget).unwrap(); + // TODO when this fails, shouldn't we technically remove the listener somehow? Need to analyze when exactly this happens. + let $gtk_widget = gdk::glib::clone::Upgrade::upgrade(&$gtk_widget) + .context("Couldn't upgrade reference, widget got deallocated")?; // values is a map of all the variables that are required to evaluate the // attributes expression.