X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkfixed.c;h=14c35afc84e18048d95cba46ae9b00afb94cf23c;hb=dc331ccb171151d737112d8dc55b25709271d2c7;hp=b59cb781cfd21f5d2253887718a424dcc6160918;hpb=90408c4641e6493913eb859a67b3965bca259558;p=~andy%2Fgtk diff --git a/gtk/gtkfixed.c b/gtk/gtkfixed.c index b59cb781c..14c35afc8 100644 --- a/gtk/gtkfixed.c +++ b/gtk/gtkfixed.c @@ -2,105 +2,169 @@ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public + * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. + * Lesser General Public License for more details. * - * You should have received a copy of the GNU Library 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. + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . */ -#include "gtkfixed.h" +/* + * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GTK+ Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GTK+ at ftp://ftp.gtk.org/pub/gtk/. + */ -static void gtk_fixed_class_init (GtkFixedClass *klass); -static void gtk_fixed_init (GtkFixed *fixed); -static void gtk_fixed_map (GtkWidget *widget); -static void gtk_fixed_unmap (GtkWidget *widget); -static void gtk_fixed_realize (GtkWidget *widget); -static void gtk_fixed_size_request (GtkWidget *widget, - GtkRequisition *requisition); -static void gtk_fixed_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static void gtk_fixed_paint (GtkWidget *widget, - GdkRectangle *area); -static void gtk_fixed_draw (GtkWidget *widget, - GdkRectangle *area); -static gint gtk_fixed_expose (GtkWidget *widget, - GdkEventExpose *event); -static void gtk_fixed_add (GtkContainer *container, - GtkWidget *widget); -static void gtk_fixed_remove (GtkContainer *container, - GtkWidget *widget); -static void gtk_fixed_foreach (GtkContainer *container, - GtkCallback callback, - gpointer callback_data); -static GtkType gtk_fixed_child_type (GtkContainer *container); +/** + * SECTION:gtkfixed + * @Short_description: A container which allows you to position + * widgets at fixed coordinates + * @Title: GtkFixed + * + * The #GtkFixed widget is a container which can place child widgets + * at fixed positions and with fixed sizes, given in pixels. #GtkFixed + * performs no automatic layout management. + * + * For most applications, you should not use this container! It keeps + * you from having to learn about the other GTK+ containers, but it + * results in broken applications. With #GtkFixed, the following + * things will result in truncated text, overlapping widgets, and + * other display bugs: + * + * + * Themes, which may change widget sizes. + * + * + * Fonts other than the one you used to write the app will of course + * change the size of widgets containing text; keep in mind that + * users may use a larger font because of difficulty reading the + * default, or they may be using Windows or the framebuffer port of + * GTK+, where different fonts are available. + * + * + * Translation of text into other languages changes its size. Also, + * display of non-English text will use a different font in many + * cases. + * + * + * + * In addition, the fixed widget can't properly be mirrored in + * right-to-left languages such as Hebrew and Arabic. i.e. normally + * GTK+ will flip the interface to put labels to the right of the + * thing they label, but it can't do that with #GtkFixed. So your + * application will not be usable in right-to-left languages. + * + * Finally, fixed positioning makes it kind of annoying to add/remove + * GUI elements, since you have to reposition all the other + * elements. This is a long-term maintenance problem for your + * application. + * + * If you know none of these things are an issue for your application, + * and prefer the simplicity of #GtkFixed, by all means use the + * widget. But you should be aware of the tradeoffs. + */ +#include "config.h" -static GtkContainerClass *parent_class = NULL; +#include "gtkfixed.h" + +#include "gtkprivate.h" +#include "gtkintl.h" -guint -gtk_fixed_get_type (void) +struct _GtkFixedPrivate { - static guint fixed_type = 0; + GList *children; +}; - if (!fixed_type) - { - GtkTypeInfo fixed_info = - { - "GtkFixed", - sizeof (GtkFixed), - sizeof (GtkFixedClass), - (GtkClassInitFunc) gtk_fixed_class_init, - (GtkObjectInitFunc) gtk_fixed_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - fixed_type = gtk_type_unique (gtk_container_get_type (), &fixed_info); - } +enum { + CHILD_PROP_0, + CHILD_PROP_X, + CHILD_PROP_Y +}; - return fixed_type; -} +static void gtk_fixed_realize (GtkWidget *widget); +static void gtk_fixed_get_preferred_width (GtkWidget *widget, + gint *minimum, + gint *natural); +static void gtk_fixed_get_preferred_height (GtkWidget *widget, + gint *minimum, + gint *natural); +static void gtk_fixed_size_allocate (GtkWidget *widget, + GtkAllocation *allocation); +static void gtk_fixed_add (GtkContainer *container, + GtkWidget *widget); +static void gtk_fixed_remove (GtkContainer *container, + GtkWidget *widget); +static void gtk_fixed_forall (GtkContainer *container, + gboolean include_internals, + GtkCallback callback, + gpointer callback_data); +static GType gtk_fixed_child_type (GtkContainer *container); + +static void gtk_fixed_set_child_property (GtkContainer *container, + GtkWidget *child, + guint property_id, + const GValue *value, + GParamSpec *pspec); +static void gtk_fixed_get_child_property (GtkContainer *container, + GtkWidget *child, + guint property_id, + GValue *value, + GParamSpec *pspec); + +G_DEFINE_TYPE (GtkFixed, gtk_fixed, GTK_TYPE_CONTAINER) static void gtk_fixed_class_init (GtkFixedClass *class) { - GtkObjectClass *object_class; GtkWidgetClass *widget_class; GtkContainerClass *container_class; - object_class = (GtkObjectClass*) class; widget_class = (GtkWidgetClass*) class; container_class = (GtkContainerClass*) class; - parent_class = gtk_type_class (gtk_container_get_type ()); - - widget_class->map = gtk_fixed_map; - widget_class->unmap = gtk_fixed_unmap; widget_class->realize = gtk_fixed_realize; - widget_class->size_request = gtk_fixed_size_request; + widget_class->get_preferred_width = gtk_fixed_get_preferred_width; + widget_class->get_preferred_height = gtk_fixed_get_preferred_height; widget_class->size_allocate = gtk_fixed_size_allocate; - widget_class->draw = gtk_fixed_draw; - widget_class->expose_event = gtk_fixed_expose; container_class->add = gtk_fixed_add; container_class->remove = gtk_fixed_remove; - container_class->foreach = gtk_fixed_foreach; + container_class->forall = gtk_fixed_forall; container_class->child_type = gtk_fixed_child_type; + container_class->set_child_property = gtk_fixed_set_child_property; + container_class->get_child_property = gtk_fixed_get_child_property; + gtk_container_class_handle_border_width (container_class); + + gtk_container_class_install_child_property (container_class, + CHILD_PROP_X, + g_param_spec_int ("x", + P_("X position"), + P_("X position of child widget"), + G_MININT, G_MAXINT, 0, + GTK_PARAM_READWRITE)); + + gtk_container_class_install_child_property (container_class, + CHILD_PROP_Y, + g_param_spec_int ("y", + P_("Y position"), + P_("Y position of child widget"), + G_MININT, G_MAXINT, 0, + GTK_PARAM_READWRITE)); + + g_type_class_add_private (class, sizeof (GtkFixedPrivate)); } -static GtkType -gtk_fixed_child_type (GtkContainer *container) +static GType +gtk_fixed_child_type (GtkContainer *container) { return GTK_TYPE_WIDGET; } @@ -108,32 +172,66 @@ gtk_fixed_child_type (GtkContainer *container) static void gtk_fixed_init (GtkFixed *fixed) { - GTK_WIDGET_UNSET_FLAGS (fixed, GTK_NO_WINDOW); - GTK_WIDGET_SET_FLAGS (fixed, GTK_BASIC); - - fixed->children = NULL; + fixed->priv = G_TYPE_INSTANCE_GET_PRIVATE (fixed, GTK_TYPE_FIXED, GtkFixedPrivate); + + gtk_widget_set_has_window (GTK_WIDGET (fixed), FALSE); + + fixed->priv->children = NULL; } +/** + * gtk_fixed_new: + * + * Creates a new #GtkFixed. + * + * Returns: a new #GtkFixed. + */ GtkWidget* gtk_fixed_new (void) { - GtkFixed *fixed; + return g_object_new (GTK_TYPE_FIXED, NULL); +} + +static GtkFixedChild* +get_child (GtkFixed *fixed, + GtkWidget *widget) +{ + GtkFixedPrivate *priv = fixed->priv; + GList *children; - fixed = gtk_type_new (gtk_fixed_get_type ()); - return GTK_WIDGET (fixed); + for (children = priv->children; children; children = children->next) + { + GtkFixedChild *child; + + child = children->data; + + if (child->widget == widget) + return child; + } + + return NULL; } +/** + * gtk_fixed_put: + * @fixed: a #GtkFixed. + * @widget: the widget to add. + * @x: the horizontal position to place the widget at. + * @y: the vertical position to place the widget at. + * + * Adds a widget to a #GtkFixed container at the given position. + */ void -gtk_fixed_put (GtkFixed *fixed, - GtkWidget *widget, - gint16 x, - gint16 y) +gtk_fixed_put (GtkFixed *fixed, + GtkWidget *widget, + gint x, + gint y) { + GtkFixedPrivate *priv = fixed->priv; GtkFixedChild *child_info; - g_return_if_fail (fixed != NULL); g_return_if_fail (GTK_IS_FIXED (fixed)); - g_return_if_fail (widget != NULL); + g_return_if_fail (GTK_IS_WIDGET (widget)); child_info = g_new (GtkFixedChild, 1); child_info->widget = widget; @@ -142,344 +240,305 @@ gtk_fixed_put (GtkFixed *fixed, gtk_widget_set_parent (widget, GTK_WIDGET (fixed)); - fixed->children = g_list_append (fixed->children, child_info); - - if (GTK_WIDGET_REALIZED (fixed) && !GTK_WIDGET_REALIZED (widget)) - gtk_widget_realize (widget); - - if (GTK_WIDGET_MAPPED (fixed) && !GTK_WIDGET_MAPPED (widget)) - gtk_widget_map (widget); - - if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_VISIBLE (fixed)) - gtk_widget_queue_resize (GTK_WIDGET (fixed)); + priv->children = g_list_append (priv->children, child_info); } -void -gtk_fixed_move (GtkFixed *fixed, - GtkWidget *widget, - gint16 x, - gint16 y) +static void +gtk_fixed_move_internal (GtkFixed *fixed, + GtkFixedChild *child, + gint x, + gint y) { - GtkFixedChild *child; - GList *children; - - g_return_if_fail (fixed != NULL); g_return_if_fail (GTK_IS_FIXED (fixed)); - g_return_if_fail (widget != NULL); + g_return_if_fail (gtk_widget_get_parent (child->widget) == GTK_WIDGET (fixed)); - children = fixed->children; - while (children) + gtk_widget_freeze_child_notify (child->widget); + + if (child->x != x) { - child = children->data; - children = children->next; + child->x = x; + gtk_widget_child_notify (child->widget, "x"); + } - if (child->widget == widget) - { - child->x = x; - child->y = y; + if (child->y != y) + { + child->y = y; + gtk_widget_child_notify (child->widget, "y"); + } - if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_VISIBLE (fixed)) - gtk_widget_queue_resize (GTK_WIDGET (fixed)); + gtk_widget_thaw_child_notify (child->widget); - break; - } - } + if (gtk_widget_get_visible (child->widget) && + gtk_widget_get_visible (GTK_WIDGET (fixed))) + gtk_widget_queue_resize (GTK_WIDGET (fixed)); } -static void -gtk_fixed_map (GtkWidget *widget) +/** + * gtk_fixed_move: + * @fixed: a #GtkFixed. + * @widget: the child widget. + * @x: the horizontal position to move the widget to. + * @y: the vertical position to move the widget to. + * + * Moves a child of a #GtkFixed container to the given position. + */ +void +gtk_fixed_move (GtkFixed *fixed, + GtkWidget *widget, + gint x, + gint y) { - GtkFixed *fixed; - GtkFixedChild *child; - GList *children; - - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_FIXED (widget)); + gtk_fixed_move_internal (fixed, get_child (fixed, widget), x, y); +} - GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED); - fixed = GTK_FIXED (widget); +static void +gtk_fixed_set_child_property (GtkContainer *container, + GtkWidget *child, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GtkFixed *fixed = GTK_FIXED (container); + GtkFixedChild *fixed_child; - gdk_window_show (widget->window); + fixed_child = get_child (fixed, child); - children = fixed->children; - while (children) + switch (property_id) { - child = children->data; - children = children->next; - - if (GTK_WIDGET_VISIBLE (child->widget) && - !GTK_WIDGET_MAPPED (child->widget)) - gtk_widget_map (child->widget); + case CHILD_PROP_X: + gtk_fixed_move_internal (fixed, + fixed_child, + g_value_get_int (value), + fixed_child->y); + break; + case CHILD_PROP_Y: + gtk_fixed_move_internal (fixed, + fixed_child, + fixed_child->x, + g_value_get_int (value)); + break; + default: + GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec); + break; } } static void -gtk_fixed_unmap (GtkWidget *widget) +gtk_fixed_get_child_property (GtkContainer *container, + GtkWidget *child, + guint property_id, + GValue *value, + GParamSpec *pspec) { - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_FIXED (widget)); + GtkFixedChild *fixed_child; - GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED); + fixed_child = get_child (GTK_FIXED (container), child); + + switch (property_id) + { + case CHILD_PROP_X: + g_value_set_int (value, fixed_child->x); + break; + case CHILD_PROP_Y: + g_value_set_int (value, fixed_child->y); + break; + default: + GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec); + break; + } } static void gtk_fixed_realize (GtkWidget *widget) { + GtkAllocation allocation; + GdkWindow *window; GdkWindowAttr attributes; gint attributes_mask; - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_FIXED (widget)); + if (!gtk_widget_get_has_window (widget)) + GTK_WIDGET_CLASS (gtk_fixed_parent_class)->realize (widget); + else + { + gtk_widget_set_realized (widget, TRUE); - GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); + gtk_widget_get_allocation (widget, &allocation); - attributes.window_type = GDK_WINDOW_CHILD; - attributes.x = widget->allocation.x; - attributes.y = widget->allocation.y; - attributes.width = widget->allocation.width; - attributes.height = widget->allocation.height; - attributes.wclass = GDK_INPUT_OUTPUT; - attributes.visual = gtk_widget_get_visual (widget); - attributes.colormap = gtk_widget_get_colormap (widget); - attributes.event_mask = gtk_widget_get_events (widget); - attributes.event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK; + attributes.window_type = GDK_WINDOW_CHILD; + attributes.x = allocation.x; + attributes.y = allocation.y; + attributes.width = allocation.width; + attributes.height = allocation.height; + attributes.wclass = GDK_INPUT_OUTPUT; + attributes.visual = gtk_widget_get_visual (widget); + attributes.event_mask = gtk_widget_get_events (widget); + attributes.event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK; - attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; + attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; - widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, - attributes_mask); - gdk_window_set_user_data (widget->window, widget); + window = gdk_window_new (gtk_widget_get_parent_window (widget), + &attributes, attributes_mask); + gtk_widget_set_window (widget, window); + gtk_widget_register_window (widget, window); - widget->style = gtk_style_attach (widget->style, widget->window); - gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); + gtk_style_context_set_background (gtk_widget_get_style_context (widget), + window); + } } static void -gtk_fixed_size_request (GtkWidget *widget, - GtkRequisition *requisition) +gtk_fixed_get_preferred_width (GtkWidget *widget, + gint *minimum, + gint *natural) { - GtkFixed *fixed; + GtkFixed *fixed = GTK_FIXED (widget); + GtkFixedPrivate *priv = fixed->priv; GtkFixedChild *child; GList *children; + gint child_min, child_nat; - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_FIXED (widget)); - g_return_if_fail (requisition != NULL); - - fixed = GTK_FIXED (widget); - requisition->width = 0; - requisition->height = 0; + *minimum = 0; + *natural = 0; - children = fixed->children; - while (children) + for (children = priv->children; children; children = children->next) { child = children->data; - children = children->next; - if (GTK_WIDGET_VISIBLE (child->widget)) - { - gtk_widget_size_request (child->widget, &child->widget->requisition); - - requisition->height = MAX (requisition->height, - child->y + - child->widget->requisition.height); - requisition->width = MAX (requisition->width, - child->x + - child->widget->requisition.width); - } - } + if (!gtk_widget_get_visible (child->widget)) + continue; + + gtk_widget_get_preferred_width (child->widget, &child_min, &child_nat); - requisition->height += GTK_CONTAINER (fixed)->border_width * 2; - requisition->width += GTK_CONTAINER (fixed)->border_width * 2; + *minimum = MAX (*minimum, child->x + child_min); + *natural = MAX (*natural, child->x + child_nat); + } } static void -gtk_fixed_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) +gtk_fixed_get_preferred_height (GtkWidget *widget, + gint *minimum, + gint *natural) { - GtkFixed *fixed; + GtkFixed *fixed = GTK_FIXED (widget); + GtkFixedPrivate *priv = fixed->priv; GtkFixedChild *child; - GtkAllocation child_allocation; GList *children; - guint16 border_width; - - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_FIXED(widget)); - g_return_if_fail (allocation != NULL); + gint child_min, child_nat; - fixed = GTK_FIXED (widget); + *minimum = 0; + *natural = 0; - widget->allocation = *allocation; - if (GTK_WIDGET_REALIZED (widget)) - gdk_window_move_resize (widget->window, - allocation->x, - allocation->y, - allocation->width, - allocation->height); - - border_width = GTK_CONTAINER (fixed)->border_width; - - children = fixed->children; - while (children) + for (children = priv->children; children; children = children->next) { child = children->data; - children = children->next; - - if (GTK_WIDGET_VISIBLE (child->widget)) - { - child_allocation.x = child->x + border_width; - child_allocation.y = child->y + border_width; - child_allocation.width = child->widget->requisition.width; - child_allocation.height = child->widget->requisition.height; - gtk_widget_size_allocate (child->widget, &child_allocation); - } - } -} -static void -gtk_fixed_paint (GtkWidget *widget, - GdkRectangle *area) -{ - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_FIXED (widget)); - g_return_if_fail (area != NULL); - - if (GTK_WIDGET_DRAWABLE (widget)) - gdk_window_clear_area (widget->window, - area->x, area->y, - area->width, area->height); + if (!gtk_widget_get_visible (child->widget)) + continue; + + gtk_widget_get_preferred_height (child->widget, &child_min, &child_nat); + + *minimum = MAX (*minimum, child->y + child_min); + *natural = MAX (*natural, child->y + child_nat); + } } static void -gtk_fixed_draw (GtkWidget *widget, - GdkRectangle *area) +gtk_fixed_size_allocate (GtkWidget *widget, + GtkAllocation *allocation) { - GtkFixed *fixed; + GtkFixed *fixed = GTK_FIXED (widget); + GtkFixedPrivate *priv = fixed->priv; GtkFixedChild *child; - GdkRectangle child_area; + GtkAllocation child_allocation; + GtkRequisition child_requisition; GList *children; - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_FIXED (widget)); + gtk_widget_set_allocation (widget, allocation); - if (GTK_WIDGET_DRAWABLE (widget)) + if (gtk_widget_get_has_window (widget)) { - fixed = GTK_FIXED (widget); - gtk_fixed_paint (widget, area); - - children = fixed->children; - while (children) - { - child = children->data; - children = children->next; - - if (gtk_widget_intersect (child->widget, area, &child_area)) - gtk_widget_draw (child->widget, &child_area); - } + if (gtk_widget_get_realized (widget)) + gdk_window_move_resize (gtk_widget_get_window (widget), + allocation->x, + allocation->y, + allocation->width, + allocation->height); } -} - -static gint -gtk_fixed_expose (GtkWidget *widget, - GdkEventExpose *event) -{ - GtkFixed *fixed; - GtkFixedChild *child; - GdkEventExpose child_event; - GList *children; - - g_return_val_if_fail (widget != NULL, FALSE); - g_return_val_if_fail (GTK_IS_FIXED (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - if (GTK_WIDGET_DRAWABLE (widget)) + for (children = priv->children; children; children = children->next) { - fixed = GTK_FIXED (widget); + child = children->data; - child_event = *event; + if (!gtk_widget_get_visible (child->widget)) + continue; - children = fixed->children; - while (children) - { - child = children->data; - children = children->next; + gtk_widget_get_preferred_size (child->widget, &child_requisition, NULL); + child_allocation.x = child->x; + child_allocation.y = child->y; - if (GTK_WIDGET_NO_WINDOW (child->widget) && - gtk_widget_intersect (child->widget, &event->area, - &child_event.area)) - gtk_widget_event (child->widget, (GdkEvent*) &child_event); - } - } + if (!gtk_widget_get_has_window (widget)) + { + child_allocation.x += allocation->x; + child_allocation.y += allocation->y; + } - return FALSE; + child_allocation.width = child_requisition.width; + child_allocation.height = child_requisition.height; + gtk_widget_size_allocate (child->widget, &child_allocation); + } } static void gtk_fixed_add (GtkContainer *container, - GtkWidget *widget) + GtkWidget *widget) { - g_return_if_fail (container != NULL); - g_return_if_fail (GTK_IS_FIXED (container)); - g_return_if_fail (widget != NULL); - gtk_fixed_put (GTK_FIXED (container), widget, 0, 0); } static void gtk_fixed_remove (GtkContainer *container, - GtkWidget *widget) + GtkWidget *widget) { - GtkFixed *fixed; + GtkFixed *fixed = GTK_FIXED (container); + GtkFixedPrivate *priv = fixed->priv; GtkFixedChild *child; + GtkWidget *widget_container = GTK_WIDGET (container); GList *children; - g_return_if_fail (container != NULL); - g_return_if_fail (GTK_IS_FIXED (container)); - g_return_if_fail (widget != NULL); - - fixed = GTK_FIXED (container); - - children = fixed->children; - while (children) + for (children = priv->children; children; children = children->next) { child = children->data; if (child->widget == widget) - { - gboolean was_visible = GTK_WIDGET_VISIBLE (widget); - - gtk_widget_unparent (widget); + { + gboolean was_visible = gtk_widget_get_visible (widget); - fixed->children = g_list_remove_link (fixed->children, children); - g_list_free (children); - g_free (child); + gtk_widget_unparent (widget); - if (was_visible && GTK_WIDGET_VISIBLE (container)) - gtk_widget_queue_resize (GTK_WIDGET (container)); + priv->children = g_list_remove_link (priv->children, children); + g_list_free (children); + g_free (child); - break; - } + if (was_visible && gtk_widget_get_visible (widget_container)) + gtk_widget_queue_resize (widget_container); - children = children->next; + break; + } } } static void -gtk_fixed_foreach (GtkContainer *container, - GtkCallback callback, - gpointer callback_data) +gtk_fixed_forall (GtkContainer *container, + gboolean include_internals, + GtkCallback callback, + gpointer callback_data) { - GtkFixed *fixed; + GtkFixed *fixed = GTK_FIXED (container); + GtkFixedPrivate *priv = fixed->priv; GtkFixedChild *child; GList *children; - g_return_if_fail (container != NULL); - g_return_if_fail (GTK_IS_FIXED (container)); - g_return_if_fail (callback != NULL); - - fixed = GTK_FIXED (container); - - children = fixed->children; + children = priv->children; while (children) { child = children->data;