X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtksizegroup.c;h=e31dfa84eb1755b30b53f228eeff280941a16989;hb=aaedf5a35219b034a244730564b8fdf2b7d32540;hp=bcd92557272177e9a7ffe1f8dc85b40e2b3e78a2;hpb=c08efb2b3291692dd3ad12cc95d4daf3735a0630;p=~andy%2Fgtk diff --git a/gtk/gtksizegroup.c b/gtk/gtksizegroup.c index bcd925572..e31dfa84e 100644 --- a/gtk/gtksizegroup.c +++ b/gtk/gtksizegroup.c @@ -147,18 +147,23 @@ static void gtk_size_group_buildable_custom_finished (GtkBuildable *buildable, const gchar *tagname, gpointer user_data); +G_STATIC_ASSERT (GTK_SIZE_GROUP_HORIZONTAL == (1 << GTK_ORIENTATION_HORIZONTAL)); +G_STATIC_ASSERT (GTK_SIZE_GROUP_VERTICAL == (1 << GTK_ORIENTATION_VERTICAL)); +G_STATIC_ASSERT (GTK_SIZE_GROUP_BOTH == (GTK_SIZE_GROUP_HORIZONTAL | GTK_SIZE_GROUP_VERTICAL)); + static void -add_widget_to_closure (GHashTable *set, - GtkWidget *widget, - GtkSizeGroupMode mode) +add_widget_to_closure (GHashTable *widgets, + GHashTable *groups, + GtkWidget *widget, + GtkOrientation orientation) { GSList *tmp_groups, *tmp_widgets; gboolean hidden; - if (g_hash_table_lookup (set, widget)) + if (g_hash_table_lookup (widgets, widget)) return; - g_hash_table_insert (set, widget, widget); + g_hash_table_add (widgets, widget); hidden = !gtk_widget_is_visible (widget); for (tmp_groups = _gtk_widget_get_sizegroups (widget); tmp_groups; tmp_groups = tmp_groups->next) @@ -166,28 +171,36 @@ add_widget_to_closure (GHashTable *set, GtkSizeGroup *tmp_group = tmp_groups->data; GtkSizeGroupPrivate *tmp_priv = tmp_group->priv; + if (g_hash_table_lookup (groups, tmp_group)) + continue; + if (tmp_priv->ignore_hidden && hidden) continue; - if (tmp_priv->mode != GTK_SIZE_GROUP_BOTH && tmp_priv->mode != mode) + if (!(tmp_priv->mode & (1 << orientation))) continue; + g_hash_table_add (groups, tmp_group); + for (tmp_widgets = tmp_priv->widgets; tmp_widgets; tmp_widgets = tmp_widgets->next) - add_widget_to_closure (set, tmp_widgets->data, mode); + add_widget_to_closure (widgets, groups, tmp_widgets->data, orientation); } } GHashTable * -_gtk_size_group_get_widget_peers (GtkWidget *for_widget, - GtkSizeGroupMode mode) +_gtk_size_group_get_widget_peers (GtkWidget *for_widget, + GtkOrientation orientation) { - GHashTable *result; + GHashTable *widgets, *groups; + + widgets = g_hash_table_new (g_direct_hash, g_direct_equal); + groups = g_hash_table_new (g_direct_hash, g_direct_equal); - result = g_hash_table_new (g_direct_hash, g_direct_equal); + add_widget_to_closure (widgets, groups, for_widget, orientation); - add_widget_to_closure (result, for_widget, mode); + g_hash_table_unref (groups); - return result; + return widgets; } static void @@ -197,8 +210,6 @@ real_queue_resize (GtkWidget *widget, GtkWidget *container; _gtk_widget_set_alloc_needed (widget, TRUE); - _gtk_widget_set_width_request_needed (widget, TRUE); - _gtk_widget_set_height_request_needed (widget, TRUE); _gtk_size_request_cache_clear (_gtk_widget_peek_request_cache (widget)); container = gtk_widget_get_parent (widget); @@ -246,7 +257,7 @@ queue_resize_on_widget (GtkWidget *widget, continue; } - widgets = _gtk_size_group_get_widget_peers (parent, GTK_SIZE_GROUP_HORIZONTAL); + widgets = _gtk_size_group_get_widget_peers (parent, GTK_ORIENTATION_HORIZONTAL); g_hash_table_iter_init (&iter, widgets); while (g_hash_table_iter_next (&iter, ¤t, NULL)) @@ -266,7 +277,7 @@ queue_resize_on_widget (GtkWidget *widget, g_hash_table_destroy (widgets); - widgets = _gtk_size_group_get_widget_peers (parent, GTK_SIZE_GROUP_VERTICAL); + widgets = _gtk_size_group_get_widget_peers (parent, GTK_ORIENTATION_VERTICAL); g_hash_table_iter_init (&iter, widgets); while (g_hash_table_iter_next (&iter, ¤t, NULL))