summaryrefslogtreecommitdiff
path: root/src/c/app.c
diff options
context:
space:
mode:
authorReiner Herrmann <reiner@reiner-h.de>2026-07-08 00:23:22 +0200
committerReiner Herrmann <reiner@reiner-h.de>2026-07-08 00:23:22 +0200
commitdf2fbf4c9291cce340945a0a71de0200ccae7369 (patch)
tree86573b08e2e8beb8e7bffbb2af1394ecd81ae7d4 /src/c/app.c
initial committrunk
Diffstat (limited to 'src/c/app.c')
-rw-r--r--src/c/app.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/src/c/app.c b/src/c/app.c
new file mode 100644
index 0000000..2ce9996
--- /dev/null
+++ b/src/c/app.c
@@ -0,0 +1,114 @@
+/* Copyright (C) 2026 Reiner Herrmann
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#include <pebble.h>
+#include "metronome.h"
+
+static Window *app_window;
+static ActionBarLayer *action_bar;
+
+static GBitmap *icon_left_arrows;
+static GBitmap *icon_right_arrows;
+static GBitmap *icon_plus;
+static GBitmap *icon_minus;
+static GBitmap *icon_three_dots;
+static GBitmap *icon_pause;
+static GBitmap *icon_play;
+
+static AppTimer *action_bar_timer;
+
+static const int action_bar_timeout = 2000;
+
+static void primary_action_bar();
+static void secondary_action_bar();
+
+static void increase_bpm_handler(ClickRecognizerRef recognizer, void *context) {
+ increase_bpm();
+}
+
+static void decrease_bpm_handler(ClickRecognizerRef recognizer, void *context) {
+ decrease_bpm();
+}
+
+static void increase_beats_handler(ClickRecognizerRef recognizer, void *context) {
+ increase_beats();
+ app_timer_reschedule(action_bar_timer, action_bar_timeout);
+}
+
+static void decrease_beats_handler(ClickRecognizerRef recognizer, void *context) {
+ decrease_beats();
+ app_timer_reschedule(action_bar_timer, action_bar_timeout);
+}
+
+static void switch_to_secondary_handler(ClickRecognizerRef recognizer, void *context) {
+ secondary_action_bar();
+
+ /* switch back to primary after timeout */
+ action_bar_timer = app_timer_register(action_bar_timeout, primary_action_bar, NULL);
+}
+
+static void pause_play_handler(ClickRecognizerRef recognizer, void *context) {
+ if (is_paused()) {
+ start_metronome();
+ action_bar_layer_set_icon(action_bar, BUTTON_ID_SELECT, icon_pause);
+ } else {
+ stop_metronome();
+ action_bar_layer_set_icon(action_bar, BUTTON_ID_SELECT, icon_play);
+ }
+ app_timer_reschedule(action_bar_timer, action_bar_timeout);
+}
+
+static void click_config_provider_primary(void *context) {
+ window_single_click_subscribe(BUTTON_ID_UP, increase_bpm_handler);
+ window_single_click_subscribe(BUTTON_ID_SELECT, switch_to_secondary_handler);
+ window_single_click_subscribe(BUTTON_ID_DOWN, decrease_bpm_handler);
+}
+
+static void click_config_provider_secondary(void *context) {
+ window_single_click_subscribe(BUTTON_ID_UP, increase_beats_handler);
+ window_single_click_subscribe(BUTTON_ID_SELECT, pause_play_handler);
+ window_single_click_subscribe(BUTTON_ID_DOWN, decrease_beats_handler);
+}
+
+static void secondary_action_bar() {
+ action_bar_layer_set_click_config_provider(action_bar, click_config_provider_secondary);
+ action_bar_layer_set_icon(action_bar, BUTTON_ID_UP, icon_plus);
+ action_bar_layer_set_icon(action_bar, BUTTON_ID_DOWN, icon_minus);
+ action_bar_layer_set_icon(action_bar, BUTTON_ID_SELECT, is_paused() ? icon_play : icon_pause);
+}
+
+static void primary_action_bar() {
+ action_bar_layer_set_click_config_provider(action_bar, click_config_provider_primary);
+ action_bar_layer_set_icon(action_bar, BUTTON_ID_UP, icon_right_arrows);
+ action_bar_layer_set_icon(action_bar, BUTTON_ID_DOWN, icon_left_arrows);
+ action_bar_layer_set_icon(action_bar, BUTTON_ID_SELECT, icon_three_dots);
+}
+
+static void init() {
+ icon_left_arrows = gbitmap_create_with_resource(RESOURCE_ID_LEFT_ARROWS);
+ icon_right_arrows = gbitmap_create_with_resource(RESOURCE_ID_RIGHT_ARROWS);
+ icon_plus = gbitmap_create_with_resource(RESOURCE_ID_PLUS);
+ icon_minus = gbitmap_create_with_resource(RESOURCE_ID_MINUS);
+ icon_three_dots = gbitmap_create_with_resource(RESOURCE_ID_THREE_DOTS);
+ icon_pause = gbitmap_create_with_resource(RESOURCE_ID_PAUSE);
+ icon_play = gbitmap_create_with_resource(RESOURCE_ID_PLAY);
+
+ app_window = create_metronome_window();
+
+ action_bar = action_bar_layer_create();
+ action_bar_layer_add_to_window(action_bar, app_window);
+ primary_action_bar();
+
+ window_stack_push(app_window, true);
+}
+
+static void deinit() {
+ window_destroy(app_window);
+}
+
+int main(void) {
+ init();
+ app_event_loop();
+ deinit();
+}