Remove GtkLayout

The need of a specialised fixed layout container that can be placed into
a GtkScrolledWindow ceased to exist once GtkScrolledWindow gained the
ability to automatically interpose a GtkViewport when adding a child
that does not implement GtkScrollable.

All the other justifications that led to the existence of GtkLayout as a
separate widget from GtkFixed have been largely made irrelevant in the
20 years since its inception.
This commit is contained in:
Emmanuele Bassi 2019-04-02 15:25:02 +01:00
parent aed70a82c7
commit 447dfc029f
10 changed files with 0 additions and 1028 deletions

View File

@ -92,7 +92,6 @@
<xi:include href="xml/gtkheaderbar.xml" />
<xi:include href="xml/gtkoverlay.xml" />
<xi:include href="xml/gtkpaned.xml" />
<xi:include href="xml/gtklayout.xml" />
<xi:include href="xml/gtknotebook.xml" />
<xi:include href="xml/gtkexpander.xml" />
<xi:include href="xml/gtkorientable.xml" />

View File

@ -1739,27 +1739,6 @@ GtkLabelPrivate
GtkLabelSelectionInfo
</SECTION>
<SECTION>
<FILE>gtklayout</FILE>
<TITLE>GtkLayout</TITLE>
GtkLayout
gtk_layout_new
gtk_layout_put
gtk_layout_move
gtk_layout_set_size
gtk_layout_get_size
<SUBSECTION Standard>
GTK_LAYOUT
GTK_IS_LAYOUT
GTK_TYPE_LAYOUT
GTK_LAYOUT_CLASS
GTK_IS_LAYOUT_CLASS
GTK_LAYOUT_GET_CLASS
<SUBSECTION Private>
GtkLayoutPrivate
gtk_layout_get_type
</SECTION>
<SECTION>
<FILE>gtklinkbutton</FILE>
<TITLE>GtkLinkButton</TITLE>

View File

@ -101,7 +101,6 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkIconTheme, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkIconView, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkImage, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkInfoBar, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkLayout, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkLevelBar, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkLinkButton, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkListStore, g_object_unref)

View File

@ -137,7 +137,6 @@
#include <gtk/gtkimmulticontext.h>
#include <gtk/gtkinfobar.h>
#include <gtk/gtklabel.h>
#include <gtk/gtklayout.h>
#include <gtk/gtklayoutmanager.h>
#include <gtk/gtklayoutchild.h>
#include <gtk/gtklevelbar.h>

View File

@ -66,9 +66,6 @@
* 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.
*
* See also #GtkLayout, which shares the ability to perform fixed positioning
* of child widgets and additionally adds custom drawing and scrollability.
*/
#include "config.h"

View File

@ -1,816 +0,0 @@
/* GTK - The GIMP Toolkit
* 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 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
* 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, see <http://www.gnu.org/licenses/>.
*
* GtkLayout: Widget for scrolling of arbitrary-sized areas.
*
* Copyright Owen Taylor, 1998
*/
/*
* 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/.
*/
#include "config.h"
#include "gtklayout.h"
#include "gdk/gdk.h"
#include "gtkadjustment.h"
#include "gtkintl.h"
#include "gtkmarshalers.h"
#include "gtkprivate.h"
#include "gtkscrollable.h"
/**
* SECTION:gtklayout
* @Short_description: Infinite scrollable area containing child widgets
* and/or custom drawing
* @Title: GtkLayout
* @See_also: #GtkDrawingArea, #GtkFixed
*
* #GtkLayout is similar to #GtkDrawingArea in that its a blank slate and
* doesnt do anything except paint a blank background by default. Its
* different in that it supports scrolling natively due to implementing
* #GtkScrollable, and can contain child widgets since its a #GtkContainer.
*
* If you just want to draw, a #GtkDrawingArea is a better choice since it has
* lower overhead. If you just need to position child widgets at specific
* points, then #GtkFixed provides that functionality on its own.
*/
typedef struct _LayoutChild LayoutChild;
typedef struct
{
/* Properties */
guint width;
guint height;
GtkAdjustment *hadjustment;
GtkAdjustment *vadjustment;
/* GtkScrollablePolicy needs to be checked when
* driving the scrollable adjustment values */
guint hscroll_policy : 1;
guint vscroll_policy : 1;
/* Properties */
GList *children;
} GtkLayoutPrivate;
struct _LayoutChild {
GtkWidget *widget;
gint x;
gint y;
};
enum {
PROP_0,
PROP_HADJUSTMENT,
PROP_VADJUSTMENT,
PROP_HSCROLL_POLICY,
PROP_VSCROLL_POLICY,
PROP_WIDTH,
PROP_HEIGHT
};
enum {
CHILD_PROP_0,
CHILD_PROP_X,
CHILD_PROP_Y
};
static void gtk_layout_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
static void gtk_layout_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);
static void gtk_layout_finalize (GObject *object);
static void gtk_layout_measure (GtkWidget *widget,
GtkOrientation orientation,
int for_size,
int *minimum,
int *natural,
int *minimum_baseline,
int *natural_baseline);
static void gtk_layout_size_allocate (GtkWidget *widget,
int width,
int height,
int baseline);
static void gtk_layout_add (GtkContainer *container,
GtkWidget *widget);
static void gtk_layout_remove (GtkContainer *container,
GtkWidget *widget);
static void gtk_layout_forall (GtkContainer *container,
GtkCallback callback,
gpointer callback_data);
static void gtk_layout_set_child_property (GtkContainer *container,
GtkWidget *child,
guint property_id,
const GValue *value,
GParamSpec *pspec);
static void gtk_layout_get_child_property (GtkContainer *container,
GtkWidget *child,
guint property_id,
GValue *value,
GParamSpec *pspec);
static void gtk_layout_adjustment_changed (GtkAdjustment *adjustment,
GtkWidget *widget);
static void gtk_layout_set_hadjustment_values (GtkLayout *layout);
static void gtk_layout_set_vadjustment_values (GtkLayout *layout);
G_DEFINE_TYPE_WITH_CODE (GtkLayout, gtk_layout, GTK_TYPE_CONTAINER,
G_ADD_PRIVATE (GtkLayout)
G_IMPLEMENT_INTERFACE (GTK_TYPE_SCROLLABLE, NULL))
/* Public interface
*/
/**
* gtk_layout_new:
* @hadjustment: (allow-none): horizontal scroll adjustment, or %NULL
* @vadjustment: (allow-none): vertical scroll adjustment, or %NULL
*
* Creates a new #GtkLayout. Unless you have a specific adjustment
* youd like the layout to use for scrolling, pass %NULL for
* @hadjustment and @vadjustment.
*
* Returns: a new #GtkLayout
**/
GtkWidget*
gtk_layout_new (GtkAdjustment *hadjustment,
GtkAdjustment *vadjustment)
{
GtkLayout *layout;
layout = g_object_new (GTK_TYPE_LAYOUT,
"hadjustment", hadjustment,
"vadjustment", vadjustment,
NULL);
return GTK_WIDGET (layout);
}
static void
gtk_layout_set_hadjustment_values (GtkLayout *layout)
{
GtkLayoutPrivate *priv = gtk_layout_get_instance_private (layout);
GtkAllocation allocation;
GtkAdjustment *adj = priv->hadjustment;
gdouble old_value;
gdouble new_value;
gdouble new_upper;
gtk_widget_get_allocation (GTK_WIDGET (layout), &allocation);
old_value = gtk_adjustment_get_value (adj);
new_upper = MAX (allocation.width, priv->width);
g_object_set (adj,
"lower", 0.0,
"upper", new_upper,
"page-size", (gdouble)allocation.width,
"step-increment", allocation.width * 0.1,
"page-increment", allocation.width * 0.9,
NULL);
new_value = CLAMP (old_value, 0, new_upper - allocation.width);
if (new_value != old_value)
gtk_adjustment_set_value (adj, new_value);
}
static void
gtk_layout_set_vadjustment_values (GtkLayout *layout)
{
GtkLayoutPrivate *priv = gtk_layout_get_instance_private (layout);
GtkAllocation allocation;
GtkAdjustment *adj = priv->vadjustment;
gdouble old_value;
gdouble new_value;
gdouble new_upper;
gtk_widget_get_allocation (GTK_WIDGET (layout), &allocation);
old_value = gtk_adjustment_get_value (adj);
new_upper = MAX (allocation.height, priv->height);
g_object_set (adj,
"lower", 0.0,
"upper", new_upper,
"page-size", (gdouble)allocation.height,
"step-increment", allocation.height * 0.1,
"page-increment", allocation.height * 0.9,
NULL);
new_value = CLAMP (old_value, 0, new_upper - allocation.height);
if (new_value != old_value)
gtk_adjustment_set_value (adj, new_value);
}
static void
gtk_layout_finalize (GObject *object)
{
GtkLayout *layout = GTK_LAYOUT (object);
GtkLayoutPrivate *priv = gtk_layout_get_instance_private (layout);
g_object_unref (priv->hadjustment);
g_object_unref (priv->vadjustment);
G_OBJECT_CLASS (gtk_layout_parent_class)->finalize (object);
}
static void
gtk_layout_set_hadjustment (GtkLayout *layout,
GtkAdjustment *adjustment)
{
GtkLayoutPrivate *priv = gtk_layout_get_instance_private (layout);
if (adjustment && priv->hadjustment == adjustment)
return;
if (priv->hadjustment != NULL)
{
g_signal_handlers_disconnect_by_func (priv->hadjustment,
gtk_layout_adjustment_changed,
layout);
g_object_unref (priv->hadjustment);
}
if (adjustment == NULL)
adjustment = gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
g_signal_connect (adjustment, "value-changed",
G_CALLBACK (gtk_layout_adjustment_changed), layout);
priv->hadjustment = g_object_ref_sink (adjustment);
gtk_layout_set_hadjustment_values (layout);
g_object_notify (G_OBJECT (layout), "hadjustment");
}
static void
gtk_layout_set_vadjustment (GtkLayout *layout,
GtkAdjustment *adjustment)
{
GtkLayoutPrivate *priv = gtk_layout_get_instance_private (layout);
if (adjustment && priv->vadjustment == adjustment)
return;
if (priv->vadjustment != NULL)
{
g_signal_handlers_disconnect_by_func (priv->vadjustment,
gtk_layout_adjustment_changed,
layout);
g_object_unref (priv->vadjustment);
}
if (adjustment == NULL)
adjustment = gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
g_signal_connect (adjustment, "value-changed",
G_CALLBACK (gtk_layout_adjustment_changed), layout);
priv->vadjustment = g_object_ref_sink (adjustment);
gtk_layout_set_vadjustment_values (layout);
g_object_notify (G_OBJECT (layout), "vadjustment");
}
static LayoutChild *
get_child (GtkLayout *layout,
GtkWidget *widget)
{
GtkLayoutPrivate *priv = gtk_layout_get_instance_private (layout);
GList *children;
children = priv->children;
while (children)
{
LayoutChild *child;
child = children->data;
children = children->next;
if (child->widget == widget)
return child;
}
return NULL;
}
/**
* gtk_layout_put:
* @layout: a #GtkLayout
* @child_widget: child widget
* @x: X position of child widget
* @y: Y position of child widget
*
* Adds @child_widget to @layout, at position (@x,@y).
* @layout becomes the new parent container of @child_widget.
*
**/
void
gtk_layout_put (GtkLayout *layout,
GtkWidget *child_widget,
gint x,
gint y)
{
GtkLayoutPrivate *priv = gtk_layout_get_instance_private (layout);
LayoutChild *child;
g_return_if_fail (GTK_IS_LAYOUT (layout));
g_return_if_fail (GTK_IS_WIDGET (child_widget));
child = g_new (LayoutChild, 1);
child->widget = child_widget;
child->x = x;
child->y = y;
priv->children = g_list_append (priv->children, child);
gtk_widget_set_parent (child_widget, GTK_WIDGET (layout));
}
static void
gtk_layout_move_internal (GtkLayout *layout,
GtkWidget *widget,
gboolean change_x,
gint x,
gboolean change_y,
gint y)
{
LayoutChild *child;
child = get_child (layout, widget);
g_assert (child);
gtk_widget_freeze_child_notify (widget);
if (change_x)
{
child->x = x;
gtk_widget_child_notify (widget, "x");
}
if (change_y)
{
child->y = y;
gtk_widget_child_notify (widget, "y");
}
gtk_widget_thaw_child_notify (widget);
if (gtk_widget_get_visible (widget) &&
gtk_widget_get_visible (GTK_WIDGET (layout)))
gtk_widget_queue_resize (widget);
}
/**
* gtk_layout_move:
* @layout: a #GtkLayout
* @child_widget: a current child of @layout
* @x: X position to move to
* @y: Y position to move to
*
* Moves a current child of @layout to a new position.
*
**/
void
gtk_layout_move (GtkLayout *layout,
GtkWidget *child_widget,
gint x,
gint y)
{
g_return_if_fail (GTK_IS_LAYOUT (layout));
g_return_if_fail (GTK_IS_WIDGET (child_widget));
g_return_if_fail (gtk_widget_get_parent (child_widget) == GTK_WIDGET (layout));
gtk_layout_move_internal (layout, child_widget, TRUE, x, TRUE, y);
}
/**
* gtk_layout_set_size:
* @layout: a #GtkLayout
* @width: width of entire scrollable area
* @height: height of entire scrollable area
*
* Sets the size of the scrollable area of the layout.
*
**/
void
gtk_layout_set_size (GtkLayout *layout,
guint width,
guint height)
{
GtkLayoutPrivate *priv = gtk_layout_get_instance_private (layout);
g_return_if_fail (GTK_IS_LAYOUT (layout));
g_object_freeze_notify (G_OBJECT (layout));
if (width != priv->width)
{
priv->width = width;
g_object_notify (G_OBJECT (layout), "width");
}
if (height != priv->height)
{
priv->height = height;
g_object_notify (G_OBJECT (layout), "height");
}
g_object_thaw_notify (G_OBJECT (layout));
gtk_layout_set_hadjustment_values (layout);
gtk_layout_set_vadjustment_values (layout);
}
/**
* gtk_layout_get_size:
* @layout: a #GtkLayout
* @width: (out) (allow-none): location to store the width set on
* @layout, or %NULL
* @height: (out) (allow-none): location to store the height set on
* @layout, or %NULL
*
* Gets the size that has been set on the layout, and that determines
* the total extents of the layouts scrollbar area. See
* gtk_layout_set_size ().
**/
void
gtk_layout_get_size (GtkLayout *layout,
guint *width,
guint *height)
{
GtkLayoutPrivate *priv = gtk_layout_get_instance_private (layout);
g_return_if_fail (GTK_IS_LAYOUT (layout));
if (width)
*width = priv->width;
if (height)
*height = priv->height;
}
/* Basic Object handling procedures
*/
static void
gtk_layout_class_init (GtkLayoutClass *class)
{
GObjectClass *gobject_class;
GtkWidgetClass *widget_class;
GtkContainerClass *container_class;
gobject_class = (GObjectClass*) class;
widget_class = (GtkWidgetClass*) class;
container_class = (GtkContainerClass*) class;
gobject_class->set_property = gtk_layout_set_property;
gobject_class->get_property = gtk_layout_get_property;
gobject_class->finalize = gtk_layout_finalize;
container_class->set_child_property = gtk_layout_set_child_property;
container_class->get_child_property = gtk_layout_get_child_property;
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));
/* Scrollable interface */
g_object_class_override_property (gobject_class, PROP_HADJUSTMENT, "hadjustment");
g_object_class_override_property (gobject_class, PROP_VADJUSTMENT, "vadjustment");
g_object_class_override_property (gobject_class, PROP_HSCROLL_POLICY, "hscroll-policy");
g_object_class_override_property (gobject_class, PROP_VSCROLL_POLICY, "vscroll-policy");
g_object_class_install_property (gobject_class,
PROP_WIDTH,
g_param_spec_uint ("width",
P_("Width"),
P_("The width of the layout"),
0,
G_MAXINT,
100,
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
g_object_class_install_property (gobject_class,
PROP_HEIGHT,
g_param_spec_uint ("height",
P_("Height"),
P_("The height of the layout"),
0,
G_MAXINT,
100,
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
widget_class->measure = gtk_layout_measure;
widget_class->size_allocate = gtk_layout_size_allocate;
container_class->add = gtk_layout_add;
container_class->remove = gtk_layout_remove;
container_class->forall = gtk_layout_forall;
}
static void
gtk_layout_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
GtkLayout *layout = GTK_LAYOUT (object);
GtkLayoutPrivate *priv = gtk_layout_get_instance_private (layout);
switch (prop_id)
{
case PROP_HADJUSTMENT:
g_value_set_object (value, priv->hadjustment);
break;
case PROP_VADJUSTMENT:
g_value_set_object (value, priv->vadjustment);
break;
case PROP_HSCROLL_POLICY:
g_value_set_enum (value, priv->hscroll_policy);
break;
case PROP_VSCROLL_POLICY:
g_value_set_enum (value, priv->vscroll_policy);
break;
case PROP_WIDTH:
g_value_set_uint (value, priv->width);
break;
case PROP_HEIGHT:
g_value_set_uint (value, priv->height);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gtk_layout_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
GtkLayout *layout = GTK_LAYOUT (object);
GtkLayoutPrivate *priv = gtk_layout_get_instance_private (layout);
switch (prop_id)
{
case PROP_HADJUSTMENT:
gtk_layout_set_hadjustment (layout, g_value_get_object (value));
break;
case PROP_VADJUSTMENT:
gtk_layout_set_vadjustment (layout, g_value_get_object (value));
break;
case PROP_HSCROLL_POLICY:
if (priv->hscroll_policy != g_value_get_enum (value))
{
priv->hscroll_policy = g_value_get_enum (value);
gtk_widget_queue_resize (GTK_WIDGET (layout));
g_object_notify_by_pspec (object, pspec);
}
break;
case PROP_VSCROLL_POLICY:
if (priv->vscroll_policy != g_value_get_enum (value))
{
priv->vscroll_policy = g_value_get_enum (value);
gtk_widget_queue_resize (GTK_WIDGET (layout));
g_object_notify_by_pspec (object, pspec);
}
break;
case PROP_WIDTH:
gtk_layout_set_size (layout, g_value_get_uint (value), priv->height);
break;
case PROP_HEIGHT:
gtk_layout_set_size (layout, priv->width, g_value_get_uint (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gtk_layout_set_child_property (GtkContainer *container,
GtkWidget *child,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
switch (property_id)
{
case CHILD_PROP_X:
gtk_layout_move_internal (GTK_LAYOUT (container),
child,
TRUE, g_value_get_int (value),
FALSE, 0);
break;
case CHILD_PROP_Y:
gtk_layout_move_internal (GTK_LAYOUT (container),
child,
FALSE, 0,
TRUE, g_value_get_int (value));
break;
default:
GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec);
break;
}
}
static void
gtk_layout_get_child_property (GtkContainer *container,
GtkWidget *child,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
LayoutChild *layout_child;
layout_child = get_child (GTK_LAYOUT (container), child);
switch (property_id)
{
case CHILD_PROP_X:
g_value_set_int (value, layout_child->x);
break;
case CHILD_PROP_Y:
g_value_set_int (value, layout_child->y);
break;
default:
GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec);
break;
}
}
static void
gtk_layout_init (GtkLayout *layout)
{
GtkLayoutPrivate *priv = gtk_layout_get_instance_private (layout);
gtk_widget_set_has_surface (GTK_WIDGET (layout), FALSE);
priv->children = NULL;
priv->width = 100;
priv->height = 100;
priv->hadjustment = NULL;
priv->vadjustment = NULL;
}
static void
gtk_layout_measure (GtkWidget *widget,
GtkOrientation orientation,
int for_size,
int *minimum,
int *natural,
int *minimum_baseline,
int *natural_baseline)
{
*minimum = *natural = 0;
}
static void
gtk_layout_size_allocate (GtkWidget *widget,
int width,
int height,
int baseline)
{
GtkLayout *layout = GTK_LAYOUT (widget);
GtkLayoutPrivate *priv = gtk_layout_get_instance_private (layout);
GList *tmp_list;
int scroll_x = 0;
int scroll_y = 0;
tmp_list = priv->children;
if (priv->hadjustment)
scroll_x = - gtk_adjustment_get_value (priv->hadjustment);
if (priv->vadjustment)
scroll_y = - gtk_adjustment_get_value (priv->vadjustment);
while (tmp_list)
{
LayoutChild *child = tmp_list->data;
GtkAllocation allocation;
GtkRequisition requisition;
tmp_list = tmp_list->next;
allocation.x = child->x + scroll_x;
allocation.y = child->y + scroll_y;
gtk_widget_get_preferred_size (child->widget, &requisition, NULL);
allocation.width = requisition.width;
allocation.height = requisition.height;
gtk_widget_size_allocate (child->widget, &allocation, -1);
}
gtk_layout_set_hadjustment_values (layout);
gtk_layout_set_vadjustment_values (layout);
}
/* Container methods
*/
static void
gtk_layout_add (GtkContainer *container,
GtkWidget *widget)
{
gtk_layout_put (GTK_LAYOUT (container), widget, 0, 0);
}
static void
gtk_layout_remove (GtkContainer *container,
GtkWidget *widget)
{
GtkLayout *layout = GTK_LAYOUT (container);
GtkLayoutPrivate *priv = gtk_layout_get_instance_private (layout);
GList *tmp_list;
LayoutChild *child = NULL;
tmp_list = priv->children;
while (tmp_list)
{
child = tmp_list->data;
if (child->widget == widget)
break;
tmp_list = tmp_list->next;
}
if (tmp_list)
{
gtk_widget_unparent (widget);
priv->children = g_list_remove_link (priv->children, tmp_list);
g_list_free_1 (tmp_list);
g_free (child);
}
}
static void
gtk_layout_forall (GtkContainer *container,
GtkCallback callback,
gpointer callback_data)
{
GtkLayout *layout = GTK_LAYOUT (container);
GtkLayoutPrivate *priv = gtk_layout_get_instance_private (layout);
LayoutChild *child;
GList *tmp_list;
tmp_list = priv->children;
while (tmp_list)
{
child = tmp_list->data;
tmp_list = tmp_list->next;
(* callback) (child->widget, callback_data);
}
}
/* Callbacks */
static void
gtk_layout_adjustment_changed (GtkAdjustment *adjustment,
GtkWidget *layout)
{
gtk_widget_queue_allocate (layout);
}

View File

@ -1,97 +0,0 @@
/* GTK - The GIMP Toolkit
* 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 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
* 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, see <http://www.gnu.org/licenses/>.
*
* GtkLayout: Widget for scrolling of arbitrary-sized areas.
*
* Copyright Owen Taylor, 1998
*/
/*
* 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/.
*/
#ifndef __GTK_LAYOUT_H__
#define __GTK_LAYOUT_H__
#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
#error "Only <gtk/gtk.h> can be included directly."
#endif
#include <gtk/gtkcontainer.h>
G_BEGIN_DECLS
#define GTK_TYPE_LAYOUT (gtk_layout_get_type ())
#define GTK_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_LAYOUT, GtkLayout))
#define GTK_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_LAYOUT, GtkLayoutClass))
#define GTK_IS_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_LAYOUT))
#define GTK_IS_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_LAYOUT))
#define GTK_LAYOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_LAYOUT, GtkLayoutClass))
typedef struct _GtkLayout GtkLayout;
typedef struct _GtkLayoutClass GtkLayoutClass;
struct _GtkLayout
{
GtkContainer parent_instance;
};
struct _GtkLayoutClass
{
GtkContainerClass parent_class;
/* Padding for future expansion */
void (*_gtk_reserved1) (void);
void (*_gtk_reserved2) (void);
void (*_gtk_reserved3) (void);
void (*_gtk_reserved4) (void);
};
GDK_AVAILABLE_IN_ALL
GType gtk_layout_get_type (void) G_GNUC_CONST;
GDK_AVAILABLE_IN_ALL
GtkWidget* gtk_layout_new (GtkAdjustment *hadjustment,
GtkAdjustment *vadjustment);
GDK_AVAILABLE_IN_ALL
void gtk_layout_put (GtkLayout *layout,
GtkWidget *child_widget,
gint x,
gint y);
GDK_AVAILABLE_IN_ALL
void gtk_layout_move (GtkLayout *layout,
GtkWidget *child_widget,
gint x,
gint y);
GDK_AVAILABLE_IN_ALL
void gtk_layout_set_size (GtkLayout *layout,
guint width,
guint height);
GDK_AVAILABLE_IN_ALL
void gtk_layout_get_size (GtkLayout *layout,
guint *width,
guint *height);
G_END_DECLS
#endif /* __GTK_LAYOUT_H__ */

View File

@ -259,7 +259,6 @@ gtk_public_sources = files([
'gtkimmulticontext.c',
'gtkinfobar.c',
'gtklabel.c',
'gtklayout.c',
'gtklayoutchild.c',
'gtklayoutmanager.c',
'gtklevelbar.c',
@ -516,7 +515,6 @@ gtk_public_headers = files([
'gtkimmulticontext.h',
'gtkinfobar.h',
'gtklabel.h',
'gtklayout.h',
'gtklayoutchild.h',
'gtklayoutmanager.h',
'gtklevelbar.h',

View File

@ -5997,86 +5997,6 @@ create_mainloop (GtkWidget *widget)
gtk_widget_destroy (window);
}
void create_layout (GtkWidget *widget)
{
GtkAdjustment *hadjustment, *vadjustment;
GtkLayout *layout;
static GtkWidget *window = NULL;
GtkWidget *layout_widget;
GtkWidget *scrolledwindow;
GtkWidget *button;
if (!window)
{
gchar buf[16];
gint i, j;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (widget));
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed),
&window);
gtk_window_set_title (GTK_WINDOW (window), "Layout");
gtk_widget_set_size_request (window, 200, 200);
scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
GTK_SHADOW_IN);
gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
GTK_CORNER_TOP_RIGHT);
gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
layout_widget = gtk_layout_new (NULL, NULL);
layout = GTK_LAYOUT (layout_widget);
gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
/* We set step sizes here since GtkLayout does not set
* them itself.
*/
hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (layout));
vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (layout));
gtk_adjustment_set_step_increment (hadjustment, 10.0);
gtk_adjustment_set_step_increment (vadjustment, 10.0);
gtk_scrollable_set_hadjustment (GTK_SCROLLABLE (layout), hadjustment);
gtk_scrollable_set_vadjustment (GTK_SCROLLABLE (layout), vadjustment);
gtk_layout_set_size (layout, 1600, 128000);
for (i=0 ; i < 16 ; i++)
for (j=0 ; j < 16 ; j++)
{
sprintf(buf, "Button %d, %d", i, j);
if ((i + j) % 2)
button = gtk_button_new_with_label (buf);
else
button = gtk_label_new (buf);
gtk_layout_put (layout, button, j*100, i*100);
}
for (i=16; i < 1280; i++)
{
sprintf(buf, "Button %d, %d", i, 0);
if (i % 2)
button = gtk_button_new_with_label (buf);
else
button = gtk_label_new (buf);
gtk_layout_put (layout, button, 0, i*100);
}
}
if (!gtk_widget_get_visible (window))
gtk_widget_show (window);
else
gtk_widget_destroy (window);
}
static void
show_native (GtkWidget *button,
GtkFileChooserNative *native)
@ -6486,7 +6406,6 @@ struct {
{ "image", create_image },
{ "key lookup", create_key_lookup },
{ "labels", create_labels },
{ "layout", create_layout },
{ "listbox", create_listbox },
{ "menus", create_menus },
{ "message dialog", create_message_dialog },

View File

@ -273,11 +273,6 @@ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
G_GNUC_END_IGNORE_DEPRECATIONS
if (g_type_is_a (type, GTK_TYPE_LAYOUT) &&
(strcmp (pspec->name, "hadjustment") == 0 ||
strcmp (pspec->name, "vadjustment") == 0))
continue;
if (g_type_is_a (type, GTK_TYPE_MESSAGE_DIALOG) &&
(strcmp (pspec->name, "image") == 0 ||
strcmp (pspec->name, "message-area") == 0))