[gtk+/toolpalette] Ported gtktoolpalette from a custom array to GPtrArray.
- From: Johannes Schmid <jhs src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gtk+/toolpalette] Ported gtktoolpalette from a custom array to GPtrArray.
- Date: Mon, 9 Nov 2009 21:16:57 +0000 (UTC)
commit 1de2a55eaf9173e9de3bcb886c20695c511e1470
Author: Johannes Schmid <jhs gnome org>
Date: Mon Nov 9 22:16:15 2009 +0100
Ported gtktoolpalette from a custom array to GPtrArray.
...and some mixed fixes of things mentioned in the bug report
gtk/gtktoolitemgroup.c | 20 +++--
gtk/gtktoolpalette.c | 222 +++++++++++++++++++++---------------------------
2 files changed, 110 insertions(+), 132 deletions(-)
---
diff --git a/gtk/gtktoolitemgroup.c b/gtk/gtktoolitemgroup.c
index 809bff8..aa7362b 100644
--- a/gtk/gtktoolitemgroup.c
+++ b/gtk/gtktoolitemgroup.c
@@ -301,7 +301,7 @@ gtk_tool_item_group_header_expose_event_cb (GtkWidget *widget,
/* Unfortunatly gtk_paint_expander() doesn't support rotated drawing
* modes. Luckily the following shady arithmetics produce the desired
* result. */
- expander_style = GTK_EXPANDER_EXPANDED - expander_style; /* XXX */
+ expander_style = GTK_EXPANDER_EXPANDED - expander_style;
}
gtk_paint_expander (widget->style, widget->window,
@@ -1680,10 +1680,6 @@ gtk_tool_item_group_set_label (GtkToolItemGroup *group,
else
{
GtkWidget *child = gtk_label_new (label);
- /*
- gtk_label_set_use_underline (GTK_LABEL (child), group->priv->use_underline);
- gtk_label_set_use_markup (GTK_LABEL (child), group->priv->use_markup);
- */
gtk_widget_show (child);
gtk_tool_item_group_set_label_widget (group, child);
@@ -1824,7 +1820,10 @@ gtk_tool_item_group_animation_cb (gpointer data)
GtkToolItemGroup *group = GTK_TOOL_ITEM_GROUP (data);
GtkToolItemGroupPrivate* priv = group->priv;
gint64 timestamp = gtk_tool_item_group_get_animation_timestamp (group);
+ gboolean retval;
+ GDK_THREADS_ENTER();
+
/* Enque this early to reduce number of expose events. */
gtk_widget_queue_resize_no_redraw (GTK_WIDGET (group));
@@ -1858,7 +1857,11 @@ gtk_tool_item_group_animation_cb (gpointer data)
*/
gdk_window_process_updates (GTK_WIDGET (group)->window, TRUE);
- return (priv->animation_timeout != NULL);
+ retval = (priv->animation_timeout != NULL);
+
+ GDK_THREADS_LEAVE();
+
+ return retval;
}
/**
@@ -1947,6 +1950,7 @@ gtk_tool_item_group_set_ellipsize (GtkToolItemGroup *group,
* Gets the label of @group.
*
* Returns: the label of @group. The label is an internal string of @group and must not be modified.
+ * Note that NULL is returned if a custom label has been set with gtk_tool_item_group_set_label_widget()
*
* Since: 2.20
*/
@@ -1969,9 +1973,9 @@ gtk_tool_item_group_get_label (GtkToolItemGroup *group)
* gtk_tool_item_group_get_label_widget:
* @group: an #GtkToolItemGroup.
*
- * Gets the label of @group.
+ * Gets the label widget of @group.
*
- * Returns: the label of @group. The label is an internal string of @group and must not be modified.
+ * Returns: the label widget of @group. See gtk_tool_item_group_set_label_widget()
*
* Since: 2.20
*/
diff --git a/gtk/gtktoolpalette.c b/gtk/gtktoolpalette.c
index 9db65fa..346ba95 100644
--- a/gtk/gtktoolpalette.c
+++ b/gtk/gtktoolpalette.c
@@ -126,15 +126,14 @@ struct _GtkToolItemGroupInfo
GtkToolItemGroup *widget;
guint notify_collapsed;
+ guint pos;
guint exclusive : 1;
guint expand : 1;
};
struct _GtkToolPalettePrivate
{
- GtkToolItemGroupInfo *groups;
- gsize groups_size;
- gsize groups_length;
+ GPtrArray* groups;
GtkAdjustment *hadjustment;
GtkAdjustment *vadjustment;
@@ -152,7 +151,6 @@ struct _GtkToolPalettePrivate
GtkSettings *settings;
gulong settings_connection;
- guint sparse_groups : 1;
guint drag_source : 2;
};
@@ -167,8 +165,8 @@ static GdkAtom dnd_target_atom_group = GDK_NONE;
static const GtkTargetEntry dnd_targets[] =
{
- { "application/x-GTK-tool-palette-item", GTK_TARGET_SAME_APP, 0 },
- { "application/x-GTK-tool-palette-group", GTK_TARGET_SAME_APP, 0 },
+ { "application/x-gtk-tool-palette-item", GTK_TARGET_SAME_APP, 0 },
+ { "application/x-gtk-tool-palette-group", GTK_TARGET_SAME_APP, 0 },
};
G_DEFINE_TYPE_WITH_CODE (GtkToolPalette,
@@ -183,9 +181,8 @@ gtk_tool_palette_init (GtkToolPalette *palette)
GTK_TYPE_TOOL_PALETTE,
GtkToolPalettePrivate);
- palette->priv->groups_size = 4;
- palette->priv->groups_length = 0;
- palette->priv->groups = g_new0 (GtkToolItemGroupInfo, palette->priv->groups_size);
+ palette->priv->groups = g_ptr_array_sized_new(4);
+ g_ptr_array_set_free_func (palette->priv->groups, g_free);
palette->priv->icon_size = DEFAULT_ICON_SIZE;
palette->priv->icon_size_set = FALSE;
@@ -201,10 +198,11 @@ gtk_tool_palette_reconfigured (GtkToolPalette *palette)
{
guint i;
- for (i = 0; i < palette->priv->groups_length; ++i)
+ for (i = 0; i < palette->priv->groups->len; ++i)
{
- if (palette->priv->groups[i].widget)
- _gtk_tool_item_group_palette_reconfigured (palette->priv->groups[i].widget);
+ GtkToolItemGroupInfo *info = g_ptr_array_index(palette->priv->groups, i);
+ if (info->widget)
+ _gtk_tool_item_group_palette_reconfigured (info->widget);
}
gtk_widget_queue_resize_no_redraw (GTK_WIDGET (palette));
@@ -308,9 +306,9 @@ gtk_tool_palette_dispose (GObject *object)
palette->priv->vadjustment = NULL;
}
- for (i = 0; i < palette->priv->groups_size; ++i)
+ for (i = 0; i < palette->priv->groups->len; ++i)
{
- GtkToolItemGroupInfo *group = &palette->priv->groups[i];
+ GtkToolItemGroupInfo *group = g_ptr_array_index(palette->priv->groups, i);
if (group->notify_collapsed)
{
@@ -333,12 +331,7 @@ gtk_tool_palette_finalize (GObject *object)
{
GtkToolPalette *palette = GTK_TOOL_PALETTE (object);
- if (palette->priv->groups)
- {
- palette->priv->groups_length = 0;
- g_free (palette->priv->groups);
- palette->priv->groups = NULL;
- }
+ g_ptr_array_free(palette->priv->groups, TRUE);
G_OBJECT_CLASS (gtk_tool_palette_parent_class)->finalize (object);
}
@@ -355,9 +348,9 @@ gtk_tool_palette_size_request (GtkWidget *widget,
requisition->width = 0;
requisition->height = 0;
- for (i = 0; i < palette->priv->groups_length; ++i)
+ for (i = 0; i < palette->priv->groups->len; ++i)
{
- GtkToolItemGroupInfo *group = &palette->priv->groups[i];
+ GtkToolItemGroupInfo *group = g_ptr_array_index(palette->priv->groups, i);
if (!group->widget)
continue;
@@ -401,7 +394,7 @@ gtk_tool_palette_size_allocate (GtkWidget *widget,
gint x;
- gint *group_sizes = g_newa(gint, palette->priv->groups_length);
+ gint *group_sizes = g_newa(gint, palette->priv->groups->len);
GtkTextDirection direction = gtk_widget_get_direction (widget);
@@ -436,9 +429,9 @@ gtk_tool_palette_size_allocate (GtkWidget *widget,
/* figure out the required size of all groups to be able to distribute the
* remaining space on allocation */
- for (i = 0; i < palette->priv->groups_length; ++i)
+ for (i = 0; i < palette->priv->groups->len; ++i)
{
- GtkToolItemGroupInfo *group = &palette->priv->groups[i];
+ GtkToolItemGroupInfo *group = g_ptr_array_index(palette->priv->groups, i);
gint size;
if (!group->widget)
@@ -517,9 +510,9 @@ gtk_tool_palette_size_allocate (GtkWidget *widget,
x -= offset;
/* allocate all groups at the calculated positions */
- for (i = 0; i < palette->priv->groups_length; ++i)
+ for (i = 0; i < palette->priv->groups->len; ++i)
{
- GtkToolItemGroupInfo *group = &palette->priv->groups[i];
+ GtkToolItemGroupInfo *group = g_ptr_array_index(palette->priv->groups, i);
GtkWidget *widget;
if (!group->widget)
@@ -628,9 +621,12 @@ gtk_tool_palette_expose_event (GtkWidget *widget,
cairo_push_group (cr);
- for (i = 0; i < palette->priv->groups_length; ++i)
- if (palette->priv->groups[i].widget)
- _gtk_tool_item_group_paint (palette->priv->groups[i].widget, cr);
+ for (i = 0; i < palette->priv->groups->len; ++i)
+ {
+ GtkToolItemGroupInfo *info = g_ptr_array_index(palette->priv->groups, i);
+ if (info->widget)
+ _gtk_tool_item_group_paint (info->widget, cr);
+ }
cairo_pop_group_to_source (cr);
@@ -713,55 +709,20 @@ gtk_tool_palette_set_scroll_adjustments (GtkWidget *widget,
}
static void
-gtk_tool_palette_repack (GtkToolPalette *palette)
-{
- guint si, di;
-
- for (si = di = 0; di < palette->priv->groups_length; ++si)
- {
- if (palette->priv->groups[si].widget)
- {
- palette->priv->groups[di] = palette->priv->groups[si];
- ++di;
- }
- else
- --palette->priv->groups_length;
- }
-
- palette->priv->sparse_groups = FALSE;
-}
-
-static void
gtk_tool_palette_add (GtkContainer *container,
GtkWidget *child)
{
GtkToolPalette *palette;
-
+ GtkToolItemGroupInfo *info = g_new0(GtkToolItemGroupInfo, 1);
+
g_return_if_fail (GTK_IS_TOOL_PALETTE (container));
g_return_if_fail (GTK_IS_TOOL_ITEM_GROUP (child));
palette = GTK_TOOL_PALETTE (container);
- if (palette->priv->groups_length == palette->priv->groups_size)
- gtk_tool_palette_repack (palette);
-
- if (palette->priv->groups_length == palette->priv->groups_size)
- {
- gsize old_size = palette->priv->groups_size;
- gsize new_size = old_size * 2;
-
- palette->priv->groups = g_renew (GtkToolItemGroupInfo,
- palette->priv->groups,
- new_size);
-
- memset (palette->priv->groups + old_size, 0,
- sizeof (GtkToolItemGroupInfo) * old_size);
-
- palette->priv->groups_size = new_size;
- }
-
- palette->priv->groups[palette->priv->groups_length].widget = g_object_ref_sink (child);
- palette->priv->groups_length += 1;
+ g_ptr_array_add (palette->priv->groups, info);
+ info->pos = palette->priv->groups->len - 1;
+ info->widget = g_object_ref_sink (child);
gtk_widget_set_parent (child, GTK_WIDGET (palette));
}
@@ -776,15 +737,17 @@ gtk_tool_palette_remove (GtkContainer *container,
g_return_if_fail (GTK_IS_TOOL_PALETTE (container));
palette = GTK_TOOL_PALETTE (container);
- for (i = 0; i < palette->priv->groups_length; ++i)
- if ((GtkWidget*) palette->priv->groups[i].widget == child)
- {
- g_object_unref (child);
- gtk_widget_unparent (child);
+ for (i = 0; i < palette->priv->groups->len; ++i)
+ {
+ GtkToolItemGroupInfo *info = g_ptr_array_index(palette->priv->groups, i);
+ if (GTK_WIDGET(info->widget) == child)
+ {
+ g_object_unref (child);
+ gtk_widget_unparent (child);
- memset (&palette->priv->groups[i], 0, sizeof (GtkToolItemGroupInfo));
- palette->priv->sparse_groups = TRUE;
- }
+ g_ptr_array_remove_index (palette->priv->groups, i);
+ }
+ }
}
static void
@@ -796,12 +759,13 @@ gtk_tool_palette_forall (GtkContainer *container,
GtkToolPalette *palette = GTK_TOOL_PALETTE (container);
guint i;
- if (palette->priv->groups)
+
+ for (i = 0; i < palette->priv->groups->len; ++i)
{
- for (i = 0; i < palette->priv->groups_length; ++i)
- if (palette->priv->groups[i].widget)
- callback (GTK_WIDGET (palette->priv->groups[i].widget),
- callback_data);
+ GtkToolItemGroupInfo *info = g_ptr_array_index(palette->priv->groups, i);
+ if (info->widget)
+ callback (GTK_WIDGET (info->widget),
+ callback_data);
}
}
@@ -1270,6 +1234,17 @@ gtk_tool_palette_get_style (GtkToolPalette *palette)
return palette->priv->style;
}
+gint
+_gtk_tool_palette_compare_groups (gconstpointer a,
+ gconstpointer b)
+{
+ const GtkToolItemGroupInfo *group_a = a;
+ const GtkToolItemGroupInfo *group_b = b;
+
+ return group_a->pos - group_b->pos;
+
+}
+
/**
* gtk_tool_palette_set_group_position:
* @palette: an #GtkToolPalette.
@@ -1287,46 +1262,34 @@ gtk_tool_palette_set_group_position (GtkToolPalette *palette,
GtkWidget *group,
gint position)
{
- GtkToolItemGroupInfo group_info;
+ GtkToolItemGroupInfo *group_new;
+ GtkToolItemGroupInfo *group_old;
gint old_position;
- gpointer src, dst;
- gsize len;
g_return_if_fail (GTK_IS_TOOL_PALETTE (palette));
g_return_if_fail (GTK_IS_TOOL_ITEM_GROUP (group));
- gtk_tool_palette_repack (palette);
-
g_return_if_fail (position >= -1);
if (-1 == position)
- position = palette->priv->groups_length - 1;
+ position = palette->priv->groups->len - 1;
- g_return_if_fail ((guint) position < palette->priv->groups_length);
+ g_return_if_fail ((guint) position < palette->priv->groups->len);
- if (GTK_TOOL_ITEM_GROUP (group) == palette->priv->groups[position].widget)
+ group_new = g_ptr_array_index(palette->priv->groups, position);
+
+ if (GTK_TOOL_ITEM_GROUP (group) == group_new->widget)
return;
- old_position = gtk_tool_palette_get_group_position (palette, group);
+ old_position = gtk_tool_palette_get_group_position (palette, group);
g_return_if_fail (old_position >= 0);
- group_info = palette->priv->groups[old_position];
+ group_old = g_ptr_array_index(palette->priv->groups, old_position);
- if (position < old_position)
- {
- dst = palette->priv->groups + position + 1;
- src = palette->priv->groups + position;
- len = old_position - position;
- }
- else
- {
- dst = palette->priv->groups + old_position;
- src = palette->priv->groups + old_position + 1;
- len = position - old_position;
- }
+ group_new->pos = position;
+ group_old->pos = old_position;
- memmove (dst, src, len * sizeof (*palette->priv->groups));
- palette->priv->groups[position] = group_info;
+ g_ptr_array_sort (palette->priv->groups, _gtk_tool_palette_compare_groups);
gtk_widget_queue_resize (GTK_WIDGET (palette));
}
@@ -1342,12 +1305,13 @@ gtk_tool_palette_group_notify_collapsed (GtkToolItemGroup *group,
if (gtk_tool_item_group_get_collapsed (group))
return;
- for (i = 0; i < palette->priv->groups_size; ++i)
+ for (i = 0; i < palette->priv->groups->len; ++i)
{
- GtkToolItemGroup *current_group = palette->priv->groups[i].widget;
+ GtkToolItemGroupInfo *info = g_ptr_array_index (palette->priv->groups, i);
+ GtkToolItemGroup *current_group = info->widget;
if (current_group && current_group != group)
- gtk_tool_item_group_set_collapsed (palette->priv->groups[i].widget, TRUE);
+ gtk_tool_item_group_set_collapsed (current_group, TRUE);
}
}
@@ -1376,7 +1340,7 @@ gtk_tool_palette_set_exclusive (GtkToolPalette *palette,
position = gtk_tool_palette_get_group_position (palette, group);
g_return_if_fail (position >= 0);
- group_info = &palette->priv->groups[position];
+ group_info = g_ptr_array_index (palette->priv->groups, position);
if (exclusive == group_info->exclusive)
return;
@@ -1427,7 +1391,7 @@ gtk_tool_palette_set_expand (GtkToolPalette *palette,
position = gtk_tool_palette_get_group_position (palette, group);
g_return_if_fail (position >= 0);
- group_info = &palette->priv->groups[position];
+ group_info = g_ptr_array_index (palette->priv->groups, position);
if (expand != group_info->expand)
{
@@ -1457,9 +1421,12 @@ gtk_tool_palette_get_group_position (GtkToolPalette *palette,
g_return_val_if_fail (GTK_IS_TOOL_PALETTE (palette), -1);
g_return_val_if_fail (GTK_IS_TOOL_ITEM_GROUP (group), -1);
- for (i = 0; i < palette->priv->groups_length; ++i)
- if ((gpointer) group == palette->priv->groups[i].widget)
- return i;
+ for (i = 0; i < palette->priv->groups->len; ++i)
+ {
+ GtkToolItemGroupInfo *info = g_ptr_array_index (palette->priv->groups, i);
+ if ((gpointer) group == info->widget)
+ return i;
+ }
return -1;
}
@@ -1480,6 +1447,7 @@ gtk_tool_palette_get_exclusive (GtkToolPalette *palette,
GtkWidget *group)
{
gint position;
+ GtkToolItemGroupInfo *info;
g_return_val_if_fail (GTK_IS_TOOL_PALETTE (palette), DEFAULT_CHILD_EXCLUSIVE);
g_return_val_if_fail (GTK_IS_TOOL_ITEM_GROUP (group), DEFAULT_CHILD_EXCLUSIVE);
@@ -1487,7 +1455,9 @@ gtk_tool_palette_get_exclusive (GtkToolPalette *palette,
position = gtk_tool_palette_get_group_position (palette, group);
g_return_val_if_fail (position >= 0, DEFAULT_CHILD_EXCLUSIVE);
- return palette->priv->groups[position].exclusive;
+ info = g_ptr_array_index (palette->priv->groups, position);
+
+ return info->exclusive;
}
/**
@@ -1506,6 +1476,7 @@ gtk_tool_palette_get_expand (GtkToolPalette *palette,
GtkWidget *group)
{
gint position;
+ GtkToolItemGroupInfo *info;
g_return_val_if_fail (GTK_IS_TOOL_PALETTE (palette), DEFAULT_CHILD_EXPAND);
g_return_val_if_fail (GTK_IS_TOOL_ITEM_GROUP (group), DEFAULT_CHILD_EXPAND);
@@ -1513,7 +1484,9 @@ gtk_tool_palette_get_expand (GtkToolPalette *palette,
position = gtk_tool_palette_get_group_position (palette, group);
g_return_val_if_fail (position >= 0, DEFAULT_CHILD_EXPAND);
- return palette->priv->groups[position].expand;
+ info = g_ptr_array_index (palette->priv->groups, position);
+
+ return info->expand;
}
/**
@@ -1570,9 +1543,9 @@ gtk_tool_palette_get_drop_group (GtkToolPalette *palette,
g_return_val_if_fail (x >= 0 && x < allocation->width, NULL);
g_return_val_if_fail (y >= 0 && y < allocation->height, NULL);
- for (i = 0; i < palette->priv->groups_length; ++i)
+ for (i = 0; i < palette->priv->groups->len; ++i)
{
- GtkToolItemGroupInfo *group = &palette->priv->groups[i];
+ GtkToolItemGroupInfo *group = g_ptr_array_index(palette->priv->groups, i);
GtkWidget *widget;
gint x0, y0;
@@ -1658,10 +1631,11 @@ gtk_tool_palette_set_drag_source (GtkToolPalette *palette,
palette->priv->drag_source |= targets;
- for (i = 0; i < palette->priv->groups_length; ++i)
+ for (i = 0; i < palette->priv->groups->len; ++i)
{
- if (palette->priv->groups[i].widget)
- gtk_container_forall (GTK_CONTAINER (palette->priv->groups[i].widget),
+ GtkToolItemGroupInfo *info = g_ptr_array_index (palette->priv->groups, i);
+ if (info->widget)
+ gtk_container_forall (GTK_CONTAINER (info->widget),
_gtk_tool_palette_child_set_drag_source,
palette);
}
@@ -1728,11 +1702,11 @@ _gtk_tool_palette_get_item_size (GtkToolPalette *palette,
max_rows = 0;
/* iterate over all groups and calculate the max item_size and max row request */
- for (i = 0; i < palette->priv->groups_length; ++i)
+ for (i = 0; i < palette->priv->groups->len; ++i)
{
GtkRequisition requisition;
gint rows;
- GtkToolItemGroupInfo *group = &palette->priv->groups[i];
+ GtkToolItemGroupInfo *group = g_ptr_array_index(palette->priv->groups, i);
if (!group->widget)
continue;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]