X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtklayout.c;h=73cdb62f2ac50fceb0166ec8a7389c904a01cb83;hb=bda5987335b8c7828ebf1d289a91accfe2e74dbe;hp=a2589c27f3f1993c7f6bad43e843e2487741d065;hpb=8b512bd9dd4c16abb27d18dc40b32b6c0545fff5;p=~andy%2Fgtk diff --git a/gtk/gtklayout.c b/gtk/gtklayout.c index a2589c27f..73cdb62f2 100644 --- a/gtk/gtklayout.c +++ b/gtk/gtklayout.c @@ -12,9 +12,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . * * GtkLayout: Widget for scrolling of arbitrary-sized areas. * @@ -32,14 +30,36 @@ #include "gtklayout.h" -#include "gdkconfig.h" +#include "gdk/gdk.h" -#include "gtkprivate.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, #GtkScrolledWindow + * + * #GtkLayout is similar to #GtkDrawingArea in that it's a "blank slate" + * and doesn't do anything but paint a blank background by default. It's + * different in that it supports scrolling natively (you can add it to a + * #GtkScrolledWindow), and it can contain child widgets, since it's a + * #GtkContainer. However if you're just going to draw, a #GtkDrawingArea + * is a better choice since it has lower overhead. + * + * When handling expose events on a #GtkLayout, you must draw to + * GTK_LAYOUT (layout)->bin_window, rather than to + * GTK_WIDGET (layout)->window, as you would for a drawing + * area. + */ + + typedef struct _GtkLayoutChild GtkLayoutChild; struct _GtkLayoutPrivate @@ -135,8 +155,7 @@ static void gtk_layout_allocate_child (GtkLayout *layout, GtkLayoutChild *child); static void gtk_layout_adjustment_changed (GtkAdjustment *adjustment, GtkLayout *layout); -static void gtk_layout_style_set (GtkWidget *widget, - GtkStyle *old_style); +static void gtk_layout_style_updated (GtkWidget *widget); static void gtk_layout_set_hadjustment_values (GtkLayout *layout); static void gtk_layout_set_vadjustment_values (GtkLayout *layout); @@ -302,26 +321,12 @@ gtk_layout_finalize (GObject *object) G_OBJECT_CLASS (gtk_layout_parent_class)->finalize (object); } -/** - * gtk_layout_set_hadjustment: - * @layout: a #GtkLayout - * @adjustment: (allow-none): new scroll adjustment - * - * Sets the horizontal scroll adjustment for the layout. - * - * See #GtkScrolledWindow, #GtkScrollbar, #GtkAdjustment for details. - * - * Deprecated: 3.0: Use gtk_scrollable_set_hadjustment() - **/ -void -gtk_layout_set_hadjustment (GtkLayout *layout, - GtkAdjustment *adjustment) +static void +gtk_layout_do_set_hadjustment (GtkLayout *layout, + GtkAdjustment *adjustment) { GtkLayoutPrivate *priv; - g_return_if_fail (GTK_IS_LAYOUT (layout)); - g_return_if_fail (adjustment == NULL || GTK_IS_ADJUSTMENT (adjustment)); - priv = layout->priv; if (adjustment && priv->hadjustment == adjustment) @@ -346,27 +351,33 @@ gtk_layout_set_hadjustment (GtkLayout *layout, g_object_notify (G_OBJECT (layout), "hadjustment"); } - /** - * gtk_layout_set_vadjustment: + * gtk_layout_set_hadjustment: * @layout: a #GtkLayout * @adjustment: (allow-none): new scroll adjustment * - * Sets the vertical scroll adjustment for the layout. + * Sets the horizontal scroll adjustment for the layout. * * See #GtkScrolledWindow, #GtkScrollbar, #GtkAdjustment for details. * - * Deprecated: 3.0: Use gtk_scrollable_set_vadjustment() + * Deprecated: 3.0: Use gtk_scrollable_set_hadjustment() **/ void -gtk_layout_set_vadjustment (GtkLayout *layout, +gtk_layout_set_hadjustment (GtkLayout *layout, GtkAdjustment *adjustment) { - GtkLayoutPrivate *priv; - g_return_if_fail (GTK_IS_LAYOUT (layout)); g_return_if_fail (adjustment == NULL || GTK_IS_ADJUSTMENT (adjustment)); + gtk_layout_do_set_hadjustment (layout, adjustment); +} + +static void +gtk_layout_do_set_vadjustment (GtkLayout *layout, + GtkAdjustment *adjustment) +{ + GtkLayoutPrivate *priv; + priv = layout->priv; if (adjustment && priv->vadjustment == adjustment) @@ -391,6 +402,27 @@ gtk_layout_set_vadjustment (GtkLayout *layout, g_object_notify (G_OBJECT (layout), "vadjustment"); } +/** + * gtk_layout_set_vadjustment: + * @layout: a #GtkLayout + * @adjustment: (allow-none): new scroll adjustment + * + * Sets the vertical scroll adjustment for the layout. + * + * See #GtkScrolledWindow, #GtkScrollbar, #GtkAdjustment for details. + * + * Deprecated: 3.0: Use gtk_scrollable_set_vadjustment() + **/ +void +gtk_layout_set_vadjustment (GtkLayout *layout, + GtkAdjustment *adjustment) +{ + g_return_if_fail (GTK_IS_LAYOUT (layout)); + g_return_if_fail (adjustment == NULL || GTK_IS_ADJUSTMENT (adjustment)); + + gtk_layout_do_set_vadjustment (layout, adjustment); +} + static GtkLayoutChild* get_child (GtkLayout *layout, GtkWidget *widget) @@ -562,8 +594,10 @@ gtk_layout_set_size (GtkLayout *layout, /** * gtk_layout_get_size: * @layout: a #GtkLayout - * @width: (allow-none): location to store the width set on @layout, or %NULL - * @height: (allow-none): location to store the height set on @layout, or %NULL + * @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 @@ -657,7 +691,7 @@ gtk_layout_class_init (GtkLayoutClass *class) widget_class->get_preferred_height = gtk_layout_get_preferred_height; widget_class->size_allocate = gtk_layout_size_allocate; widget_class->draw = gtk_layout_draw; - widget_class->style_set = gtk_layout_style_set; + widget_class->style_updated = gtk_layout_style_updated; container_class->add = gtk_layout_add; container_class->remove = gtk_layout_remove; @@ -713,12 +747,10 @@ gtk_layout_set_property (GObject *object, switch (prop_id) { case PROP_HADJUSTMENT: - gtk_layout_set_hadjustment (layout, - (GtkAdjustment*) g_value_get_object (value)); + gtk_layout_do_set_hadjustment (layout, g_value_get_object (value)); break; case PROP_VADJUSTMENT: - gtk_layout_set_vadjustment (layout, - (GtkAdjustment*) g_value_get_object (value)); + gtk_layout_do_set_vadjustment (layout, g_value_get_object (value)); break; case PROP_HSCROLL_POLICY: priv->hscroll_policy = g_value_get_enum (value); @@ -853,23 +885,22 @@ gtk_layout_realize (GtkWidget *widget) window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); gtk_widget_set_window (widget, window); - gdk_window_set_user_data (window, widget); + gtk_widget_register_window (widget, window); gtk_widget_get_allocation (widget, &allocation); - attributes.x = - priv->hadjustment->value, - attributes.y = - priv->vadjustment->value; + attributes.x = - gtk_adjustment_get_value (priv->hadjustment), + attributes.y = - gtk_adjustment_get_value (priv->vadjustment); attributes.width = MAX (priv->width, allocation.width); attributes.height = MAX (priv->height, allocation.height); - attributes.event_mask = GDK_EXPOSURE_MASK | GDK_SCROLL_MASK | + attributes.event_mask = GDK_EXPOSURE_MASK | GDK_SCROLL_MASK | + GDK_SMOOTH_SCROLL_MASK | gtk_widget_get_events (widget); priv->bin_window = gdk_window_new (window, &attributes, attributes_mask); - gdk_window_set_user_data (priv->bin_window, widget); - - gtk_widget_style_attach (widget); - gtk_style_set_background (gtk_widget_get_style (widget), priv->bin_window, GTK_STATE_NORMAL); + gtk_widget_register_window (widget, priv->bin_window); + gtk_style_context_set_background (gtk_widget_get_style_context (widget), priv->bin_window); tmp_list = priv->children; while (tmp_list) @@ -882,17 +913,16 @@ gtk_layout_realize (GtkWidget *widget) } static void -gtk_layout_style_set (GtkWidget *widget, - GtkStyle *old_style) +gtk_layout_style_updated (GtkWidget *widget) { GtkLayoutPrivate *priv; - GTK_WIDGET_CLASS (gtk_layout_parent_class)->style_set (widget, old_style); + GTK_WIDGET_CLASS (gtk_layout_parent_class)->style_updated (widget); if (gtk_widget_get_realized (widget)) { priv = GTK_LAYOUT (widget)->priv; - gtk_style_set_background (gtk_widget_get_style (widget), priv->bin_window, GTK_STATE_NORMAL); + gtk_style_context_set_background (gtk_widget_get_style_context (widget), priv->bin_window); } } @@ -928,7 +958,7 @@ gtk_layout_unrealize (GtkWidget *widget) GtkLayout *layout = GTK_LAYOUT (widget); GtkLayoutPrivate *priv = layout->priv; - gdk_window_set_user_data (priv->bin_window, NULL); + gtk_widget_unregister_window (widget, priv->bin_window); gdk_window_destroy (priv->bin_window); priv->bin_window = NULL; @@ -1091,9 +1121,7 @@ gtk_layout_adjustment_changed (GtkAdjustment *adjustment, if (gtk_widget_get_realized (GTK_WIDGET (layout))) { gdk_window_move (priv->bin_window, - - priv->hadjustment->value, - - priv->vadjustment->value); - - gdk_window_process_updates (priv->bin_window, TRUE); + - gtk_adjustment_get_value (priv->hadjustment), + - gtk_adjustment_get_value (priv->vadjustment)); } }