GTK_WIDGET_CLASS (el_home_applet_parent_class)->realize (widget);
}
-/*
- * Thanks http://cairographics.org/cookbook/roundedrectangles/
+enum {
+ ROUND_CORNER_TL = 1,
+ ROUND_CORNER_TR = 1<<1,
+ ROUND_CORNER_BL = 1<<2,
+ ROUND_CORNER_BR = 1<<3,
+ ROUND_CORNER_ALL = ROUND_CORNER_TL | ROUND_CORNER_TR |
+ ROUND_CORNER_BL | ROUND_CORNER_BR
+};
+
+/**
+ * Draw rectangle with optional round corners.
+ *
+ * @x
+ * @y
+ * @w width
+ * @h height
+ * @r round corner radious
+ * @round_corners define which corners draw round, ROUND_CORNER_TL,
+ * ROUND_CORNER_TR, ROUND_CORNER_BL, ROUND_CORNER_BR
*/
static void
rounded_rectangle (cairo_t *cr,
- double x,
- double y,
- double w,
- double h,
- double r)
+ double x,
+ double y,
+ double w,
+ double h,
+ double r,
+ guint round_corners)
{
- cairo_move_to (cr, x + r, y);
- cairo_line_to (cr, x + w - r, y);
- cairo_curve_to (cr, x + w, y,
- x + w, y,
- x + w, y + r);
- cairo_line_to (cr, x + w, y + h - r);
- cairo_curve_to (cr, x + w, y + h,
- x + w, y + h,
- x + w - r, y + h);
- cairo_line_to (cr, x + r, y + h);
- cairo_curve_to (cr, x, y + h,
- x, y + h,
- x, y + h - r);
- cairo_line_to (cr, x, y + r);
- cairo_curve_to (cr, x, y,
- x, y,
- x + r, y);
+ if (round_corners & ROUND_CORNER_TL)
+ cairo_move_to (cr, x + r, y);
+ else
+ cairo_move_to (cr, x, y);
+
+ if (round_corners & ROUND_CORNER_TR) {
+ cairo_line_to (cr, x + w - r, y);
+ cairo_rel_curve_to (cr,
+ r, 0,
+ r, 0,
+ r, r);
+ }
+ else
+ cairo_line_to (cr, x + w, y);
+
+ if (round_corners & ROUND_CORNER_BR) {
+ cairo_line_to (cr, x + w, y + h - r);
+ cairo_rel_curve_to (cr,
+ 0, r,
+ 0, r,
+ -r, r);
+ }
+ else
+ cairo_line_to (cr, x + w, y + h);
+
+ if (round_corners & ROUND_CORNER_BL) {
+ cairo_line_to (cr, x + r, y + h);
+ cairo_rel_curve_to (cr,
+ -r, 0,
+ -r, 0,
+ -r, -r);
+ }
+ else
+ cairo_line_to (cr, x, y + h);
+
+ if (round_corners & ROUND_CORNER_TL) {
+ cairo_line_to (cr, x, y + r);
+ cairo_rel_curve_to (cr,
+ 0, -r,
+ 0, -r,
+ r, -r);
+ }
+ else
+ cairo_line_to (cr, x, y);
}
static cairo_surface_t*
CONTENT_OFFSET_Y_TOP,
BOX_WIDTH - 2*CONTENT_OFFSET_X,
BOX_HEIGHT - (CONTENT_OFFSET_Y_TOP + CONTENT_OFFSET_Y_BOTTOM),
- BOX_RADIOUS);
+ BOX_RADIOUS,
+ ROUND_CORNER_ALL);
cairo_close_path (cr);
cairo_stroke (cr);
cairo_set_line_width (cr, 1.0f);
cairo_translate (cr, CONTENT_OFFSET_X, CONTENT_OFFSET_Y_TOP);
- cairo_move_to (cr, 0, HEADER_HEIGHT);
- cairo_line_to (cr, 0, BOX_RADIOUS);
- cairo_curve_to (cr, 0, 0, 0, 0, BOX_RADIOUS, 0);
- cairo_line_to (cr, C_WIDTH - BOX_RADIOUS, 0);
- cairo_curve_to (cr, C_WIDTH, 0, C_WIDTH, 0, C_WIDTH, BOX_RADIOUS);
- cairo_line_to (cr, C_WIDTH, HEADER_HEIGHT);
- cairo_line_to (cr, 0, HEADER_HEIGHT);
-
+ rounded_rectangle (cr,
+ 0, 0,
+ C_WIDTH, HEADER_HEIGHT,
+ BOX_RADIOUS,
+ ROUND_CORNER_TL | ROUND_CORNER_TR);
cairo_close_path (cr);
switch (priv->active) {
/* draw body */
if (!priv->message) {
- cairo_move_to (cr, 0, HEADER_HEIGHT);
- cairo_line_to (cr, 0, C_HEIGHT - BOX_RADIOUS);
- cairo_curve_to (cr, 0, C_HEIGHT, 0, C_HEIGHT, BOX_RADIOUS, C_HEIGHT);
- cairo_line_to (cr, C_WIDTH - BOX_RADIOUS, C_HEIGHT);
- cairo_curve_to (cr, C_WIDTH, C_HEIGHT, C_WIDTH, C_HEIGHT, C_WIDTH, C_HEIGHT - BOX_RADIOUS);
- cairo_line_to (cr, C_WIDTH, HEADER_HEIGHT);
- cairo_line_to (cr, 0, HEADER_HEIGHT);
+ rounded_rectangle (cr,
+ 0, HEADER_HEIGHT,
+ C_WIDTH, C_HEIGHT,
+ BOX_RADIOUS,
+ ROUND_CORNER_BL | ROUND_CORNER_BR);
cairo_close_path (cr);
}
else
if (priv->message) {
/* draw footer unread part bg */
- cairo_move_to (cr, 0, C_HEIGHT - FOOTER_HEIGHT);
- cairo_line_to (cr, 0, C_HEIGHT - BOX_RADIOUS);
- cairo_curve_to (cr, 0, C_HEIGHT, 0, C_HEIGHT, BOX_RADIOUS, C_HEIGHT);
- cairo_line_to (cr, FOOTER_WIDTH, C_HEIGHT);
- cairo_line_to (cr, FOOTER_WIDTH, C_HEIGHT - FOOTER_HEIGHT);
- cairo_line_to (cr, 0, C_HEIGHT - FOOTER_HEIGHT);
+ rounded_rectangle (cr,
+ 0, C_HEIGHT - FOOTER_HEIGHT,
+ FOOTER_WIDTH, FOOTER_HEIGHT,
+ BOX_RADIOUS,
+ ROUND_CORNER_BL);
cairo_close_path (cr);
/* draw body filling depending on (in)active state */
cairo_fill (cr);
/* draw footer received part bg */
- cairo_move_to (cr, FOOTER_WIDTH, C_HEIGHT - FOOTER_HEIGHT);
- cairo_rel_line_to (cr, 0, FOOTER_HEIGHT);
- cairo_rel_line_to (cr, C_WIDTH - FOOTER_WIDTH - BOX_RADIOUS, 0);
- cairo_rel_curve_to (cr, BOX_RADIOUS, 0, BOX_RADIOUS, 0, BOX_RADIOUS, -BOX_RADIOUS);
- cairo_rel_line_to (cr, 0, -(FOOTER_HEIGHT - BOX_RADIOUS));
- cairo_rel_line_to (cr, -(C_WIDTH - FOOTER_WIDTH), 0);
+ rounded_rectangle (cr,
+ FOOTER_WIDTH, C_HEIGHT - FOOTER_HEIGHT,
+ C_WIDTH - FOOTER_WIDTH, FOOTER_HEIGHT,
+ BOX_RADIOUS,
+ ROUND_CORNER_BR);
cairo_close_path (cr);
cairo_set_source_rgba (cr, 0.2f, 0.2f, 0.2f, 0.8f);