guint prop_id,
const GValue *value,
GParamSpec *pspec);
+static GObject *gtk_layout_constructor (GType type,
+ guint n_properties,
+ GObjectConstructParam *properties);
static void gtk_layout_init (GtkLayout *layout);
static void gtk_layout_finalize (GObject *object);
static void gtk_layout_realize (GtkWidget *widget);
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_set_adjustment_upper (GtkAdjustment *adj,
+ gdouble upper,
+ gboolean always_emit_changed);
static GtkWidgetClass *parent_class = NULL;
{
GtkLayout *layout;
- layout = gtk_type_new (GTK_TYPE_LAYOUT);
-
- gtk_layout_set_adjustments (layout, hadjustment, vadjustment);
+ layout = g_object_new (GTK_TYPE_LAYOUT,
+ "hadjustment", hadjustment,
+ "vadjustment", vadjustment,
+ NULL);
return GTK_WIDGET (layout);
}
return layout->vadjustment;
}
+static GtkAdjustment *
+new_default_adjustment (void)
+{
+ return GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
+}
+
static void
gtk_layout_set_adjustments (GtkLayout *layout,
GtkAdjustment *hadj,
if (hadj)
g_return_if_fail (GTK_IS_ADJUSTMENT (hadj));
- else
- hadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
+ else if (layout->hadjustment)
+ hadj = new_default_adjustment ();
if (vadj)
g_return_if_fail (GTK_IS_ADJUSTMENT (vadj));
- else
- vadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
+ else if (layout->vadjustment)
+ vadj = new_default_adjustment ();
if (layout->hadjustment && (layout->hadjustment != hadj))
{
layout->hadjustment = hadj;
gtk_object_ref (GTK_OBJECT (layout->hadjustment));
gtk_object_sink (GTK_OBJECT (layout->hadjustment));
+ gtk_layout_set_adjustment_upper (layout->hadjustment, layout->width, FALSE);
gtk_signal_connect (GTK_OBJECT (layout->hadjustment), "value_changed",
(GtkSignalFunc) gtk_layout_adjustment_changed,
layout->vadjustment = vadj;
gtk_object_ref (GTK_OBJECT (layout->vadjustment));
gtk_object_sink (GTK_OBJECT (layout->vadjustment));
+ gtk_layout_set_adjustment_upper (layout->vadjustment, layout->height, FALSE);
gtk_signal_connect (GTK_OBJECT (layout->vadjustment), "value_changed",
(GtkSignalFunc) gtk_layout_adjustment_changed,
need_adjust = TRUE;
}
- if (need_adjust)
+ /* vadj or hadj can be NULL while constructing; don't emit a signal
+ then */
+ if (need_adjust && vadj && hadj)
gtk_layout_adjustment_changed (NULL, layout);
}
static void
gtk_layout_set_adjustment_upper (GtkAdjustment *adj,
- gdouble upper)
+ gdouble upper,
+ gboolean always_emit_changed)
{
+ gboolean changed = FALSE;
+ gboolean value_changed = FALSE;
+
+ gdouble min = MAX (0., upper - adj->page_size);
+
if (upper != adj->upper)
{
- gdouble min = MAX (0., upper - adj->page_size);
- gboolean value_changed = FALSE;
-
adj->upper = upper;
+ changed = TRUE;
+ }
- if (adj->value > min)
- {
- adj->value = min;
- value_changed = TRUE;
- }
-
- gtk_signal_emit_by_name (GTK_OBJECT (adj), "changed");
- if (value_changed)
- gtk_signal_emit_by_name (GTK_OBJECT (adj), "value_changed");
+ if (adj->value > min)
+ {
+ adj->value = min;
+ value_changed = TRUE;
}
+
+ if (changed || always_emit_changed)
+ gtk_signal_emit_by_name (GTK_OBJECT (adj), "changed");
+ if (value_changed)
+ gtk_signal_emit_by_name (GTK_OBJECT (adj), "value_changed");
}
/**
}
g_object_thaw_notify (G_OBJECT (layout));
- gtk_layout_set_adjustment_upper (layout->hadjustment, layout->width);
- gtk_layout_set_adjustment_upper (layout->vadjustment, layout->height);
+ if (layout->hadjustment)
+ gtk_layout_set_adjustment_upper (layout->hadjustment, layout->width, FALSE);
+ if (layout->vadjustment)
+ gtk_layout_set_adjustment_upper (layout->vadjustment, layout->height, FALSE);
if (GTK_WIDGET_REALIZED (layout))
{
gobject_class->set_property = gtk_layout_set_property;
gobject_class->get_property = gtk_layout_get_property;
gobject_class->finalize = gtk_layout_finalize;
+ gobject_class->constructor = gtk_layout_constructor;
container_class->set_child_property = gtk_layout_set_child_property;
container_class->get_child_property = gtk_layout_get_child_property;
widget_class->size_request = gtk_layout_size_request;
widget_class->size_allocate = gtk_layout_size_allocate;
widget_class->expose_event = gtk_layout_expose;
+ widget_class->style_set = gtk_layout_style_set;
container_class->remove = gtk_layout_remove;
container_class->forall = gtk_layout_forall;
switch (prop_id)
{
case PROP_HADJUSTMENT:
- g_value_set_object (value, G_OBJECT (layout->hadjustment));
+ g_value_set_object (value, layout->hadjustment);
break;
case PROP_VADJUSTMENT:
- g_value_set_object (value, G_OBJECT (layout->vadjustment));
+ g_value_set_object (value, layout->vadjustment);
break;
case PROP_WIDTH:
g_value_set_uint (value, layout->width);
layout->freeze_count = 0;
}
+static GObject *
+gtk_layout_constructor (GType type,
+ guint n_properties,
+ GObjectConstructParam *properties)
+{
+ GtkLayout *layout;
+ GObject *object;
+ GtkAdjustment *hadj, *vadj;
+
+ object = G_OBJECT_CLASS (parent_class)->constructor (type,
+ n_properties,
+ properties);
+
+ layout = GTK_LAYOUT (object);
+
+ hadj = layout->hadjustment ? layout->hadjustment : new_default_adjustment ();
+ vadj = layout->vadjustment ? layout->vadjustment : new_default_adjustment ();
+
+ if (!layout->hadjustment || !layout->vadjustment)
+ gtk_layout_set_adjustments (layout, hadj, vadj);
+
+ return object;
+}
+
/* Widget methods
*/
&attributes, attributes_mask);
gdk_window_set_user_data (widget->window, widget);
- attributes.x = 0;
- attributes.y = 0;
+ attributes.x = - layout->hadjustment->value,
+ attributes.y = - layout->vadjustment->value;
attributes.width = MAX (layout->width, widget->allocation.width);
attributes.height = MAX (layout->height, widget->allocation.height);
attributes.event_mask = GDK_EXPOSURE_MASK | GDK_SCROLL_MASK |
}
}
+static void
+gtk_layout_style_set (GtkWidget *widget, GtkStyle *old_style)
+{
+ if (GTK_WIDGET_CLASS (parent_class)->style_set)
+ (* GTK_WIDGET_CLASS (parent_class)->style_set) (widget, old_style);
+
+ if (GTK_WIDGET_REALIZED (widget))
+ {
+ gtk_style_set_background (widget->style, GTK_LAYOUT (widget)->bin_window, GTK_STATE_NORMAL);
+ }
+}
+
static void
gtk_layout_map (GtkWidget *widget)
{
}
layout->hadjustment->page_size = allocation->width;
- layout->hadjustment->page_increment = allocation->width / 2;
+ layout->hadjustment->page_increment = allocation->width * 0.9;
layout->hadjustment->lower = 0;
- layout->hadjustment->upper = MAX (allocation->width, layout->width);
- gtk_signal_emit_by_name (GTK_OBJECT (layout->hadjustment), "changed");
+ /* set_adjustment_upper() emits ::changed */
+ gtk_layout_set_adjustment_upper (layout->hadjustment, MAX (allocation->width, layout->width), TRUE);
layout->vadjustment->page_size = allocation->height;
- layout->vadjustment->page_increment = allocation->height / 2;
+ layout->vadjustment->page_increment = allocation->height * 0.9;
layout->vadjustment->lower = 0;
layout->vadjustment->upper = MAX (allocation->height, layout->height);
- gtk_signal_emit_by_name (GTK_OBJECT (layout->vadjustment), "changed");
+ gtk_layout_set_adjustment_upper (layout->vadjustment, MAX (allocation->height, layout->height), TRUE);
}
static gint