aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2023-11-25 11:45:34 +0100
committerFederico Angelilli <code@fedang.net>2023-11-25 11:45:34 +0100
commita71221d8c19920606836457f6c4ff0a7a0bed227 (patch)
tree6435bedec12f8c173980876417c2aeacd3c1c518 /src
parent61f65a2e24fb7ac9739db934baa6e9fa53641c5f (diff)
Add disk button and refactor date_update
Diffstat (limited to 'src')
-rw-r--r--src/comet.c88
1 files changed, 54 insertions, 34 deletions
diff --git a/src/comet.c b/src/comet.c
index 98beb74..2bf642a 100644
--- a/src/comet.c
+++ b/src/comet.c
@@ -3,6 +3,8 @@
#include <glib-unix.h>
#include <time.h>
#include <unistd.h>
+#include <sys/statvfs.h>
+#include <locale.h>
#include "window.h"
#include "log.h"
@@ -12,20 +14,6 @@
#define EVEN(n) ((int)(n) - ((int)(n) % 2 != 0))
-static gboolean mainloop_quit(gpointer data)
-{
- g_main_loop_quit(data);
- return G_SOURCE_CONTINUE;
-}
-
-//static gboolean mainloop_draw(gpointer data)
-//{
-// State *state = data;
-// draw_compute_layout(state->draw, state->win, state->btns);
-// draw_paint(state->draw, state->win);
-// return G_SOURCE_CONTINUE;
-//}
-
static void log_handler(const char *log_domain,
GLogLevelFlags level,
const char *message,
@@ -42,21 +30,48 @@ static void log_handler(const char *log_domain,
g_print("%s\n", message);
}
-typedef struct {
- State *state;
- Button *btn;
- timer_t timer;
-} Date_Handler;
-static gboolean date_update(Date_Handler *date_ctx)
+static gboolean mainloop_quit(gpointer data)
+{
+ g_main_loop_quit(data);
+ return G_SOURCE_CONTINUE;
+}
+
+static gboolean disk_update(gpointer data)
+{
+ Button *btn = data;
+
+ struct statvfs buffer;
+ g_assert(statvfs("/", &buffer) == 0);
+
+ const double total = buffer.f_blocks * buffer.f_frsize;
+ const double available = buffer.f_bfree * buffer.f_frsize;
+ const double used = total - available;
+
+ g_free(btn->text);
+ btn->text = g_strdup_printf(" %d%%", (int)round((used / total) * 100.0));
+
+ log_debug("Updated disk percentage");
+ state_redraw(btn->action_data);
+ return G_SOURCE_CONTINUE;
+}
+
+static gboolean date_update(gpointer data)
{
- g_free(date_ctx->btn->text);
+ Button *btn = data;
+
+ g_free(btn->text);
GDateTime *time = g_date_time_new_now_local();
char *date = g_date_time_format(time, "%A %d %H:%M");
g_assert(date != NULL);
- date_ctx->btn->text = date;
+ btn->text = date;
+
+ struct {
+ State *state;
+ timer_t timer;
+ } *date_ctx = btn->action_data;
- log_debug("Updated date");
+ log_debug("Updated date and time");
state_redraw(date_ctx->state);
struct timespec current;
@@ -69,7 +84,6 @@ static gboolean date_update(Date_Handler *date_ctx)
return G_SOURCE_CONTINUE;
}
-
static void show_action(Button *btn)
{
log_info("Called action: %s", btn->text);
@@ -83,6 +97,7 @@ static void quit_action(Button *btn)
int main(int argc, char **argv)
{
+ setlocale(LC_CTYPE, "");
g_log_set_default_handler(log_handler, (gpointer)G_LOG_LEVEL_DEBUG);
GMainLoop *mainloop = g_main_loop_new(NULL, FALSE);
@@ -118,23 +133,30 @@ int main(int argc, char **argv)
state_add_button(state, btn);
}
- Button *long_btn = button_create("long button", PANGO_ALIGN_RIGHT);
- button_set_colors(long_btn, background, foreground, stroke);
- button_set_action(long_btn, show_action, NULL);
- state_add_button(state, long_btn);
+ Button *disk_btn = button_create("disk", PANGO_ALIGN_RIGHT);
+ button_set_colors(disk_btn, background, foreground, stroke);
+ button_set_action(disk_btn, show_action, state);
+ state_add_button(state, disk_btn);
+
+ disk_update(disk_btn);
+ g_timeout_add(60 * 1000, disk_update, disk_btn);
+
+ struct {
+ State *state;
+ timer_t timer;
+ } date_ctx = { state, 0 };
Button *date_btn = button_create("date", PANGO_ALIGN_CENTER);
button_set_colors(date_btn, background, foreground, stroke);
- button_set_action(date_btn, show_action, NULL);
+ button_set_action(date_btn, show_action, &date_ctx);
state_add_button(state, date_btn);
struct sigevent sev = { 0 };
sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = SIGUSR1;
- Date_Handler date_ctx = { state, date_btn, 0 };
g_assert(timer_create(CLOCK_REALTIME, &sev, &date_ctx.timer) == 0);
- date_update(&date_ctx);
+ date_update(date_btn);
// purple
Color background2 = { 0.502, 0.168, 0.886, 1 };
@@ -146,12 +168,10 @@ int main(int argc, char **argv)
connect_attach_state(con, state);
connect_attach_source(con);
- guint source_alrm = g_unix_signal_add(SIGUSR1, (void *)date_update, &date_ctx);
+ guint source_alrm = g_unix_signal_add(SIGUSR1, date_update, date_btn);
guint source_term = g_unix_signal_add(SIGTERM, mainloop_quit, mainloop);
guint source_int = g_unix_signal_add(SIGINT, mainloop_quit, mainloop);
- // TODO: Redraw only when needed (dirty flag)
- //guint id = g_timeout_add(1000, mainloop_draw, state);
state_redraw(state);
log_debug("Starting main loop");