+static void aspect_bin_set_property(GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ AspectBin *abin = ASPECT_BIN(object);
+ gfloat tmp;
+
+ switch (prop_id) {
+ case PROP_RATIO:
+ tmp = abin->ratio;
+ abin->ratio = g_value_get_float(value);
+ if (tmp != abin->ratio)
+ gtk_widget_queue_resize(GTK_WIDGET(abin));
+ break;
+ case PROP_CONSTRAIN:
+ abin->constrain = g_value_get_boolean(value);
+ gtk_widget_queue_resize(GTK_WIDGET(abin));
+ break;
+ case PROP_FILL:
+ abin->fill = g_value_get_boolean(value);
+ gtk_widget_queue_resize(GTK_WIDGET(abin));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ }
+}
+
+static void aspect_bin_get_property(GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ AspectBin *abin = ASPECT_BIN(object);
+
+ switch (prop_id) {
+ case PROP_RATIO:
+ g_value_set_float(value, abin->ratio);
+ break;
+ case PROP_CONSTRAIN:
+ g_value_set_boolean(value, abin->constrain);
+ break;
+ case PROP_FILL:
+ g_value_set_boolean(value, abin->fill);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ }
+}
+
+static void aspect_bin_set_child_property(GtkContainer *container,
+ GtkWidget *child,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ AspectBin *abin = ASPECT_BIN(container);
+ gfloat align;
+
+ g_assert(child == abin->body || child == abin->side);
+
+ switch (prop_id) {
+ case CHILD_PROP_ALIGN:
+ align = g_value_get_float(value);
+ if (child == abin->body)
+ abin->body_align = align;
+ else if (child == abin->side)
+ abin->side_align = align;
+ gtk_widget_queue_resize(GTK_WIDGET(abin));
+ break;
+ default:
+ GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID(container,
+ prop_id, pspec);
+ }
+}
+
+static void aspect_bin_get_child_property(GtkContainer *container,
+ GtkWidget *child,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ AspectBin *abin = ASPECT_BIN(container);
+ gfloat align = 0;
+
+ g_assert(child == abin->body || child == abin->side);
+
+ switch (prop_id) {
+ case CHILD_PROP_ALIGN:
+ if (child == abin->body)
+ align = abin->body_align;
+ else if (child == abin->side)
+ align = abin->side_align;
+ g_value_set_float(value, align);
+ break;
+ default:
+ GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID(container,
+ prop_id, pspec);
+ }
+}
+
+static void aspect_bin_add(GtkContainer *container, GtkWidget *widget)
+{
+ AspectBin *abin;
+ g_return_if_fail(IS_ASPECT_BIN(container));
+ abin = ASPECT_BIN(container);
+
+ if (!abin->body)
+ aspect_bin_set_body(abin, widget, 1);
+ else if (!abin->side)
+ aspect_bin_set_side(abin, widget);
+ else
+ g_warning("AspectBin cannot have more than 2 children.\n");
+}
+