From a5399ece23117503abca8821a29d5a93cde02754 Mon Sep 17 00:00:00 2001 From: toppk Date: Fri, 27 Sep 2019 01:20:07 -0400 Subject: [PATCH] take fix that is upstream that fixes crash that occurs. this happened for me by using dash to dock. this seems to resolv the issue. --- ...-Cancel-delayed-timelines-on-removal.patch | 67 +++++++++++++++++++ ...t-emit-paused-signal-on-delayed-time.patch | 41 ++++++++++++ ...a-function-to-cancel-the-delay-timeo.patch | 58 ++++++++++++++++ mutter.spec | 10 ++- 4 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 clutter-actor-Cancel-delayed-timelines-on-removal.patch create mode 100644 clutter-timeline-Don-t-emit-paused-signal-on-delayed-time.patch create mode 100644 clutter-timeline-Use-a-function-to-cancel-the-delay-timeo.patch diff --git a/clutter-actor-Cancel-delayed-timelines-on-removal.patch b/clutter-actor-Cancel-delayed-timelines-on-removal.patch new file mode 100644 index 0000000..f857bf9 --- /dev/null +++ b/clutter-actor-Cancel-delayed-timelines-on-removal.patch @@ -0,0 +1,67 @@ +From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= +Date: Fri, 20 Sep 2019 16:21:00 +0200 +Subject: clutter/actor: Cancel delayed timelines on removal + +Delayed clutter timelines might be removed while they are still in the +process of being executed, but if they are not playing yet their delay +timeout won't be stopped, causing them to be executed anyway, leading to a +potential crash. + +In fact if something else keeps a reference on the timelines (i.e. gjs), the +dispose vfunc delay cancellation won't take effect, causing the timelines to +be started and added to the master clock. + +To avoid this, expose clutter_timeline_cancel_delay() function and call it +if a timeline is not playing but has a delay set. + +Fixes https://gitlab.gnome.org/GNOME/mutter/issues/815 +https://gitlab.gnome.org/GNOME/mutter/merge_requests/805 + +Origin: upstream, commit:c9c53cb55fd6e782c50f36da1e2adbf28111a660 +Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/eoan/+source/mutter/+bug/1841794 +Bug: https://gitlab.gnome.org/GNOME/mutter/issues/815 +--- + clutter/clutter/clutter-actor.c | 2 ++ + clutter/clutter/clutter-private.h | 2 ++ + clutter/clutter/clutter-timeline.c | 2 +- + 3 files changed, 5 insertions(+), 1 deletion(-) + +diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c +index 68c648f..b3e9946 100644 +--- a/clutter/clutter/clutter-actor.c ++++ b/clutter/clutter/clutter-actor.c +@@ -19498,6 +19498,8 @@ transition_closure_free (gpointer data) + + if (clutter_timeline_is_playing (timeline)) + clutter_timeline_stop (timeline); ++ else if (clutter_timeline_get_delay (timeline) > 0) ++ clutter_timeline_cancel_delay (timeline); + + /* remove the reference added in add_transition_internal() */ + g_object_unref (clos->transition); +diff --git a/clutter/clutter/clutter-private.h b/clutter/clutter/clutter-private.h +index a34cae4..d1da84c 100644 +--- a/clutter/clutter/clutter-private.h ++++ b/clutter/clutter/clutter-private.h +@@ -315,6 +315,8 @@ gboolean _clutter_run_progress_function (GType gtype, + gdouble progress, + GValue *retval); + ++void clutter_timeline_cancel_delay (ClutterTimeline *timeline); ++ + G_END_DECLS + + #endif /* __CLUTTER_PRIVATE_H__ */ +diff --git a/clutter/clutter/clutter-timeline.c b/clutter/clutter/clutter-timeline.c +index bb4f77f..88b76be 100644 +--- a/clutter/clutter/clutter-timeline.c ++++ b/clutter/clutter/clutter-timeline.c +@@ -424,7 +424,7 @@ clutter_timeline_set_custom_property (ClutterScriptable *scriptable, + g_object_set_property (G_OBJECT (scriptable), name, value); + } + +-static void ++void + clutter_timeline_cancel_delay (ClutterTimeline *timeline) + { + g_clear_handle_id (&timeline->priv->delay_id, g_source_remove); diff --git a/clutter-timeline-Don-t-emit-paused-signal-on-delayed-time.patch b/clutter-timeline-Don-t-emit-paused-signal-on-delayed-time.patch new file mode 100644 index 0000000..aa1cbbf --- /dev/null +++ b/clutter-timeline-Don-t-emit-paused-signal-on-delayed-time.patch @@ -0,0 +1,41 @@ +From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= +Date: Fri, 20 Sep 2019 16:28:22 +0200 +Subject: clutter/timeline: Don't emit ::paused signal on delayed timelines + +If a timeline is delayed and we request to stop or pause it, we are emitting +the "::paused" signal on it, however this has never been started, and so +nothing has really be paused. + +So, just try to cancel the delay on pause and return if not playing. + +No code in mutter or gnome-shell is affected by this, so it is safe to +change. + +https://gitlab.gnome.org/GNOME/mutter/merge_requests/805 + +Origin: upstream, commit:1e637bd7e1b2a4316d1cf6da80966d43819a10df +Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/eoan/+source/mutter/+bug/1841794 +Bug: https://gitlab.gnome.org/GNOME/mutter/issues/815 +--- + clutter/clutter/clutter-timeline.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/clutter/clutter/clutter-timeline.c b/clutter/clutter/clutter-timeline.c +index df7db16..bb4f77f 100644 +--- a/clutter/clutter/clutter-timeline.c ++++ b/clutter/clutter/clutter-timeline.c +@@ -1214,11 +1214,11 @@ clutter_timeline_pause (ClutterTimeline *timeline) + + priv = timeline->priv; + +- if (priv->delay_id == 0 && !priv->is_playing) +- return; +- + clutter_timeline_cancel_delay (timeline); + ++ if (!priv->is_playing) ++ return; ++ + priv->msecs_delta = 0; + set_is_playing (timeline, FALSE); + diff --git a/clutter-timeline-Use-a-function-to-cancel-the-delay-timeo.patch b/clutter-timeline-Use-a-function-to-cancel-the-delay-timeo.patch new file mode 100644 index 0000000..c4b6418 --- /dev/null +++ b/clutter-timeline-Use-a-function-to-cancel-the-delay-timeo.patch @@ -0,0 +1,58 @@ +From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= +Date: Fri, 20 Sep 2019 16:13:03 +0200 +Subject: clutter/timeline: Use a function to cancel the delay timeout + +Avoid repeating the same code for canceling the delay timeout, using a +function for later uses. + +https://gitlab.gnome.org/GNOME/mutter/merge_requests/805 + +Origin: upstream, commit:63a0b702c94af013b94ad3f32a8c5ba86bf6dfba +Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/eoan/+source/mutter/+bug/1841794 +Bug: https://gitlab.gnome.org/GNOME/mutter/issues/815 +--- + clutter/clutter/clutter-timeline.c | 17 +++++++---------- + 1 file changed, 7 insertions(+), 10 deletions(-) + +diff --git a/clutter/clutter/clutter-timeline.c b/clutter/clutter/clutter-timeline.c +index 0c026eb..df7db16 100644 +--- a/clutter/clutter/clutter-timeline.c ++++ b/clutter/clutter/clutter-timeline.c +@@ -424,6 +424,11 @@ clutter_timeline_set_custom_property (ClutterScriptable *scriptable, + g_object_set_property (G_OBJECT (scriptable), name, value); + } + ++static void ++clutter_timeline_cancel_delay (ClutterTimeline *timeline) ++{ ++ g_clear_handle_id (&timeline->priv->delay_id, g_source_remove); ++} + + static void + clutter_scriptable_iface_init (ClutterScriptableIface *iface) +@@ -550,11 +555,7 @@ clutter_timeline_dispose (GObject *object) + + priv = self->priv; + +- if (priv->delay_id) +- { +- g_source_remove (priv->delay_id); +- priv->delay_id = 0; +- } ++ clutter_timeline_cancel_delay (self); + + if (priv->progress_notify != NULL) + { +@@ -1216,11 +1217,7 @@ clutter_timeline_pause (ClutterTimeline *timeline) + if (priv->delay_id == 0 && !priv->is_playing) + return; + +- if (priv->delay_id) +- { +- g_source_remove (priv->delay_id); +- priv->delay_id = 0; +- } ++ clutter_timeline_cancel_delay (timeline); + + priv->msecs_delta = 0; + set_is_playing (timeline, FALSE); diff --git a/mutter.spec b/mutter.spec index 01a5699..484f2ef 100644 --- a/mutter.spec +++ b/mutter.spec @@ -8,7 +8,7 @@ Name: mutter Version: 3.34.0 -Release: 3%{?dist} +Release: 4%{?dist} Summary: Window and compositing manager based on Clutter License: GPLv2+ @@ -21,6 +21,10 @@ Patch0: 0001-window-actor-Special-case-shaped-Java-windows.patch # Fix xsettings/ibus-x11 initialization # https://gitlab.gnome.org/GNOME/mutter/merge_requests/792 Patch1: 792.patch +Patch2: clutter-timeline-Use-a-function-to-cancel-the-delay-timeo.patch +Patch3: clutter-timeline-Don-t-emit-paused-signal-on-delayed-time.patch +Patch4: clutter-actor-Cancel-delayed-timelines-on-removal.patch + BuildRequires: chrpath BuildRequires: pango-devel @@ -165,6 +169,10 @@ desktop-file-validate %{buildroot}/%{_datadir}/applications/%{name}.desktop %{_datadir}/mutter-%{mutter_api_version}/tests %changelog +* Thu Sep 27 2019 Kenneth Topp - 3.34.0-4 +- Backport a patch to prevent crash during animations +- See upstream issue https://gitlab.gnome.org/GNOME/mutter/issues/815 + * Thu Sep 12 2019 Kalev Lember - 3.34.0-3 - Update previous patch to final upstream version