aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--lib/ephy-node.c81
-rw-r--r--lib/ephy-node.h2
3 files changed, 85 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 1497ef21d..c9dc601d9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2003-05-10 Xan Lopez <xan@masilla.org>
+
+ * lib/ephy-node.c: (ephy_node_real_get_child_index),
+ (ephy_node_sort_children), (ephy_node_get_child_index):
+ * lib/ephy-node.h:
+
+ Add ephy_node_sort_children, unused but kept for future reference
+ in jorn's s3kr3t project (and it's cool to be the state of the art
+ implementation of node stuff anyway).
+
2003-05-10 Marco Pesenti Gritti <marco@it.gnome.org>
* embed/mozilla/ContentHandler.cpp:
diff --git a/lib/ephy-node.c b/lib/ephy-node.c
index 387d85e38..befbbf66e 100644
--- a/lib/ephy-node.c
+++ b/lib/ephy-node.c
@@ -1237,6 +1237,77 @@ ephy_node_has_child (EphyNode *node,
return ret;
}
+static int
+ephy_node_real_get_child_index (EphyNode *node,
+ EphyNode *child)
+{
+ EphyNodeParent *node_info;
+ int ret;
+
+ node_info = g_hash_table_lookup (child->priv->parents,
+ GINT_TO_POINTER (node->priv->id));
+
+ if (node_info == NULL)
+ return -1;
+
+ ret = node_info->index;
+
+ return ret;
+}
+
+void
+ephy_node_sort_children (EphyNode *node,
+ GCompareFunc compare_func)
+{
+ GPtrArray *newkids;
+ int i, *new_order;
+
+ g_return_if_fail (EPHY_IS_NODE (node));
+ g_return_if_fail (compare_func != NULL);
+
+ lock_gdk ();
+
+ g_static_rw_lock_writer_lock (node->priv->lock);
+
+ newkids = g_ptr_array_new ();
+ g_ptr_array_set_size (newkids, node->priv->children->len);
+
+ /* dup the array */
+ for (i = 0; i < node->priv->children->len; i++)
+ {
+ g_ptr_array_index (newkids, i) = g_ptr_array_index (node->priv->children, i);
+ }
+
+ g_ptr_array_sort (newkids, compare_func);
+
+ new_order = g_new (int, newkids->len);
+ memset (new_order, -1, sizeof (int) * newkids->len);
+
+ for (i = 0; i < newkids->len; i++)
+ {
+ EphyNodeParent *node_info;
+ EphyNode *child;
+
+ child = g_ptr_array_index (newkids, i);
+ new_order[ephy_node_real_get_child_index (node, child)] = i;
+ node_info = g_hash_table_lookup (child->priv->parents,
+ GINT_TO_POINTER (node->priv->id));
+ node_info->index = i;
+ }
+
+ g_ptr_array_free (node->priv->children, FALSE);
+ node->priv->children = newkids;
+
+ write_lock_to_read_lock (node);
+
+ g_signal_emit (G_OBJECT (node), ephy_node_signals[CHILDREN_REORDERED], 0, new_order);
+ g_free (new_order);
+
+ g_static_rw_lock_reader_unlock (node->priv->lock);
+
+ unlock_gdk ();
+}
+
void
ephy_node_reorder_children (EphyNode *node,
int *new_order)
@@ -1342,11 +1413,11 @@ get_child_index_real (EphyNode *node,
return node_info->index;
}
+
int
ephy_node_get_child_index (EphyNode *node,
EphyNode *child)
{
- EphyNodeParent *node_info;
int ret;
g_return_val_if_fail (EPHY_IS_NODE (node), -1);
@@ -1355,14 +1426,8 @@ ephy_node_get_child_index (EphyNode *node,
g_static_rw_lock_reader_lock (node->priv->lock);
g_static_rw_lock_reader_lock (child->priv->lock);
- node_info = g_hash_table_lookup (child->priv->parents,
- GINT_TO_POINTER (node->priv->id));
+ ret = ephy_node_real_get_child_index (node, child);
- if (node_info == NULL)
- return -1;
-
- ret = node_info->index;
-
g_static_rw_lock_reader_unlock (node->priv->lock);
g_static_rw_lock_reader_unlock (child->priv->lock);
diff --git a/lib/ephy-node.h b/lib/ephy-node.h
index 8c142d528..e7872400e 100644
--- a/lib/ephy-node.h
+++ b/lib/ephy-node.h
@@ -118,6 +118,8 @@ void ephy_node_add_child (EphyNode *node,
EphyNode *child);
void ephy_node_remove_child (EphyNode *node,
EphyNode *child);
+void ephy_node_sort_children (EphyNode *node,
+ GCompareFunc compare_func);
gboolean ephy_node_has_child (EphyNode *node,
EphyNode *child);