aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/block.c2
-rw-r--r--src/blocks/date.c1
-rw-r--r--src/blocks/fs.c1
-rw-r--r--src/blocks/ram.c1
-rw-r--r--src/blocks/script.c87
-rw-r--r--src/event.c16
6 files changed, 100 insertions, 8 deletions
diff --git a/src/block.c b/src/block.c
index 11b725e..44a6241 100644
--- a/src/block.c
+++ b/src/block.c
@@ -10,6 +10,7 @@ extern const block_scheme_t block_group_scheme;
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;
const block_scheme_t *block_schemes[] = {
&block_text_scheme,
@@ -17,6 +18,7 @@ const block_scheme_t *block_schemes[] = {
&block_ram_scheme,
&block_fs_scheme,
&block_date_scheme,
+ &block_script_scheme,
NULL,
};
diff --git a/src/blocks/date.c b/src/blocks/date.c
index adb248e..f4dbc72 100644
--- a/src/blocks/date.c
+++ b/src/blocks/date.c
@@ -44,6 +44,7 @@ static void block_date_clean(block_t *block)
{
block_date_t *date = (block_date_t *)block;
free(date->format);
+ free(date->block.text);
}
static bool block_date_validate(block_t *block, const block_scheme_t *scheme)
diff --git a/src/blocks/fs.c b/src/blocks/fs.c
index 45ea0a3..7cd3bc8 100644
--- a/src/blocks/fs.c
+++ b/src/blocks/fs.c
@@ -67,6 +67,7 @@ static void block_fs_clean(block_t *block)
block_fs_t *fs = (block_fs_t *)block;
free(fs->format);
free(fs->path);
+ free(fs->block.text);
}
static bool block_fs_validate(block_t *block, const block_scheme_t *scheme)
diff --git a/src/blocks/ram.c b/src/blocks/ram.c
index 158583c..5ea7760 100644
--- a/src/blocks/ram.c
+++ b/src/blocks/ram.c
@@ -77,6 +77,7 @@ static void block_ram_clean(block_t *block)
{
block_ram_t *ram = (block_ram_t *)block;
free(ram->format);
+ free(ram->block.text);
}
static bool block_ram_validate(block_t *block, const block_scheme_t *scheme)
diff --git a/src/blocks/script.c b/src/blocks/script.c
new file mode 100644
index 0000000..fa3a9d9
--- /dev/null
+++ b/src/blocks/script.c
@@ -0,0 +1,87 @@
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include <stdlib.h>
+
+#include "../block.h"
+
+#include "../any_log.h"
+
+typedef struct {
+ block_text_t block;
+ char *script;
+} block_script_t;
+
+static const struct timespec block_script_interval = {
+ .tv_sec = 30,
+ .tv_nsec = 0,
+};
+
+static void block_script_update(block_t *block)
+{
+ block_script_t *script = (block_script_t *)block;
+
+ FILE *output = popen(script->script, "r");
+ if (output == NULL) {
+ log_value_debug("Failed to execute a script",
+ "s:label", block->label,
+ "s:script", script->script,
+ "i:errno", errno);
+ return;
+ }
+
+ char buffer[128] = { 0 };
+ fgets(buffer, sizeof(buffer), output);
+ pclose(output);
+
+ log_value_debug("Executed a script",
+ "s:label", block->label,
+ "s:script", script->script);
+
+ free(script->block.text);
+ script->block.text = strcopy(buffer);
+ assert(script->block.text != NULL);
+}
+
+static block_t *block_script_alloc(const block_scheme_t *scheme)
+{
+ block_t *block = calloc(1, sizeof(block_script_t));
+ block->type = BLOCK_TEXT;
+ block->update_interval = block_script_interval;
+ block->update_fn = block_script_update;
+ return block;
+}
+
+static void block_script_clean(block_t *block)
+{
+ block_script_t *script = (block_script_t *)block;
+ free(script->script);
+ free(script->block.text);
+}
+
+static bool block_script_validate(block_t *block, const block_scheme_t *scheme)
+{
+ block_script_t *script = (block_script_t *)block;
+
+ if (script->block.text == NULL) {
+ log_error("Block '%s' requires key '%s'", block->label, "text");
+ return false;
+ }
+
+ script->script = script->block.text;
+ script->block.text = NULL;
+ return true;
+}
+
+static const config_entry_t block_script_entries[] = {
+ { 0 },
+};
+
+const block_scheme_t block_script_scheme = {
+ .name = "script",
+ .entries = block_script_entries,
+ .alloc_fn = block_script_alloc,
+ .clean_fn = block_script_clean,
+ .validate_fn = block_script_validate,
+ .resolve_fn = NULL,
+};
diff --git a/src/event.c b/src/event.c
index 3783029..1aaf603 100644
--- a/src/event.c
+++ b/src/event.c
@@ -37,14 +37,14 @@ static bool event_click(layout_t *layout, event_t event)
: NULL;
log_value_debug("Block was clicked",
- "s:type", even_type_to_string(event.type),
- "i:x", event.x,
- "i:y", event.y,
- "s:block_label", layout->block->label,
- "i:block_x", layout->x,
- "i:block_y", layout->y,
- "i:block_width", layout->width,
- "i:block_height", layout->height,
+ "s:event_type", even_type_to_string(event.type),
+ "i:event_x", event.x,
+ "i:event_y", event.y,
+ "s:label", layout->block->label,
+ "i:x", layout->x,
+ "i:y", layout->y,
+ "i:width", layout->width,
+ "i:height", layout->height,
"b:callback", event_fn != NULL);
if (event_fn != NULL) {