aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/blocks/slider.c8
-rw-r--r--src/layout.c19
-rw-r--r--src/layout.h5
-rw-r--r--src/util.c10
-rw-r--r--src/util.h2
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;
diff --git a/src/util.c b/src/util.c
index 80bb4a7..f9e00f2 100644
--- a/src/util.c
+++ b/src/util.c
@@ -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;
diff --git a/src/util.h b/src/util.h
index 4183913..e40a11a 100644
--- a/src/util.h
+++ b/src/util.h
@@ -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,