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
This commit is contained in:
Maxim Ermilov 2011-02-01 02:25:35 +03:00
parent 91d8a32f25
commit e3acaa05be
6 changed files with 15 additions and 33 deletions

View File

@ -206,7 +206,7 @@ Dash.prototype = {
_redisplay: function () { _redisplay: function () {
this._box.hide(); this._box.hide();
this._box.remove_all(); this._box.destroy_children();
let favorites = AppFavorites.getAppFavorites().getFavoriteMap(); let favorites = AppFavorites.getAppFavorites().getFavoriteMap();

View File

@ -470,7 +470,7 @@ EndSessionDialog.prototype = {
OpenAsync: function(type, timestamp, totalSecondsToStayOpen, inhibitorObjectPaths, callback) { OpenAsync: function(type, timestamp, totalSecondsToStayOpen, inhibitorObjectPaths, callback) {
this._totalSecondsToStayOpen = totalSecondsToStayOpen; this._totalSecondsToStayOpen = totalSecondsToStayOpen;
this._inhibitors = []; this._inhibitors = [];
this._applicationList.remove_all(); this._applicationList.destroy_children();
this._type = type; this._type = type;
if (!(this._type in DialogContent)) if (!(this._type in DialogContent))

View File

@ -83,7 +83,7 @@ ModalDialog.prototype = {
}, },
setButtons: function(buttons) { setButtons: function(buttons) {
this._buttonLayout.remove_all(); this._buttonLayout.destroy_children();
let i = 0; let i = 0;
for (let index in buttons) { for (let index in buttons) {
let buttonInfo = buttons[index]; let buttonInfo = buttons[index];

View File

@ -769,7 +769,7 @@ WorkspaceIndicatorPanel.prototype = {
else else
this.actor.set_skip_paint(this._box, false); 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++) { for (let i = 0; i < this._workspaces.length; i++) {
let actor = new St.Button({ style_class: 'workspace-indicator', let actor = new St.Button({ style_class: 'workspace-indicator',
track_hover: true }); track_hover: true });

View File

@ -35,6 +35,7 @@ struct _StContainerPrivate
GList *children; GList *children;
ClutterActor *first_child; ClutterActor *first_child;
ClutterActor *last_child; ClutterActor *last_child;
gboolean block_update_pseude_classes;
}; };
static void clutter_container_iface_init (ClutterContainerIface *iface); static void clutter_container_iface_init (ClutterContainerIface *iface);
@ -50,6 +51,9 @@ st_container_update_pseudo_classes (StContainer *container)
ClutterActor *first_child, *last_child; ClutterActor *first_child, *last_child;
StContainerPrivate *priv = container->priv; StContainerPrivate *priv = container->priv;
if (priv->block_update_pseude_classes)
return;
first_item = priv->children; first_item = priv->children;
first_child = first_item ? first_item->data : NULL; first_child = first_item ? first_item->data : NULL;
if (first_child != priv->first_child) if (first_child != priv->first_child)
@ -91,28 +95,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: * st_container_destroy_children:
* @container: An #StContainer * @container: An #StContainer
@ -124,13 +106,14 @@ st_container_destroy_children (StContainer *container)
{ {
StContainerPrivate *priv = container->priv; StContainerPrivate *priv = container->priv;
while (priv->children) priv->block_update_pseude_classes = TRUE;
{
ClutterActor *child = priv->children->data;
priv->children = priv->children->next;
clutter_actor_destroy (child); while (priv->children)
} clutter_actor_destroy (priv->children->data);
priv->block_update_pseude_classes = FALSE;
st_container_update_pseudo_classes (container);
} }
void void

View File

@ -53,7 +53,6 @@ struct _StContainerClass {
GType st_container_get_type (void) G_GNUC_CONST; GType st_container_get_type (void) G_GNUC_CONST;
void st_container_remove_all (StContainer *container);
void st_container_destroy_children (StContainer *container); void st_container_destroy_children (StContainer *container);
GList * st_container_get_focus_chain (StContainer *container); GList * st_container_get_focus_chain (StContainer *container);