diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/blocks/slider.c | 8 | ||||
| -rw-r--r-- | src/layout.c | 19 | ||||
| -rw-r--r-- | src/layout.h | 5 | ||||
| -rw-r--r-- | src/util.c | 10 | ||||
| -rw-r--r-- | src/util.h | 2 |
5 files changed, 28 insertions, 16 deletions
diff --git a/src/blocks/slider.c b/src/blocks/slider.c index 708fdca..3fe6e8c 100644 --- a/src/blocks/slider.c +++ b/src/blocks/slider.c @@ -28,6 +28,7 @@ static void block_slider_render(layout_t *layout, cairo_t *cr) { block_slider_t *slider = (block_slider_t *)layout->block; + const int radius = slider->height / 2; int bar_y = layout->y + (layout->height - slider->height) / 2; int bar_x = layout->x + layout->height / 2; @@ -37,7 +38,7 @@ static void block_slider_render(layout_t *layout, cairo_t *cr) cairo_pattern_t *pattern = slider->bg_color.pattern; if (pattern != NULL) { - cairo_rectangle(cr, bar_x, bar_y, slider->width, slider->height); + render_capsule(cr, bar_x, bar_y, slider->width, radius, slider->line_width); cairo_pattern_set_matrix(pattern, &matrix); cairo_set_source(cr, pattern); @@ -46,7 +47,8 @@ static void block_slider_render(layout_t *layout, cairo_t *cr) pattern = slider->bar_color.pattern; if (pattern != NULL) { - cairo_rectangle(cr, bar_x, bar_y, slider->width * (slider->value / 100.0), slider->height); + int current = slider->width * (slider->value / 100.0); + render_capsule(cr, bar_x, bar_y, current, radius, slider->line_width); cairo_pattern_set_matrix(pattern, &matrix); cairo_set_source(cr, pattern); @@ -55,7 +57,7 @@ static void block_slider_render(layout_t *layout, cairo_t *cr) pattern = slider->line_color.pattern; if (pattern != NULL) { - cairo_rectangle(cr, bar_x, bar_y, slider->width, slider->height); + render_capsule(cr, bar_x, bar_y, slider->width, radius, slider->line_width); cairo_pattern_set_matrix(pattern, &matrix); cairo_set_source(cr, pattern); diff --git a/src/layout.c b/src/layout.c index b0aee0c..193ebbd 100644 --- a/src/layout.c +++ b/src/layout.c @@ -19,6 +19,7 @@ void layout_init(layout_t *layout, block_t *block, layout_info_t info) layout->x_padding = block->x_padding; layout->y_padding = block->y_padding; layout->height = info.height; + layout->line_width = block->line_width; switch (block->type) { case BLOCK_TEXT: { @@ -93,9 +94,10 @@ void layout_init(layout_t *layout, block_t *block, layout_info_t info) void layout_render(layout_t *layout, cairo_t *cr) { - const double degree = M_PI / 180.0; - int radius = layout->height / 2 - layout->y_padding; - int line_radius = radius - layout->block->line_width / 2; + const int radius = layout->height / 2 - layout->y_padding; + + int block_x = layout->x + layout->x_padding; + int block_y = layout->y + layout->y_padding; // Update gradients cairo_matrix_t matrix; @@ -105,10 +107,7 @@ void layout_render(layout_t *layout, cairo_t *cr) // Render background cairo_pattern_t *pattern = layout->block->bg_color.pattern; if (pattern != NULL) { - cairo_new_sub_path(cr); - cairo_arc(cr, layout->x + layout->x_padding + radius, layout->y + layout->y_padding + radius, radius, 90 * degree, 270 * degree); - cairo_arc(cr, layout->x + layout->width - layout->x_padding - radius, layout->y + layout->y_padding + radius, radius, 270 * degree, 450 * degree); - cairo_close_path(cr); + render_capsule(cr, block_x, block_y, layout->width - layout->x_padding, radius, radius); cairo_pattern_set_matrix(pattern, &matrix); cairo_set_source(cr, pattern); @@ -118,10 +117,8 @@ void layout_render(layout_t *layout, cairo_t *cr) // Render border pattern = layout->block->line_color.pattern; if (pattern != NULL) { - cairo_new_sub_path(cr); - cairo_arc(cr, layout->x + layout->x_padding + radius, layout->y + layout->y_padding + radius, line_radius, 90 * degree, 270 * degree); - cairo_arc(cr, layout->x + layout->width - layout->x_padding - radius, layout->y + layout->y_padding + radius, line_radius, 270 * degree, 450 * degree); - cairo_close_path(cr); + int line_radius = radius - layout->line_width / 2; + render_capsule(cr, block_x, block_y, layout->width - layout->x_padding, radius, line_radius); cairo_pattern_set_matrix(pattern, &matrix); cairo_set_source(cr, pattern); diff --git a/src/layout.h b/src/layout.h index 657ca41..613f6af 100644 --- a/src/layout.h +++ b/src/layout.h @@ -17,8 +17,9 @@ typedef struct { typedef struct layout { block_t *block; int x, y; - int x_padding, y_padding; - int width, height; + unsigned int x_padding, y_padding; + unsigned int width, height; + unsigned int line_width; int text_width, text_height; PangoLayout *pl; size_t n_children; @@ -214,6 +214,16 @@ bool iszero(const void *ptr, size_t size) return true; } +void render_capsule(cairo_t *cr, int x, int y, int w, int r1, int r2) +{ + const double degree = M_PI / 180.0; + + cairo_new_sub_path(cr); + cairo_arc(cr, x + r1, y + r1, r2, 90 * degree, 270 * degree); + cairo_arc(cr, x + w - r1, y + r1, r2, 270 * degree, 450 * degree); + cairo_close_path(cr); +} + int snprintf_units(char *buffer, size_t max, uint64_t bytes, unit_t unit) { int base = unit & UNIT_SI ? 1000 : 1024; @@ -85,6 +85,8 @@ void strfree(char **list); bool iszero(const void *ptr, size_t size); +void render_capsule(cairo_t *cr, int x, int y, int w, int r1, int r2); + typedef enum { UNIT_B = 1 << 0, UNIT_KB = 1 << 1, |
