diff options
Diffstat (limited to 'src/empathy-rounded-rectangle.c')
-rw-r--r-- | src/empathy-rounded-rectangle.c | 58 |
1 files changed, 37 insertions, 21 deletions
diff --git a/src/empathy-rounded-rectangle.c b/src/empathy-rounded-rectangle.c index 8e6dab3da..7b8951f80 100644 --- a/src/empathy-rounded-rectangle.c +++ b/src/empathy-rounded-rectangle.c @@ -35,19 +35,23 @@ struct _EmpathyRoundedRectanglePriv guint width, height; ClutterColor border_color; guint border_width; + guint round_factor; }; -static void -empathy_rounded_rectangle_paint (EmpathyRoundedRectangle *self) +static gboolean +draw_cb (ClutterCairoTexture *canvas, + cairo_t *cr) { + EmpathyRoundedRectangle *self = EMPATHY_ROUNDED_RECTANGLE (canvas); guint width, height; + guint border_width; guint tmp_alpha; - cairo_t *cr; - -#define RADIUS (height / 8.) + gdouble radius; width = self->priv->width; height = self->priv->height; + radius = self->priv->height / self->priv->round_factor; + border_width = self->priv->border_width; /* compute the composited opacity of the actor taking into * account the opacity of the color set by the user */ @@ -55,38 +59,35 @@ empathy_rounded_rectangle_paint (EmpathyRoundedRectangle *self) * self->priv->border_color.alpha / 255; - cr = clutter_cairo_texture_create (CLUTTER_CAIRO_TEXTURE (self)); - cairo_set_source_rgba (cr, self->priv->border_color.red, self->priv->border_color.green, self->priv->border_color.blue, tmp_alpha); - cairo_set_line_width (cr, self->priv->border_width); + cairo_set_line_width (cr, border_width); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); /* make room for the portion of the border drawn on the outside */ - cairo_translate (cr, self->priv->border_width/2.0, self->priv->border_width/2.0); + cairo_translate (cr, border_width/2.0, border_width/2.0); cairo_new_sub_path (cr); - cairo_arc (cr, width - RADIUS, RADIUS, RADIUS, + cairo_arc (cr, width - radius, radius, radius, -M_PI/2.0, 0); - cairo_arc (cr, width - RADIUS, height - RADIUS, RADIUS, + cairo_arc (cr, width - radius, height - radius, radius, 0, M_PI/2.0); - cairo_arc (cr, RADIUS, height - RADIUS, RADIUS, + cairo_arc (cr, radius, height - radius, radius, M_PI/2.0, M_PI); - cairo_arc (cr, RADIUS, RADIUS, RADIUS, + cairo_arc (cr, radius, radius, radius, M_PI, -M_PI/2.0); cairo_close_path (cr); cairo_stroke (cr); - cairo_destroy (cr); -#undef RADIUS + return TRUE; } static void @@ -96,11 +97,22 @@ empathy_rounded_rectangle_init (EmpathyRoundedRectangle *self) EMPATHY_TYPE_ROUNDED_RECTANGLE, EmpathyRoundedRectanglePriv); self->priv->border_width = 1; + self->priv->round_factor = 2; +} + +static void +empathy_rounded_rectangle_finalize (GObject *object) +{ + G_OBJECT_CLASS (empathy_rounded_rectangle_parent_class)->finalize (object); } static void empathy_rounded_rectangle_class_init (EmpathyRoundedRectangleClass *klass) { + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = empathy_rounded_rectangle_finalize; + g_type_class_add_private (klass, sizeof (EmpathyRoundedRectanglePriv)); } @@ -112,9 +124,10 @@ empathy_rounded_rectangle_update_surface_size (EmpathyRoundedRectangle *self) self->priv->height + self->priv->border_width); } -ClutterActor * +EmpathyRoundedRectangle * empathy_rounded_rectangle_new (guint width, - guint height) + guint height, + guint round_factor) { EmpathyRoundedRectangle *self; @@ -122,11 +135,14 @@ empathy_rounded_rectangle_new (guint width, self->priv->width = width; self->priv->height = height; + self->priv->round_factor = round_factor; + + g_signal_connect (self, "draw", G_CALLBACK (draw_cb), NULL); empathy_rounded_rectangle_update_surface_size (self); - empathy_rounded_rectangle_paint (self); + clutter_cairo_texture_invalidate (CLUTTER_CAIRO_TEXTURE (self)); - return CLUTTER_ACTOR (self); + return self; } void @@ -136,7 +152,7 @@ empathy_rounded_rectangle_set_border_width (EmpathyRoundedRectangle *self, self->priv->border_width = border_width; empathy_rounded_rectangle_update_surface_size (self); - empathy_rounded_rectangle_paint (self); + clutter_cairo_texture_invalidate (CLUTTER_CAIRO_TEXTURE (self)); } void @@ -145,5 +161,5 @@ empathy_rounded_rectangle_set_border_color (EmpathyRoundedRectangle *self, { self->priv->border_color = *color; - empathy_rounded_rectangle_paint (self); + clutter_cairo_texture_invalidate (CLUTTER_CAIRO_TEXTURE (self)); } |