forked from AuroraMiddleware/gtk
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:
parent
aed70a82c7
commit
447dfc029f
@ -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" />
|
||||
|
@ -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>
|
||||
|
@ -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)
|
||||
|
@ -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>
|
||||
|
@ -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"
|
||||
|
816
gtk/gtklayout.c
816
gtk/gtklayout.c
@ -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 it’s a “blank slate” and
|
||||
* doesn’t do anything except paint a blank background by default. It’s
|
||||
* different in that it supports scrolling natively due to implementing
|
||||
* #GtkScrollable, and can contain child widgets since it’s 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
|
||||
* you’d 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 layout’s 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);
|
||||
}
|
@ -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__ */
|
@ -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',
|
||||
|
@ -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 },
|
||||
|
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user