*/
#include "config.h"
+
+#include "gtkcontainer.h"
+
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
-#include "gtkcontainer.h"
#include "gtkbuildable.h"
#include "gtkbuilderprivate.h"
#include "gtkprivate.h"
#include "gtkmain.h"
#include "gtkmarshalers.h"
+#include "gtksizerequest.h"
#include "gtkwindow.h"
#include "gtkintl.h"
#include "gtktoolbar.h"
#include <gobject/gobjectnotifyqueue.c>
#include <gobject/gvaluecollector.h>
-#include "gtkalias.h"
+struct _GtkContainerPrivate
+{
+ GtkWidget *focus_child;
+
+ guint border_width : 16;
+
+ guint has_focus_chain : 1;
+ guint need_resize : 1;
+ guint reallocate_redraws : 1;
+ guint resize_mode : 2;
+};
enum {
ADD,
GdkEventExpose *event);
static void gtk_container_map (GtkWidget *widget);
static void gtk_container_unmap (GtkWidget *widget);
+static void gtk_container_adjust_size_request (GtkWidget *widget,
+ GtkOrientation orientation,
+ gint for_size,
+ gint *minimum_size,
+ gint *natural_size);
+static void gtk_container_adjust_size_allocation (GtkWidget *widget,
+ GtkAllocation *allocation);
static gchar* gtk_container_child_default_composite_name (GtkContainer *container,
GtkWidget *child);
widget_class->map = gtk_container_map;
widget_class->unmap = gtk_container_unmap;
widget_class->focus = gtk_container_focus;
-
+
+ widget_class->adjust_size_request = gtk_container_adjust_size_request;
+ widget_class->adjust_size_allocation = gtk_container_adjust_size_allocation;
+
class->add = gtk_container_add_unimplemented;
class->remove = gtk_container_remove_unimplemented;
class->check_resize = gtk_container_real_check_resize;
_gtk_marshal_VOID__OBJECT,
G_TYPE_NONE, 1,
GTK_TYPE_WIDGET);
+
+ g_type_class_add_private (class, sizeof (GtkContainerPrivate));
}
static void
{
GTK_BUILDER_WARN_INVALID_CHILD_TYPE (buildable, type);
}
- else if (GTK_IS_WIDGET (child) && GTK_WIDGET (child)->parent == NULL)
+ else if (GTK_IS_WIDGET (child) &&
+ gtk_widget_get_parent (GTK_WIDGET (child)) == NULL)
{
gtk_container_add (GTK_CONTAINER (buildable), GTK_WIDGET (child));
}
g_return_if_fail (GTK_IS_CONTAINER (container));
g_return_if_fail (GTK_IS_WIDGET (child));
- g_return_if_fail (child->parent == GTK_WIDGET (container));
+ g_return_if_fail (gtk_widget_get_parent (child) == GTK_WIDGET (container));
g_object_ref (container);
g_object_ref (child);
g_return_if_fail (GTK_IS_CONTAINER (container));
g_return_if_fail (GTK_IS_WIDGET (child));
- g_return_if_fail (child->parent == GTK_WIDGET (container));
+ g_return_if_fail (gtk_widget_get_parent (child) == GTK_WIDGET (container));
g_return_if_fail (property_name != NULL);
g_return_if_fail (G_IS_VALUE (value));
g_return_if_fail (GTK_IS_CONTAINER (container));
g_return_if_fail (GTK_IS_WIDGET (child));
- g_return_if_fail (child->parent == GTK_WIDGET (container));
+ g_return_if_fail (gtk_widget_get_parent (child) == GTK_WIDGET (container));
g_object_ref (container);
g_object_ref (child);
g_return_if_fail (GTK_IS_CONTAINER (container));
g_return_if_fail (GTK_IS_WIDGET (child));
- g_return_if_fail (child->parent == GTK_WIDGET (container));
+ g_return_if_fail (gtk_widget_get_parent (child) == GTK_WIDGET (container));
g_return_if_fail (property_name != NULL);
g_return_if_fail (G_IS_VALUE (value));
{
g_return_if_fail (GTK_IS_CONTAINER (container));
g_return_if_fail (GTK_IS_WIDGET (widget));
- g_return_if_fail (widget->parent == NULL);
+ g_return_if_fail (gtk_widget_get_parent (widget) == NULL);
g_object_ref (container);
g_object_ref (widget);
gtk_widget_freeze_child_notify (widget);
g_signal_emit (container, container_signals[ADD], 0, widget);
- if (widget->parent)
+ if (gtk_widget_get_parent (widget))
{
va_list var_args;
g_return_if_fail (GTK_IS_CONTAINER (container));
g_return_if_fail (GTK_IS_WIDGET (child));
- g_return_if_fail (child->parent == GTK_WIDGET (container));
+ g_return_if_fail (gtk_widget_get_parent (child) == GTK_WIDGET (container));
va_start (var_args, first_prop_name);
gtk_container_child_set_valist (container, child, first_prop_name, var_args);
g_return_if_fail (GTK_IS_CONTAINER (container));
g_return_if_fail (GTK_IS_WIDGET (child));
- g_return_if_fail (child->parent == GTK_WIDGET (container));
+ g_return_if_fail (gtk_widget_get_parent (child) == GTK_WIDGET (container));
va_start (var_args, first_prop_name);
gtk_container_child_get_valist (container, child, first_prop_name, var_args);
static void
gtk_container_init (GtkContainer *container)
{
- container->focus_child = NULL;
- container->border_width = 0;
- container->need_resize = FALSE;
- container->resize_mode = GTK_RESIZE_PARENT;
- container->reallocate_redraws = FALSE;
+ GtkContainerPrivate *priv;
+
+ container->priv = G_TYPE_INSTANCE_GET_PRIVATE (container,
+ GTK_TYPE_CONTAINER,
+ GtkContainerPrivate);
+ priv = container->priv;
+
+ priv->focus_child = NULL;
+ priv->border_width = 0;
+ priv->need_resize = FALSE;
+ priv->resize_mode = GTK_RESIZE_PARENT;
+ priv->reallocate_redraws = FALSE;
}
static void
gtk_container_destroy (GtkObject *object)
{
GtkContainer *container = GTK_CONTAINER (object);
+ GtkContainerPrivate *priv = container->priv;
if (GTK_CONTAINER_RESIZE_PENDING (container))
_gtk_container_dequeue_resize_handler (container);
+ if (priv->focus_child)
+ {
+ g_object_unref (priv->focus_child);
+ priv->focus_child = NULL;
+ }
+
/* do this before walking child widgets, to avoid
* removing children from focus chain one by one.
*/
- if (container->has_focus_chain)
+ if (priv->has_focus_chain)
gtk_container_unset_focus_chain (container);
gtk_container_foreach (container, (GtkCallback) gtk_widget_destroy, NULL);
GParamSpec *pspec)
{
GtkContainer *container = GTK_CONTAINER (object);
+ GtkContainerPrivate *priv = container->priv;
switch (prop_id)
{
case PROP_BORDER_WIDTH:
- g_value_set_uint (value, container->border_width);
+ g_value_set_uint (value, priv->border_width);
break;
case PROP_RESIZE_MODE:
- g_value_set_enum (value, container->resize_mode);
+ g_value_set_enum (value, priv->resize_mode);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
gtk_container_set_border_width (GtkContainer *container,
guint border_width)
{
+ GtkContainerPrivate *priv;
+
g_return_if_fail (GTK_IS_CONTAINER (container));
- if (container->border_width != border_width)
+ priv = container->priv;
+
+ if (priv->border_width != border_width)
{
- container->border_width = border_width;
+ priv->border_width = border_width;
g_object_notify (G_OBJECT (container), "border-width");
if (gtk_widget_get_realized (GTK_WIDGET (container)))
{
g_return_val_if_fail (GTK_IS_CONTAINER (container), 0);
- return container->border_width;
+ return container->priv->border_width;
}
/**
gtk_container_add (GtkContainer *container,
GtkWidget *widget)
{
+ GtkWidget *parent;
+
g_return_if_fail (GTK_IS_CONTAINER (container));
g_return_if_fail (GTK_IS_WIDGET (widget));
- if (widget->parent != NULL)
+ parent = gtk_widget_get_parent (widget);
+
+ if (parent != NULL)
{
g_warning ("Attempting to add a widget with type %s to a container of "
"type %s, but the widget is already inside a container of type %s, "
"explains how to reparent a widget.",
g_type_name (G_OBJECT_TYPE (widget)),
g_type_name (G_OBJECT_TYPE (container)),
- g_type_name (G_OBJECT_TYPE (widget->parent)));
+ g_type_name (G_OBJECT_TYPE (parent)));
return;
}
{
g_return_if_fail (GTK_IS_CONTAINER (container));
g_return_if_fail (GTK_IS_WIDGET (widget));
+ g_return_if_fail (gtk_widget_get_parent (widget) == GTK_WIDGET (container));
- /* When using the deprecated API of the toolbar, it is possible
- * to legitimately call this function with a widget that is not
- * a direct child of the container.
- */
- g_return_if_fail (GTK_IS_TOOLBAR (container) ||
- widget->parent == GTK_WIDGET (container));
-
g_signal_emit (container, container_signals[REMOVE], 0, widget);
}
gtk_container_set_resize_mode (GtkContainer *container,
GtkResizeMode resize_mode)
{
+ GtkContainerPrivate *priv;
+
g_return_if_fail (GTK_IS_CONTAINER (container));
g_return_if_fail (resize_mode <= GTK_RESIZE_IMMEDIATE);
+
+ priv = container->priv;
if (gtk_widget_is_toplevel (GTK_WIDGET (container)) &&
resize_mode == GTK_RESIZE_PARENT)
resize_mode = GTK_RESIZE_QUEUE;
}
- if (container->resize_mode != resize_mode)
+ if (priv->resize_mode != resize_mode)
{
- container->resize_mode = resize_mode;
+ priv->resize_mode = resize_mode;
gtk_widget_queue_resize (GTK_WIDGET (container));
g_object_notify (G_OBJECT (container), "resize-mode");
{
g_return_val_if_fail (GTK_IS_CONTAINER (container), GTK_RESIZE_PARENT);
- return container->resize_mode;
+ return container->priv->resize_mode;
}
/**
{
g_return_if_fail (GTK_IS_CONTAINER (container));
- container->reallocate_redraws = needs_redraws ? TRUE : FALSE;
+ container->priv->reallocate_redraws = needs_redraws ? TRUE : FALSE;
}
static GtkContainer*
gtk_container_get_resize_container (GtkContainer *container)
{
+ GtkWidget *parent;
GtkWidget *widget = GTK_WIDGET (container);
- while (widget->parent)
+ while ((parent = gtk_widget_get_parent (widget)))
{
- widget = widget->parent;
+ widget = parent;
if (GTK_IS_RESIZE_CONTAINER (widget))
- break;
+ break;
}
return GTK_IS_RESIZE_CONTAINER (widget) ? (GtkContainer*) widget : NULL;
void
_gtk_container_queue_resize (GtkContainer *container)
{
+ GtkContainerPrivate *priv;
GtkContainer *resize_container;
+ GtkWidget *parent;
GtkWidget *widget;
g_return_if_fail (GTK_IS_CONTAINER (container));
+ priv = container->priv;
widget = GTK_WIDGET (container);
+
resize_container = gtk_container_get_resize_container (container);
while (TRUE)
{
GTK_PRIVATE_SET_FLAG (widget, GTK_ALLOC_NEEDED);
- GTK_PRIVATE_SET_FLAG (widget, GTK_REQUEST_NEEDED);
GTK_PRIVATE_SET_FLAG (widget, GTK_WIDTH_REQUEST_NEEDED);
GTK_PRIVATE_SET_FLAG (widget, GTK_HEIGHT_REQUEST_NEEDED);
if ((resize_container && widget == GTK_WIDGET (resize_container)) ||
- !widget->parent)
+ !(parent = gtk_widget_get_parent (widget)))
break;
-
- widget = widget->parent;
+
+ widget = parent;
}
if (resize_container)
(gtk_widget_is_toplevel (GTK_WIDGET (resize_container)) ||
gtk_widget_get_realized (GTK_WIDGET (resize_container))))
{
- switch (resize_container->resize_mode)
+ switch (resize_container->priv->resize_mode)
{
case GTK_RESIZE_QUEUE:
if (!GTK_CONTAINER_RESIZE_PENDING (resize_container))
* changed while they where hidden (currently only evaluated by
* toplevels).
*/
- resize_container->need_resize = TRUE;
+ resize_container->priv->need_resize = TRUE;
}
}
}
gtk_container_real_check_resize (GtkContainer *container)
{
GtkWidget *widget = GTK_WIDGET (container);
+ GtkAllocation allocation;
GtkRequisition requisition;
-
- gtk_widget_size_request (widget, &requisition);
-
- if (requisition.width > widget->allocation.width ||
- requisition.height > widget->allocation.height)
+
+ gtk_size_request_get_size (GTK_SIZE_REQUEST (widget),
+ &requisition, NULL);
+ gtk_widget_get_allocation (widget, &allocation);
+
+ if (requisition.width > allocation.width ||
+ requisition.height > allocation.height)
{
if (GTK_IS_RESIZE_CONTAINER (container))
- gtk_widget_size_allocate (GTK_WIDGET (container),
- >K_WIDGET (container)->allocation);
+ {
+ gtk_widget_size_allocate (widget, &allocation);
+ gtk_widget_set_allocation (widget, &allocation);
+ }
else
gtk_widget_queue_resize (widget);
}
void
gtk_container_resize_children (GtkContainer *container)
{
+ GtkAllocation allocation;
GtkWidget *widget;
/* resizing invariants:
g_return_if_fail (GTK_IS_CONTAINER (container));
widget = GTK_WIDGET (container);
- gtk_widget_size_allocate (widget, &widget->allocation);
+ gtk_widget_get_allocation (widget, &allocation);
+
+ gtk_widget_size_allocate (widget, &allocation);
+ gtk_widget_set_allocation (widget, &allocation);
+}
+
+static void
+gtk_container_adjust_size_request (GtkWidget *widget,
+ GtkOrientation orientation,
+ gint for_size,
+ gint *minimum_size,
+ gint *natural_size)
+{
+ GtkContainer *container;
+
+ container = GTK_CONTAINER (widget);
+
+ if (GTK_CONTAINER_GET_CLASS (widget)->handle_border_width)
+ {
+ int border_width;
+
+ border_width = container->priv->border_width;
+
+ *minimum_size += border_width * 2;
+ *natural_size += border_width * 2;
+ }
+
+ /* chain up last so gtk_widget_set_size_request() values
+ * will have a chance to overwrite our border width.
+ */
+ parent_class->adjust_size_request (widget, orientation, for_size,
+ minimum_size, natural_size);
+}
+
+static void
+gtk_container_adjust_size_allocation (GtkWidget *widget,
+ GtkAllocation *allocation)
+{
+ GtkContainer *container;
+ int border_width;
+
+ container = GTK_CONTAINER (widget);
+
+ parent_class->adjust_size_allocation (widget, allocation);
+
+ if (!GTK_CONTAINER_GET_CLASS (widget)->handle_border_width)
+ return;
+
+ border_width = container->priv->border_width;
+
+ allocation->width -= border_width * 2;
+ allocation->height -= border_width * 2;
+
+ /* If we get a pathological too-small allocation to hold
+ * even the border width, leave all allocation to the actual
+ * widget, and leave x,y unchanged. (GtkWidget's min size is
+ * 1x1 if you're wondering why <1 and not <0)
+ *
+ * As long as we have space, set x,y properly.
+ */
+
+ if (allocation->width < 1)
+ {
+ allocation->width += border_width * 2;
+ }
+ else
+ {
+ allocation->x += border_width;
+ }
+
+ if (allocation->height < 1)
+ {
+ allocation->height += border_width * 2;
+ }
+ else
+ {
+ allocation->y += border_width;
+ }
+}
+
+/**
+ * gtk_container_class_handle_border_width:
+ * @klass: the class struct of a #GtkContainer subclass
+ *
+ * Modifies a subclass of #GtkContainerClass to automatically add and
+ * remove the border-width setting on GtkContainer. This allows the
+ * subclass to ignore the border width in its size request and
+ * allocate methods. The intent is for a subclass to invoke this
+ * in its class_init function.
+ *
+ * gtk_container_class_handle_border_width() is necessary because it
+ * would break API too badly to make this behavior the default. So
+ * subclasses must "opt in" to the parent class handling border_width
+ * for them.
+ */
+void
+gtk_container_class_handle_border_width (GtkContainerClass *klass)
+{
+ g_return_if_fail (GTK_IS_CONTAINER_CLASS (klass));
+
+ klass->handle_border_width = TRUE;
}
/**
/**
* gtk_container_foreach:
* @container: a #GtkContainer
- * @callback: a callback
+ * @callback: (scope call): a callback
* @callback_data: callback user data
*
* Invokes @callback on each non-internal child of @container. See
* This function emits the GtkContainer::set_focus_child signal of
* @container. Implementations of #GtkContainer can override the
* default behaviour by overriding the class closure of this signal.
+ *
+ * This is function is mostly meant to be used by widgets. Applications can use
+ * gtk_widget_grab_focus() to manualy set the focus to a specific widget.
*/
void
gtk_container_set_focus_child (GtkContainer *container,
* gtk_container_get_focus_child:
* @container: a #GtkContainer
*
- * Returns the current focus child widget inside @container.
+ * Returns the current focus child widget inside @container. This is not the
+ * currently focused widget. That can be obtained by calling
+ * gtk_window_get_focus().
*
- * Returns: The child widget which has the focus
- * inside @container, or %NULL if none is set.
+ * Returns: The child widget which will recieve the focus inside @container when
+ * the @conatiner is focussed, or %NULL if none is set.
*
* Since: 2.14
**/
{
g_return_val_if_fail (GTK_IS_CONTAINER (container), NULL);
- return container->focus_child;
+ return container->priv->focus_child;
}
/**
g_return_val_if_fail (GTK_IS_CONTAINER (container), NULL);
g_return_val_if_fail (GTK_IS_WIDGET (child), NULL);
- g_return_val_if_fail (child->parent == GTK_WIDGET (container), NULL);
+ g_return_val_if_fail (gtk_widget_get_parent (child) == GTK_WIDGET (container), NULL);
g_object_get (child, "composite-child", &composite_child, NULL);
if (composite_child)
gtk_container_real_set_focus_child (GtkContainer *container,
GtkWidget *child)
{
+ GtkContainerPrivate *priv;
+
g_return_if_fail (GTK_IS_CONTAINER (container));
g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
- if (child != container->focus_child)
+ priv = container->priv;
+
+ if (child != priv->focus_child)
{
- if (container->focus_child)
- g_object_unref (container->focus_child);
- container->focus_child = child;
- if (container->focus_child)
- g_object_ref (container->focus_child);
+ if (priv->focus_child)
+ g_object_unref (priv->focus_child);
+ priv->focus_child = child;
+ if (priv->focus_child)
+ g_object_ref (priv->focus_child);
}
/* check for h/v adjustments
*/
- if (container->focus_child)
+ if (priv->focus_child)
{
GtkAdjustment *hadj;
GtkAdjustment *vadj;
+ GtkAllocation allocation;
GtkWidget *focus_child;
gint x, y;
if (hadj || vadj)
{
- focus_child = container->focus_child;
- while (GTK_IS_CONTAINER (focus_child) &&
- GTK_CONTAINER (focus_child)->focus_child)
+ focus_child = priv->focus_child;
+ while (gtk_container_get_focus_child (GTK_CONTAINER (focus_child)))
{
- focus_child = GTK_CONTAINER (focus_child)->focus_child;
+ focus_child = gtk_container_get_focus_child (GTK_CONTAINER (focus_child));
}
- gtk_widget_translate_coordinates (focus_child, container->focus_child,
+ gtk_widget_translate_coordinates (focus_child, priv->focus_child,
0, 0, &x, &y);
- x += container->focus_child->allocation.x;
- y += container->focus_child->allocation.y;
-
+ gtk_widget_get_allocation (priv->focus_child, &allocation);
+ x += allocation.x;
+ y += allocation.y;
+
+ gtk_widget_get_allocation (focus_child, &allocation);
+
if (vadj)
- gtk_adjustment_clamp_page (vadj, y, y + focus_child->allocation.height);
-
+ gtk_adjustment_clamp_page (vadj, y, y + allocation.height);
+
if (hadj)
- gtk_adjustment_clamp_page (hadj, x, x + focus_child->allocation.width);
+ gtk_adjustment_clamp_page (hadj, x, x + allocation.width);
}
}
}
GList *sorted_children;
gint return_val;
GtkContainer *container;
+ GtkContainerPrivate *priv;
g_return_val_if_fail (GTK_IS_CONTAINER (widget), FALSE);
container = GTK_CONTAINER (widget);
+ priv = container->priv;
return_val = FALSE;
/* Get a list of the containers children, allowing focus
* chain to override.
*/
- if (container->has_focus_chain)
+ if (priv->has_focus_chain)
children = g_list_copy (get_focus_chain (container));
else
children = gtk_container_get_all_children (container);
- if (container->has_focus_chain &&
+ if (priv->has_focus_chain &&
(direction == GTK_DIR_TAB_FORWARD ||
direction == GTK_DIR_TAB_BACKWARD))
{
gconstpointer b,
gpointer data)
{
+ GtkAllocation child1_allocation, child2_allocation;
const GtkWidget *child1 = a;
const GtkWidget *child2 = b;
GtkTextDirection text_direction = GPOINTER_TO_INT (data);
- gint y1 = child1->allocation.y + child1->allocation.height / 2;
- gint y2 = child2->allocation.y + child2->allocation.height / 2;
+ gtk_widget_get_allocation ((GtkWidget *) child1, &child1_allocation);
+ gtk_widget_get_allocation ((GtkWidget *) child2, &child2_allocation);
+
+ gint y1 = child1_allocation.y + child1_allocation.height / 2;
+ gint y2 = child2_allocation.y + child2_allocation.height / 2;
if (y1 == y2)
{
- gint x1 = child1->allocation.x + child1->allocation.width / 2;
- gint x2 = child2->allocation.x + child2->allocation.width / 2;
-
+ gint x1 = child1_allocation.x + child1_allocation.width / 2;
+ gint x2 = child2_allocation.x + child2_allocation.width / 2;
+
if (text_direction == GTK_TEXT_DIR_RTL)
return (x1 < x2) ? 1 : ((x1 == x2) ? 0 : -1);
else
GtkWidget *widget,
GdkRectangle *allocation)
{
- *allocation = widget->allocation;
+ gtk_widget_set_allocation (widget, allocation);
return gtk_widget_translate_coordinates (widget, GTK_WIDGET (container),
0, 0, &allocation->x, &allocation->y);
while (widget && widget != (GtkWidget *)container)
{
- GtkWidget *parent = widget->parent;
- if (parent && ((GtkContainer *)parent)->focus_child != widget)
+ GtkWidget *parent;
+
+ parent = gtk_widget_get_parent (widget);
+
+ if (parent && (gtk_container_get_focus_child (GTK_CONTAINER (parent)) != widget))
goto next;
widget = parent;
{
GtkWidget *widget = GTK_WIDGET (container);
GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
+ GtkWidget *old_focus;
- if (GTK_IS_WINDOW (toplevel) && GTK_WINDOW (toplevel)->focus_widget)
+ if (GTK_IS_WINDOW (toplevel))
{
- GtkWidget *old_focus = GTK_WINDOW (toplevel)->focus_widget;
-
- return get_allocation_coords (container, old_focus, old_focus_rect);
+ old_focus = gtk_window_get_focus (GTK_WINDOW (toplevel));
+ if (old_focus)
+ return get_allocation_coords (container, old_focus, old_focus_rect);
}
- else
- return FALSE;
+
+ return FALSE;
}
typedef struct _CompareInfo CompareInfo;
{
/* No old focus widget, need to figure out starting x,y some other way
*/
+ GtkAllocation allocation;
GtkWidget *widget = GTK_WIDGET (container);
GdkRectangle old_focus_rect;
+ gtk_widget_get_allocation (widget, &allocation);
+
if (old_focus_coords (container, &old_focus_rect))
{
compare.x = old_focus_rect.x + old_focus_rect.width / 2;
else
{
if (!gtk_widget_get_has_window (widget))
- compare.x = widget->allocation.x + widget->allocation.width / 2;
+ compare.x = allocation.x + allocation.width / 2;
else
- compare.x = widget->allocation.width / 2;
+ compare.x = allocation.width / 2;
}
if (!gtk_widget_get_has_window (widget))
- compare.y = (direction == GTK_DIR_DOWN) ? widget->allocation.y : widget->allocation.y + widget->allocation.height;
+ compare.y = (direction == GTK_DIR_DOWN) ? allocation.y : allocation.y + allocation.height;
else
- compare.y = (direction == GTK_DIR_DOWN) ? 0 : + widget->allocation.height;
+ compare.y = (direction == GTK_DIR_DOWN) ? 0 : + allocation.height;
}
children = g_list_sort_with_data (children, up_down_compare, &compare);
{
/* No old focus widget, need to figure out starting x,y some other way
*/
+ GtkAllocation allocation;
GtkWidget *widget = GTK_WIDGET (container);
GdkRectangle old_focus_rect;
+ gtk_widget_get_allocation (widget, &allocation);
+
if (old_focus_coords (container, &old_focus_rect))
{
compare.y = old_focus_rect.y + old_focus_rect.height / 2;
else
{
if (!gtk_widget_get_has_window (widget))
- compare.y = widget->allocation.y + widget->allocation.height / 2;
+ compare.y = allocation.y + allocation.height / 2;
else
- compare.y = widget->allocation.height / 2;
+ compare.y = allocation.height / 2;
}
if (!gtk_widget_get_has_window (widget))
- compare.x = (direction == GTK_DIR_RIGHT) ? widget->allocation.x : widget->allocation.x + widget->allocation.width;
+ compare.x = (direction == GTK_DIR_RIGHT) ? allocation.x : allocation.x + allocation.width;
else
- compare.x = (direction == GTK_DIR_RIGHT) ? 0 : widget->allocation.width;
+ compare.x = (direction == GTK_DIR_RIGHT) ? 0 : allocation.width;
}
children = g_list_sort_with_data (children, left_right_compare, &compare);
GList *children,
GtkDirectionType direction)
{
+ GtkContainerPrivate *priv = container->priv;
GtkWidget *focus_child;
GtkWidget *child;
- focus_child = container->focus_child;
+ focus_child = priv->focus_child;
while (children)
{
}
/**
- * gtk_container_set_focus_chain:
+ * gtk_container_set_focus_chain:
* @container: a #GtkContainer
- * @focusable_widgets: the new focus chain
+ * @focusable_widgets: (transfer none) (element-type GtkWidget):
+ * the new focus chain
*
* Sets a focus chain, overriding the one computed automatically by GTK+.
*
{
GList *chain;
GList *tmp_list;
+ GtkContainerPrivate *priv;
g_return_if_fail (GTK_IS_CONTAINER (container));
+
+ priv = container->priv;
- if (container->has_focus_chain)
+ if (priv->has_focus_chain)
gtk_container_unset_focus_chain (container);
- container->has_focus_chain = TRUE;
+ priv->has_focus_chain = TRUE;
chain = NULL;
tmp_list = focusable_widgets;
gtk_container_get_focus_chain (GtkContainer *container,
GList **focus_chain)
{
+ GtkContainerPrivate *priv;
+
g_return_val_if_fail (GTK_IS_CONTAINER (container), FALSE);
+ priv = container->priv;
+
if (focus_chain)
{
- if (container->has_focus_chain)
+ if (priv->has_focus_chain)
*focus_chain = g_list_copy (get_focus_chain (container));
else
*focus_chain = NULL;
}
- return container->has_focus_chain;
+ return priv->has_focus_chain;
}
/**
**/
void
gtk_container_unset_focus_chain (GtkContainer *container)
-{
+{
+ GtkContainerPrivate *priv;
+
g_return_if_fail (GTK_IS_CONTAINER (container));
- if (container->has_focus_chain)
+ priv = container->priv;
+
+ if (priv->has_focus_chain)
{
GList *chain;
GList *tmp_list;
chain = get_focus_chain (container);
- container->has_focus_chain = FALSE;
+ priv->has_focus_chain = FALSE;
g_object_set_data (G_OBJECT (container),
I_("gtk-container-focus-chain"),
gpointer client_data)
{
if (gtk_widget_get_visible (child) &&
- GTK_WIDGET_CHILD_VISIBLE (child) &&
+ gtk_widget_get_child_visible (child) &&
!gtk_widget_get_mapped (child))
gtk_widget_map (child);
}
NULL);
if (gtk_widget_get_has_window (widget))
- gdk_window_show (widget->window);
+ gdk_window_show (gtk_widget_get_window (widget));
}
static void
gtk_widget_set_mapped (widget, FALSE);
if (gtk_widget_get_has_window (widget))
- gdk_window_hide (widget->window);
+ gdk_window_hide (gtk_widget_get_window (widget));
else
gtk_container_forall (GTK_CONTAINER (widget),
(GtkCallback)gtk_widget_unmap,
g_return_if_fail (GTK_IS_WIDGET (child));
g_return_if_fail (event != NULL);
- g_assert (child->parent == GTK_WIDGET (container));
-
+ g_assert (gtk_widget_get_parent (child) == GTK_WIDGET (container));
+
if (gtk_widget_is_drawable (child) &&
!gtk_widget_get_has_window (child) &&
- (child->window == event->window))
+ gtk_widget_get_window (child) == event->window)
{
child_event = gdk_event_new (GDK_EXPOSE);
child_event->expose = *event;
}
}
-#define __GTK_CONTAINER_C__
-#include "gtkaliasdef.c"
+gboolean
+_gtk_container_get_need_resize (GtkContainer *container)
+{
+ return container->priv->need_resize;
+}
+
+void
+_gtk_container_set_need_resize (GtkContainer *container,
+ gboolean need_resize)
+{
+ container->priv->need_resize = need_resize;
+}
+
+gboolean
+_gtk_container_get_reallocate_redraws (GtkContainer *container)
+{
+ return container->priv->reallocate_redraws;
+}