X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkbox.c;h=5c8e6e3ff839b4132cf1fb09aa1255ffe07320e2;hb=HEAD;hp=eacbabfad6b1dc0a3b0d3df08c91575e4cb28cd4;hpb=d4b992506ad83a6482f836cb77a24ac24dbecc8e;p=~andy%2Fgtk diff --git a/gtk/gtkbox.c b/gtk/gtkbox.c index eacbabfad..5c8e6e3ff 100644 --- a/gtk/gtkbox.c +++ b/gtk/gtkbox.c @@ -12,9 +12,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ /* @@ -28,7 +26,7 @@ * SECTION:gtkbox * @Short_description: A container box * @Title: GtkBox - * @See_also: #GtkFrame, #GtkTable, #GtkLayout + * @See_also: #GtkFrame, #GtkGrid, #GtkLayout * * The GtkBox widget organizes child widgets into a rectangular area. * @@ -80,12 +78,16 @@ #include "config.h" #include "gtkbox.h" +#include "gtkboxprivate.h" +#include "gtkintl.h" #include "gtkorientable.h" -#include "gtksizerequest.h" -#include "gtktypebuiltins.h" +#include "gtkorientableprivate.h" #include "gtkprivate.h" -#include "gtkintl.h" -#include "a11y/gtkboxaccessible.h" +#include "gtktypebuiltins.h" +#include "gtksizerequest.h" +#include "gtkwidgetpath.h" +#include "gtkwidgetprivate.h" +#include "a11y/gtkcontaineraccessible.h" enum { @@ -315,7 +317,7 @@ gtk_box_class_init (GtkBoxClass *class) g_type_class_add_private (object_class, sizeof (GtkBoxPrivate)); - gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_BOX_ACCESSIBLE); + gtk_widget_class_set_accessible_role (widget_class, ATK_ROLE_FILLER); } static void @@ -353,6 +355,7 @@ gtk_box_set_property (GObject *object, { case PROP_ORIENTATION: private->orientation = g_value_get_enum (value); + _gtk_orientable_set_style_classes (GTK_ORIENTABLE (box)); gtk_widget_queue_resize (GTK_WIDGET (box)); break; case PROP_SPACING: @@ -861,18 +864,24 @@ count_widget_position (GtkWidget *widget, count->before++; } -static guint -gtk_box_get_visible_position (GtkBox *box, +static gint +gtk_box_get_visible_position (GtkBox *box, GtkWidget *child) { CountingData count = { child, FALSE, 0, 0 }; - /* forall iterates in visible order */ - gtk_container_forall (GTK_CONTAINER (box), - count_widget_position, - &count); + /* foreach iterates in visible order */ + gtk_container_foreach (GTK_CONTAINER (box), + count_widget_position, + &count); + + /* the child wasn't found, it's likely an internal child of some + * subclass, return -1 to indicate that there is no sibling relation + * to the regular box children + */ + if (!count.found) + return -1; - g_assert (count.found); if (box->priv->orientation == GTK_ORIENTATION_HORIZONTAL && gtk_widget_get_direction (GTK_WIDGET (box)) == GTK_TEXT_DIR_RTL) return count.after; @@ -892,10 +901,12 @@ gtk_box_get_path_for_child (GtkContainer *container, box = GTK_BOX (container); private = box->priv; - path = gtk_widget_path_copy (gtk_widget_get_path (GTK_WIDGET (container))); + path = _gtk_widget_create_path (GTK_WIDGET (container)); if (gtk_widget_get_visible (child)) { + gint position; + sibling_path = gtk_widget_path_new (); /* get_children works in visible order */ @@ -911,13 +922,17 @@ gtk_box_get_path_for_child (GtkContainer *container, gtk_widget_path_append_for_widget (sibling_path, list->data); } - g_list_free (children); - gtk_widget_path_append_with_siblings (path, - sibling_path, - gtk_box_get_visible_position (box, - child)); - gtk_widget_path_unref (sibling_path); + g_list_free (children); + + position = gtk_box_get_visible_position (box, child); + + if (position >= 0) + gtk_widget_path_append_with_siblings (path, sibling_path, position); + else + gtk_widget_path_append_for_widget (path, child); + + gtk_widget_path_unref (sibling_path); } else gtk_widget_path_append_for_widget (path, child); @@ -925,11 +940,17 @@ gtk_box_get_path_for_child (GtkContainer *container, return path; } +static void +gtk_box_invalidate_order_foreach (GtkWidget *widget) +{ + _gtk_widget_invalidate_style_context (widget, GTK_CSS_CHANGE_POSITION | GTK_CSS_CHANGE_SIBLING_POSITION); +} + static void gtk_box_invalidate_order (GtkBox *box) { gtk_container_foreach (GTK_CONTAINER (box), - (GtkCallback) gtk_widget_reset_style, + (GtkCallback) gtk_box_invalidate_order_foreach, NULL); } @@ -1742,7 +1763,7 @@ gtk_box_set_child_packing (GtkBox *box, pack_type = GTK_PACK_START; if (child_info->pack != pack_type) { - child_info->pack = GTK_PACK_END; + child_info->pack = pack_type; gtk_widget_child_notify (child, "pack-type"); gtk_box_invalidate_order (box); } @@ -1796,13 +1817,13 @@ gtk_box_remove (GtkContainer *container, { gboolean was_visible; - was_visible = gtk_widget_get_visible (widget); - gtk_widget_unparent (widget); - g_signal_handlers_disconnect_by_func (widget, box_child_visibility_notify_cb, box); + was_visible = gtk_widget_get_visible (widget); + gtk_widget_unparent (widget); + priv->children = g_list_remove_link (priv->children, children); g_list_free (children); g_free (child);