[cairo-texture] Remove the construct only restriction on surface size

It is possible to change the surface size after construction with
clutter_cairo_texture_set_surface_size so it doesn't seem right to
restrict changing the properties.

clutter_cairo_texture_resize_surface_internal is called in a handler
for the notify signal. It is called there rather than directly in the
set_property handler so that changing both properties in a single
g_object_set will only cause one resize. The constructed override is
no longer needed.

resize_surface_internal will now bail out if the size of the surface
is already the right size.
This commit is contained in:
Neil Roberts 2008-12-19 13:15:26 +00:00
parent e130e0c9b3
commit 64de0411ea

View File

@ -228,6 +228,12 @@ clutter_cairo_texture_surface_resize_internal (ClutterCairoTexture *cairo)
{ {
cairo_surface_t *surface = priv->cr_surface; cairo_surface_t *surface = priv->cr_surface;
/* If the surface is already the right size then don't bother
doing anything */
if (priv->width == cairo_image_surface_get_width (priv->cr_surface)
&& priv->height == cairo_image_surface_get_height (priv->cr_surface))
return;
cairo_surface_finish (surface); cairo_surface_finish (surface);
cairo_surface_set_user_data (surface, cairo_surface_set_user_data (surface,
&clutter_cairo_texture_surface_key, &clutter_cairo_texture_surface_key,
@ -291,14 +297,24 @@ clutter_cairo_texture_surface_resize_internal (ClutterCairoTexture *cairo)
} }
static void static void
clutter_cairo_texture_constructed (GObject *gobject) clutter_cairo_texture_notify (GObject *object,
GParamSpec *pspec)
{ {
ClutterCairoTexture *cairo = CLUTTER_CAIRO_TEXTURE (gobject); /* When the surface width or height changes then resize the cairo
surface. This is done here instead of directly in set_property so
that if both the width and height properties are set using a
single call to g_object_set then the surface will only be resized
once because the notifications will be frozen in between */
if (!strcmp ("surface-width", pspec->name)
|| !strcmp ("surface-height", pspec->name))
{
ClutterCairoTexture *cairo = CLUTTER_CAIRO_TEXTURE (object);
clutter_cairo_texture_surface_resize_internal (cairo); clutter_cairo_texture_surface_resize_internal (cairo);
}
if (G_OBJECT_CLASS (clutter_cairo_texture_parent_class)->constructed) if (G_OBJECT_CLASS (clutter_cairo_texture_parent_class)->notify)
G_OBJECT_CLASS (clutter_cairo_texture_parent_class)->constructed (gobject); G_OBJECT_CLASS (clutter_cairo_texture_parent_class)->notify (object, pspec);
} }
static void static void
@ -340,7 +356,7 @@ clutter_cairo_texture_class_init (ClutterCairoTextureClass *klass)
gobject_class->finalize = clutter_cairo_texture_finalize; gobject_class->finalize = clutter_cairo_texture_finalize;
gobject_class->set_property = clutter_cairo_texture_set_property; gobject_class->set_property = clutter_cairo_texture_set_property;
gobject_class->get_property = clutter_cairo_texture_get_property; gobject_class->get_property = clutter_cairo_texture_get_property;
gobject_class->constructed = clutter_cairo_texture_constructed; gobject_class->notify = clutter_cairo_texture_notify;
actor_class->get_preferred_width = actor_class->get_preferred_width =
clutter_cairo_texture_get_preferred_width; clutter_cairo_texture_get_preferred_width;
@ -364,7 +380,6 @@ clutter_cairo_texture_class_init (ClutterCairoTextureClass *klass)
"Surface Width", "Surface Width",
0, G_MAXUINT, 0, G_MAXUINT,
0, 0,
G_PARAM_CONSTRUCT_ONLY |
CLUTTER_PARAM_READWRITE)); CLUTTER_PARAM_READWRITE));
/** /**
* ClutterCairoTexture:surface-height: * ClutterCairoTexture:surface-height:
@ -381,7 +396,6 @@ clutter_cairo_texture_class_init (ClutterCairoTextureClass *klass)
"Surface Height", "Surface Height",
0, G_MAXUINT, 0, G_MAXUINT,
0, 0,
G_PARAM_CONSTRUCT_ONLY |
CLUTTER_PARAM_READWRITE)); CLUTTER_PARAM_READWRITE));
} }