[gnome-shell] Remove st_container_remove_all & rewrite st_container_destroy_children
- From: Maxim Ermilov <mermilov src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] Remove st_container_remove_all & rewrite st_container_destroy_children
- Date: Tue, 1 Feb 2011 20:44:03 +0000 (UTC)
commit e3acaa05be3a3ddd21ccd0bcdc0d593e8a8bd1ce
Author: Maxim Ermilov <zaspire rambler ru>
Date: Tue Feb 1 02:25:35 2011 +0300
Remove st_container_remove_all & rewrite st_container_destroy_children
1. Both functions leaked the nodes in priv->children
2. st_container_remove_all wasn't properly updating first_child and last_child
3. remove_all() is almost never right since it won't cause signal handlers
on the children to be removed. In the rare cases where it might be needed
the caller can simply use clutter_container_remove().
https://bugzilla.gnome.org/show_bug.cgi?id=640781
js/ui/dash.js | 2 +-
js/ui/endSessionDialog.js | 2 +-
js/ui/modalDialog.js | 2 +-
js/ui/workspacesView.js | 2 +-
src/st/st-container.c | 37 ++++++++++---------------------------
src/st/st-container.h | 1 -
6 files changed, 14 insertions(+), 32 deletions(-)
---
diff --git a/js/ui/dash.js b/js/ui/dash.js
index 01de6af..7e6ce1d 100644
--- a/js/ui/dash.js
+++ b/js/ui/dash.js
@@ -206,7 +206,7 @@ Dash.prototype = {
_redisplay: function () {
this._box.hide();
- this._box.remove_all();
+ this._box.destroy_children();
let favorites = AppFavorites.getAppFavorites().getFavoriteMap();
diff --git a/js/ui/endSessionDialog.js b/js/ui/endSessionDialog.js
index 62b69b1..c25633a 100644
--- a/js/ui/endSessionDialog.js
+++ b/js/ui/endSessionDialog.js
@@ -470,7 +470,7 @@ EndSessionDialog.prototype = {
OpenAsync: function(type, timestamp, totalSecondsToStayOpen, inhibitorObjectPaths, callback) {
this._totalSecondsToStayOpen = totalSecondsToStayOpen;
this._inhibitors = [];
- this._applicationList.remove_all();
+ this._applicationList.destroy_children();
this._type = type;
if (!(this._type in DialogContent))
diff --git a/js/ui/modalDialog.js b/js/ui/modalDialog.js
index 7b3f0d3..fee6266 100644
--- a/js/ui/modalDialog.js
+++ b/js/ui/modalDialog.js
@@ -83,7 +83,7 @@ ModalDialog.prototype = {
},
setButtons: function(buttons) {
- this._buttonLayout.remove_all();
+ this._buttonLayout.destroy_children();
let i = 0;
for (let index in buttons) {
let buttonInfo = buttons[index];
diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js
index f53db7a..2a6557b 100644
--- a/js/ui/workspacesView.js
+++ b/js/ui/workspacesView.js
@@ -769,7 +769,7 @@ WorkspaceIndicatorPanel.prototype = {
else
this.actor.set_skip_paint(this._box, false);
- this._box.remove_all();
+ this._box.destroy_children();
for (let i = 0; i < this._workspaces.length; i++) {
let actor = new St.Button({ style_class: 'workspace-indicator',
track_hover: true });
diff --git a/src/st/st-container.c b/src/st/st-container.c
index 0fb5eb4..2f7d095 100644
--- a/src/st/st-container.c
+++ b/src/st/st-container.c
@@ -35,6 +35,7 @@ struct _StContainerPrivate
GList *children;
ClutterActor *first_child;
ClutterActor *last_child;
+ gboolean block_update_pseude_classes;
};
static void clutter_container_iface_init (ClutterContainerIface *iface);
@@ -50,6 +51,9 @@ st_container_update_pseudo_classes (StContainer *container)
ClutterActor *first_child, *last_child;
StContainerPrivate *priv = container->priv;
+ if (priv->block_update_pseude_classes)
+ return;
+
first_item = priv->children;
first_child = first_item ? first_item->data : NULL;
if (first_child != priv->first_child)
@@ -92,28 +96,6 @@ st_container_update_pseudo_classes (StContainer *container)
}
/**
- * st_container_remove_all:
- * @container: An #StContainer
- *
- * Removes all child actors from @container.
- */
-void
-st_container_remove_all (StContainer *container)
-{
- StContainerPrivate *priv = container->priv;
-
- /* copied from clutter_group_remove_all() */
- while (priv->children)
- {
- ClutterActor *child = priv->children->data;
- priv->children = priv->children->next;
-
- clutter_container_remove_actor (CLUTTER_CONTAINER (container), child);
- }
- st_container_update_pseudo_classes (container);
-}
-
-/**
* st_container_destroy_children:
* @container: An #StContainer
*
@@ -124,13 +106,14 @@ st_container_destroy_children (StContainer *container)
{
StContainerPrivate *priv = container->priv;
+ priv->block_update_pseude_classes = TRUE;
+
while (priv->children)
- {
- ClutterActor *child = priv->children->data;
- priv->children = priv->children->next;
+ clutter_actor_destroy (priv->children->data);
- clutter_actor_destroy (child);
- }
+ priv->block_update_pseude_classes = FALSE;
+
+ st_container_update_pseudo_classes (container);
}
void
diff --git a/src/st/st-container.h b/src/st/st-container.h
index 91f457f..023bef9 100644
--- a/src/st/st-container.h
+++ b/src/st/st-container.h
@@ -53,7 +53,6 @@ struct _StContainerClass {
GType st_container_get_type (void) G_GNUC_CONST;
-void st_container_remove_all (StContainer *container);
void st_container_destroy_children (StContainer *container);
GList * st_container_get_focus_chain (StContainer *container);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]