From f61bc5feac904d58abab9aa462661c8f302de471ab758ce2b18aa416da22d5eb Mon Sep 17 00:00:00 2001 From: Vincent Untz Date: Mon, 12 Oct 2009 14:45:21 +0000 Subject: [PATCH] Accepting request 22239 from home:vuntz:branches:GNOME:Factory Copy from home:vuntz:branches:GNOME:Factory/gnome-shell via accept of submit request 22239 revision 2. Request was accepted with message: Forwarding to openSUSE:Factory OBS-URL: https://build.opensuse.org/request/show/22239 OBS-URL: https://build.opensuse.org/package/show/GNOME:Factory/gnome-shell?expand=0&rev=19 --- gnome-shell-leak.patch | 173 +++++++++++++++++++++++++++++++++++++++++ gnome-shell.changes | 6 ++ gnome-shell.spec | 3 + 3 files changed, 182 insertions(+) create mode 100644 gnome-shell-leak.patch diff --git a/gnome-shell-leak.patch b/gnome-shell-leak.patch new file mode 100644 index 0000000..33dfa8a --- /dev/null +++ b/gnome-shell-leak.patch @@ -0,0 +1,173 @@ +commit ab0460ad5926aef2cb802f201069109ce9fc2dd8 +Author: Colin Walters +Date: Thu Oct 8 14:53:46 2009 -0400 + + Use clutter_actor_destroy in dispose, add _dispose where needed + + ClutterGroup calls _destroy, but most of St was just calling _unparent. + This caused problems because the DESTROY signal was not emitted + for child elements after destroying a toplevel. Also, in a GC'd + binding it would cause unpredictable lifetime of children. + + Some St widgets simply didn't have _dispose at all; implement it. + + Note because of the usage of the background_image in StButton, + we can't cleanly destroy it inside the StWidget. + + https://bugzilla.gnome.org/show_bug.cgi?id=597845 + +diff --git a/src/st/st-bin.c b/src/st/st-bin.c +index ed00e63..4c862b6 100644 +--- a/src/st/st-bin.c ++++ b/src/st/st-bin.c +@@ -352,10 +352,8 @@ st_bin_dispose (GObject *gobject) + StBinPrivate *priv = ST_BIN (gobject)->priv; + + if (priv->child) +- { +- clutter_actor_unparent (priv->child); +- priv->child = NULL; +- } ++ clutter_actor_destroy (priv->child); ++ g_assert (priv->child == NULL); + + G_OBJECT_CLASS (st_bin_parent_class)->dispose (gobject); + } +diff --git a/src/st/st-box-layout.c b/src/st/st-box-layout.c +index b87b072..e81f64c 100644 +--- a/src/st/st-box-layout.c ++++ b/src/st/st-box-layout.c +@@ -403,11 +403,7 @@ st_box_layout_dispose (GObject *object) + StBoxLayoutPrivate *priv = ST_BOX_LAYOUT (object)->priv; + + while (priv->children) +- { +- clutter_actor_unparent (CLUTTER_ACTOR (priv->children->data)); +- +- priv->children = g_list_delete_link (priv->children, priv->children); +- } ++ clutter_actor_destroy (priv->children->data); + + if (priv->hadjustment) + { +diff --git a/src/st/st-entry.c b/src/st/st-entry.c +index 450f4cc..ac79f4e 100644 +--- a/src/st/st-entry.c ++++ b/src/st/st-entry.c +@@ -162,7 +162,7 @@ st_entry_dispose (GObject *object) + + if (priv->entry) + { +- clutter_actor_unparent (priv->entry); ++ clutter_actor_destroy (priv->entry); + priv->entry = NULL; + } + } +diff --git a/src/st/st-label.c b/src/st/st-label.c +index 88fa868..db9b0c1 100644 +--- a/src/st/st-label.c ++++ b/src/st/st-label.c +@@ -184,6 +184,20 @@ st_label_allocate (ClutterActor *actor, + } + + static void ++st_label_dispose (GObject *actor) ++{ ++ StLabelPrivate *priv = ST_LABEL (actor)->priv; ++ ++ if (priv->label) ++ { ++ clutter_actor_destroy (priv->label); ++ priv->label = NULL; ++ } ++ ++ G_OBJECT_CLASS (st_label_parent_class)->dispose (G_OBJECT (actor)); ++} ++ ++static void + st_label_paint (ClutterActor *actor) + { + StLabelPrivate *priv = ST_LABEL (actor)->priv; +@@ -227,6 +241,7 @@ st_label_class_init (StLabelClass *klass) + + gobject_class->set_property = st_label_set_property; + gobject_class->get_property = st_label_get_property; ++ gobject_class->dispose = st_label_dispose; + + actor_class->paint = st_label_paint; + actor_class->allocate = st_label_allocate; +diff --git a/src/st/st-scroll-view.c b/src/st/st-scroll-view.c +index 2dd6f6e..cb555eb 100644 +--- a/src/st/st-scroll-view.c ++++ b/src/st/st-scroll-view.c +@@ -129,13 +129,13 @@ st_scroll_view_dispose (GObject *object) + + if (priv->vscroll) + { +- clutter_actor_unparent (priv->vscroll); ++ clutter_actor_destroy (priv->vscroll); + priv->vscroll = NULL; + } + + if (priv->hscroll) + { +- clutter_actor_unparent (priv->hscroll); ++ clutter_actor_destroy (priv->hscroll); + priv->hscroll = NULL; + } + +diff --git a/src/st/st-table.c b/src/st/st-table.c +index 9ef2cf1..e844ff6 100644 +--- a/src/st/st-table.c ++++ b/src/st/st-table.c +@@ -271,15 +271,9 @@ static void + st_table_dispose (GObject *gobject) + { + StTablePrivate *priv = ST_TABLE (gobject)->priv; +- GSList *l, *next; + +- for (l = priv->children; l;) +- { +- next = l->next; +- clutter_container_remove_actor ((ClutterContainer *) gobject, +- CLUTTER_ACTOR (l->data)); +- l = next; +- } ++ while (priv->children) ++ clutter_actor_destroy (priv->children->data); + + G_OBJECT_CLASS (st_table_parent_class)->dispose (gobject); + } +diff --git a/src/st/st-tooltip.c b/src/st/st-tooltip.c +index 9ed299e..5232dbc 100644 +--- a/src/st/st-tooltip.c ++++ b/src/st/st-tooltip.c +@@ -356,6 +356,20 @@ st_tooltip_unmap (ClutterActor *self) + } + + static void ++st_tooltip_dispose (GObject *self) ++{ ++ StTooltipPrivate *priv = ST_TOOLTIP (self)->priv; ++ ++ if (priv->label) ++ { ++ clutter_actor_destroy (priv->label); ++ priv->label = NULL; ++ } ++ ++ G_OBJECT_CLASS (st_tooltip_parent_class)->dispose (self); ++} ++ ++static void + st_tooltip_class_init (StTooltipClass *klass) + { + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); +@@ -367,6 +381,7 @@ st_tooltip_class_init (StTooltipClass *klass) + + gobject_class->set_property = st_tooltip_set_property; + gobject_class->get_property = st_tooltip_get_property; ++ gobject_class->dispose = st_tooltip_dispose; + + actor_class->get_preferred_width = st_tooltip_get_preferred_width; + actor_class->get_preferred_height = st_tooltip_get_preferred_height; diff --git a/gnome-shell.changes b/gnome-shell.changes index 8771147..1974a17 100644 --- a/gnome-shell.changes +++ b/gnome-shell.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Sun Oct 11 15:52:05 EDT 2009 - vuntz@opensuse.org + +- Add gnome-shell-leak.patch from git to fix some slow down after + using alt-tab a lot. + ------------------------------------------------------------------- Thu Oct 8 18:47:29 CEST 2009 - vuntz@opensuse.org diff --git a/gnome-shell.spec b/gnome-shell.spec index 0b345ff..3b8a1a8 100644 --- a/gnome-shell.spec +++ b/gnome-shell.spec @@ -44,6 +44,8 @@ Source: %{name}-%{version}.tar.bz2 # Note: this also explains the Requires on gnome-session below. Source1: gnome-shell-session Source2: gnome3.desktop +# PATCH-FIX-UPSTREAM gnome-shell-leak.patch vuntz@opensuse.org -- Fix from upstream +Patch0: gnome-shell-leak.patch # PATCH-FIX-OPENSUSE gnome-shell-libmozjs.patch vuntz@novell.com -- LD_LIBRARY_PATH neeeds to be set on 11.1 Patch99: gnome-shell-libmozjs.patch Requires: %{name}-lang = %{version} @@ -61,6 +63,7 @@ documents, and organizing open windows in GNOME. %lang_package %prep %setup -q +%patch0 -p1 %if %suse_version <= 1110 %patch99 -p1 %endif