static void
foo_scroll_area_set_property (GObject      *object,
                              guint         property_id,
                              const GValue *value,
                              GParamSpec   *pspec)
{
    FooScrollArea *scroll_area = FOO_SCROLL_AREA (object);

    switch (property_id) {
    case PROP_VADJUSTMENT:
        foo_scroll_area_set_vadjustment (FOO_SCROLL_AREA (object), g_value_get_object (value));
        break;
    case PROP_HADJUSTMENT:
        foo_scroll_area_set_hadjustment (FOO_SCROLL_AREA (object), g_value_get_object (value));
        break;
    case PROP_HSCROLL_POLICY:
        scroll_area->priv->hscroll_policy = g_value_get_enum (value);
        break;
    case PROP_VSCROLL_POLICY:
        scroll_area->priv->vscroll_policy = g_value_get_enum (value);
        break;
    default:
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
    }
}
static void
foo_scroll_area_unmap (GtkWidget *widget)
{
    FooScrollArea *area = FOO_SCROLL_AREA (widget);
    
    if (area->priv->input_window)
	gdk_window_hide (area->priv->input_window);
    
    GTK_WIDGET_CLASS (parent_class)->unmap (widget);
}
static void
foo_scroll_area_finalize (GObject *object)
{
    FooScrollArea *scroll_area = FOO_SCROLL_AREA (object);
    
    g_object_unref (scroll_area->priv->hadj);
    g_object_unref (scroll_area->priv->vadj);
    
    g_ptr_array_free (scroll_area->priv->input_regions, TRUE);
    
    g_free (scroll_area->priv);

    G_OBJECT_CLASS (foo_scroll_area_parent_class)->finalize (object);
}