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:
parent
91d8a32f25
commit
e3acaa05be
@ -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();
|
||||||
|
|
||||||
|
@ -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))
|
||||||
|
@ -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];
|
||||||
|
@ -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 });
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user