aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/block.c2
-rw-r--r--src/block.h4
-rw-r--r--src/blocks/slider.c128
-rw-r--r--src/event.c2
4 files changed, 133 insertions, 3 deletions
diff --git a/src/block.c b/src/block.c
index 25f24cd..e7cb72d 100644
--- a/src/block.c
+++ b/src/block.c
@@ -11,6 +11,7 @@ extern const block_scheme_t block_ram_scheme;
extern const block_scheme_t block_fs_scheme;
extern const block_scheme_t block_date_scheme;
extern const block_scheme_t block_script_scheme;
+extern const block_scheme_t block_slider_scheme;
const block_scheme_t *block_schemes[] = {
&block_text_scheme,
@@ -19,6 +20,7 @@ const block_scheme_t *block_schemes[] = {
&block_fs_scheme,
&block_date_scheme,
&block_script_scheme,
+ &block_slider_scheme,
NULL,
};
diff --git a/src/block.h b/src/block.h
index dc1f975..715c017 100644
--- a/src/block.h
+++ b/src/block.h
@@ -44,7 +44,7 @@ typedef void (*block_render_t)(layout_t *layout, cairo_t *cr);
// Triggered when an event is directed towards the block
//
-typedef void (*block_event_t)(block_t *block, event_t event);
+typedef void (*block_event_t)(layout_t *layout, event_t event);
// The block struct
//
@@ -87,7 +87,7 @@ typedef struct {
block_t block;
block_layout_t layout_fn;
block_render_t render_fn;
- block_event_t event_fn;
+ block_event_t event_fn;
} block_spec_t;
// Called to allocate a block with its default state
diff --git a/src/blocks/slider.c b/src/blocks/slider.c
new file mode 100644
index 0000000..708fdca
--- /dev/null
+++ b/src/blocks/slider.c
@@ -0,0 +1,128 @@
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include <stdlib.h>
+
+#include "../block.h"
+#include "../format.h"
+#include "../any_log.h"
+
+typedef struct {
+ block_spec_t block;
+ unsigned int value;
+ unsigned int height;
+ unsigned int width;
+ unsigned int line_width;
+ gradient_t bar_color;
+ gradient_t line_color;
+ gradient_t bg_color;
+} block_slider_t;
+
+static void block_slider_layout(block_t *block, layout_t *layout, layout_info_t info)
+{
+ block_slider_t *slider = (block_slider_t *)block;
+ layout->width = info.height + slider->width;
+}
+
+static void block_slider_render(layout_t *layout, cairo_t *cr)
+{
+ block_slider_t *slider = (block_slider_t *)layout->block;
+
+ int bar_y = layout->y + (layout->height - slider->height) / 2;
+ int bar_x = layout->x + layout->height / 2;
+
+ cairo_matrix_t matrix;
+ cairo_matrix_init_scale(&matrix, 1.0 / slider->width, 1.0);
+ cairo_matrix_translate(&matrix, -bar_x, 0.0);
+
+ cairo_pattern_t *pattern = slider->bg_color.pattern;
+ if (pattern != NULL) {
+ cairo_rectangle(cr, bar_x, bar_y, slider->width, slider->height);
+
+ cairo_pattern_set_matrix(pattern, &matrix);
+ cairo_set_source(cr, pattern);
+ cairo_fill(cr);
+ }
+
+ pattern = slider->bar_color.pattern;
+ if (pattern != NULL) {
+ cairo_rectangle(cr, bar_x, bar_y, slider->width * (slider->value / 100.0), slider->height);
+
+ cairo_pattern_set_matrix(pattern, &matrix);
+ cairo_set_source(cr, pattern);
+ cairo_fill(cr);
+ }
+
+ pattern = slider->line_color.pattern;
+ if (pattern != NULL) {
+ cairo_rectangle(cr, bar_x, bar_y, slider->width, slider->height);
+
+ cairo_pattern_set_matrix(pattern, &matrix);
+ cairo_set_source(cr, pattern);
+ cairo_set_line_width(cr, slider->line_width);
+ cairo_stroke(cr);
+ }
+}
+
+static void block_slider_event(layout_t *layout, event_t event)
+{
+ block_slider_t *slider = (block_slider_t *)layout->block;
+
+ int bar_x = layout->x + layout->height / 2;
+ int bar_y = layout->y + (layout->height - slider->height) / 2;
+
+ log_value_debug("Clicked slider",
+ "i:bar_x", bar_x,
+ "i:bar_y", bar_y,
+ "i:bar_width", slider->width,
+ "i:bar_height", slider->height,
+ "i:value", slider->value);
+}
+
+static void block_slider_init(block_t *block, const block_scheme_t *scheme)
+{
+ block->type = BLOCK_SPEC;
+
+ block_spec_t *spec = (block_spec_t *)block;
+ spec->layout_fn = block_slider_layout;
+ spec->render_fn = block_slider_render;
+ spec->event_fn = block_slider_event;
+}
+
+static void block_slider_clean(block_t *block)
+{
+ block_slider_t *slider = (block_slider_t *)block;
+ gradient_free(&slider->bar_color);
+ gradient_free(&slider->line_color);
+ gradient_free(&slider->bg_color);
+}
+
+static int block_slider_validate(block_t *block, const block_scheme_t *scheme)
+{
+ //block_slider_t *slider = (block_slider_t *)block;
+ int errors = 0;
+ // TODO
+
+ return errors;
+}
+
+static const config_entry_t block_slider_entries[] = {
+ // TODO: Ugly names
+ { "bar-color", CONFIG_GRADIENT, NULL, offsetof(block_slider_t, bar_color) },
+ { "bar-line-color", CONFIG_GRADIENT, NULL, offsetof(block_slider_t, line_color) },
+ { "bar-bg-color", CONFIG_GRADIENT, NULL, offsetof(block_slider_t, bg_color) },
+ { "bar-height", CONFIG_UINT, NULL, offsetof(block_slider_t, height) },
+ { "bar-width", CONFIG_UINT, NULL, offsetof(block_slider_t, width) },
+ { "bar-line-width", CONFIG_UINT, NULL, offsetof(block_slider_t, line_width) },
+ { "bar-value", CONFIG_UINT, NULL, offsetof(block_slider_t, value) },
+ { 0 },
+};
+
+const block_scheme_t block_slider_scheme = {
+ .name = "slider",
+ .entries = block_slider_entries,
+ .size = sizeof(block_slider_t),
+ .init_fn = block_slider_init,
+ .clean_fn = block_slider_clean,
+ .validate_fn = block_slider_validate,
+};
diff --git a/src/event.c b/src/event.c
index 1aaf603..65e3628 100644
--- a/src/event.c
+++ b/src/event.c
@@ -48,7 +48,7 @@ static bool event_click(layout_t *layout, event_t event)
"b:callback", event_fn != NULL);
if (event_fn != NULL) {
- event_fn(layout->block, event);
+ event_fn(layout, event);
log_trace("Completed event callback");
}