iface->add_child = gtk_box_buildable_add_child;
}
-static void
-gtk_box_invalidate_order_foreach (GtkWidget *widget,
- gpointer prev)
-{
- GtkCssNode **previous = prev;
- GtkCssNode *cur = gtk_widget_get_css_node (widget);
-
- if (*previous)
- gtk_css_node_set_after (cur, *previous);
-
- *previous = cur;
-}
+typedef struct {
+ GtkCssNode *parent;
+ GtkCssNode *previous;
+ gboolean reverse;
+} InvalidateOrderData;
static void
-gtk_box_invalidate_order_foreach_reverse (GtkWidget *widget,
- gpointer prev)
+gtk_box_invalidate_order_foreach (GtkWidget *widget,
+ gpointer datap)
{
- GtkCssNode **previous = prev;
+ InvalidateOrderData *data = datap;
GtkCssNode *cur = gtk_widget_get_css_node (widget);
- if (*previous)
- gtk_css_node_set_before (cur, *previous);
+ if (data->reverse)
+ gtk_css_node_insert_before (data->parent, cur, data->previous);
+ else
+ gtk_css_node_insert_after (data->parent, cur, data->previous);
- *previous = cur;
+ data->previous = cur;
}
static void
gtk_box_invalidate_order (GtkBox *box)
{
- GtkCssNode *previous = NULL;
+ InvalidateOrderData data;
+
+ data.parent = gtk_widget_get_css_node (GTK_WIDGET (box));
+ data.previous = NULL;
+ data.reverse = box->priv->orientation == GTK_ORIENTATION_HORIZONTAL
+ && gtk_widget_get_direction (GTK_WIDGET (box)) == GTK_TEXT_DIR_RTL;
gtk_container_foreach (GTK_CONTAINER (box),
- (box->priv->orientation == GTK_ORIENTATION_HORIZONTAL
- && gtk_widget_get_direction (GTK_WIDGET (box)) == GTK_TEXT_DIR_RTL)
- ? gtk_box_invalidate_order_foreach_reverse
- : gtk_box_invalidate_order_foreach,
- &previous);
+ gtk_box_invalidate_order_foreach,
+ &data);
}
static void
}
void
-gtk_css_node_set_after (GtkCssNode *cssnode,
- GtkCssNode *previous_sibling)
+gtk_css_node_insert_after (GtkCssNode *parent,
+ GtkCssNode *cssnode,
+ GtkCssNode *previous_sibling)
{
- if (cssnode->previous_sibling == previous_sibling)
+ g_return_if_fail (previous_sibling == NULL || previous_sibling->parent == parent);
+
+ if (cssnode->previous_sibling == previous_sibling &&
+ cssnode->parent == parent)
return;
gtk_css_node_reposition (cssnode,
- previous_sibling->parent,
+ parent,
previous_sibling);
}
void
-gtk_css_node_set_before (GtkCssNode *cssnode,
- GtkCssNode *next_sibling)
+gtk_css_node_insert_before (GtkCssNode *parent,
+ GtkCssNode *cssnode,
+ GtkCssNode *next_sibling)
{
- if (cssnode->next_sibling == next_sibling)
+ g_return_if_fail (next_sibling == NULL || next_sibling->parent == parent);
+
+ if (cssnode->next_sibling == next_sibling &&
+ cssnode->parent == parent)
return;
gtk_css_node_reposition (cssnode,
- next_sibling->parent,
- next_sibling->previous_sibling);
+ parent,
+ next_sibling ? next_sibling->previous_sibling : parent->last_child);
}
GtkCssNode *
void gtk_css_node_set_parent (GtkCssNode *cssnode,
GtkCssNode *parent);
-void gtk_css_node_set_after (GtkCssNode *cssnode,
+void gtk_css_node_insert_after (GtkCssNode *parent,
+ GtkCssNode *cssnode,
GtkCssNode *previous_sibling);
-void gtk_css_node_set_before (GtkCssNode *cssnode,
+void gtk_css_node_insert_before (GtkCssNode *parent,
+ GtkCssNode *cssnode,
GtkCssNode *next_sibling);
GtkCssNode * gtk_css_node_get_parent (GtkCssNode *cssnode);
GtkCssNode * gtk_css_node_get_first_child (GtkCssNode *cssnode);
GSequenceIter *iter)
{
GSequenceIter *prev_iter;
- GtkCssNode *child_node;
- GtkCssNode *sibling_node;
GtkWidget *sibling;
- child_node = gtk_widget_get_css_node (child);
prev_iter = g_sequence_iter_prev (iter);
if (prev_iter != iter)
{
sibling = g_sequence_get (prev_iter);
- sibling_node = gtk_widget_get_css_node (sibling);
- gtk_css_node_set_after (child_node, sibling_node);
+ gtk_css_node_insert_after (gtk_widget_get_css_node (GTK_WIDGET (box)),
+ gtk_widget_get_css_node (child),
+ gtk_widget_get_css_node (sibling));
}
}
{
prev_node = gtk_widget_get_css_node (*previous);
row_node = gtk_widget_get_css_node (row);
- gtk_css_node_set_after (row_node, prev_node);
+ gtk_css_node_insert_after (gtk_css_node_get_parent (row_node),
+ row_node,
+ prev_node);
}
*previous = row;
{
prev_node = gtk_widget_get_css_node (*previous);
row_node = gtk_widget_get_css_node (row);
- gtk_css_node_set_after (row_node, prev_node);
+ gtk_css_node_insert_after (gtk_css_node_get_parent (row_node),
+ row_node,
+ prev_node);
}
*previous = row;
GSequenceIter *iter)
{
GSequenceIter *prev_iter;
- GtkCssNode *child_node;
- GtkCssNode *sibling_node;
GtkWidget *sibling;
- child_node = gtk_widget_get_css_node (child);
prev_iter = g_sequence_iter_prev (iter);
if (prev_iter != iter)
{
sibling = g_sequence_get (prev_iter);
- sibling_node = gtk_widget_get_css_node (sibling);
- gtk_css_node_set_after (child_node, sibling_node);
+ gtk_css_node_insert_after (gtk_widget_get_css_node (GTK_WIDGET (box)),
+ gtk_widget_get_css_node (child),
+ gtk_widget_get_css_node (sibling));
}
}