summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-06 15:09:09 +0300
committerPaul Buetow <paul@buetow.org>2026-04-06 15:09:09 +0300
commit61b5b70c8cb96908309ba2299b7335966d54e420 (patch)
tree35544b009a8fcd75864a4a4ae40a4fc25ca713c4
parentdec06a442481ee864ed784597d431000173acae6 (diff)
initial
-rw-r--r--.gitignore27
-rw-r--r--package.json32
-rw-r--r--src/c/fastforge.c60
-rw-r--r--wscript54
4 files changed, 173 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..b59b919
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,27 @@
+# Pebble SDK build artifacts
+build/
+*.pbw
+*.elf
+*.bin
+*.raw.bin
+*.map
+*.o
+
+# Waf build system temporary files
+.lock-waf*
+.wafpickle*
+config.log
+
+# Auto-generated files
+src/message_keys.auto.c
+build/src/message_keys.auto.c
+build/include/message_keys.auto.h
+build/*/resource_ids.auto.*
+build/*/appinfo.auto.c
+build/*/pebble_app.ld.auto
+build/*/app_resources.pbpack
+build/*/system_resources.resball
+
+# Logs and locks
+*.log
+.lock-*
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..2e2224a
--- /dev/null
+++ b/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "fastforge",
+ "author": "MakeAwesomeHappen",
+ "version": "1.0.0",
+ "keywords": ["pebble-app"],
+ "private": true,
+ "dependencies": {},
+ "pebble": {
+ "displayName": "fastforge",
+ "uuid": "dee8dfc5-60b2-4c77-9315-08d96d7e4e38",
+ "sdkVersion": "3",
+ "enableMultiJS": true,
+ "targetPlatforms": [
+ "aplite",
+ "basalt",
+ "chalk",
+ "diorite",
+ "emery",
+ "flint",
+ "gabbro"
+ ],
+ "watchapp": {
+ "watchface": false
+ },
+ "messageKeys": [
+ "dummy"
+ ],
+ "resources": {
+ "media": []
+ }
+ }
+}
diff --git a/src/c/fastforge.c b/src/c/fastforge.c
new file mode 100644
index 0000000..8db0492
--- /dev/null
+++ b/src/c/fastforge.c
@@ -0,0 +1,60 @@
+#include <pebble.h>
+
+static Window *s_window;
+static TextLayer *s_text_layer;
+
+static void prv_select_click_handler(ClickRecognizerRef recognizer, void *context) {
+ text_layer_set_text(s_text_layer, "Select");
+}
+
+static void prv_up_click_handler(ClickRecognizerRef recognizer, void *context) {
+ text_layer_set_text(s_text_layer, "Up");
+}
+
+static void prv_down_click_handler(ClickRecognizerRef recognizer, void *context) {
+ text_layer_set_text(s_text_layer, "Down");
+}
+
+static void prv_click_config_provider(void *context) {
+ window_single_click_subscribe(BUTTON_ID_SELECT, prv_select_click_handler);
+ window_single_click_subscribe(BUTTON_ID_UP, prv_up_click_handler);
+ window_single_click_subscribe(BUTTON_ID_DOWN, prv_down_click_handler);
+}
+
+static void prv_window_load(Window *window) {
+ Layer *window_layer = window_get_root_layer(window);
+ GRect bounds = layer_get_bounds(window_layer);
+
+ s_text_layer = text_layer_create(GRect(0, 72, bounds.size.w, 20));
+ text_layer_set_text(s_text_layer, "Press a button");
+ text_layer_set_text_alignment(s_text_layer, GTextAlignmentCenter);
+ layer_add_child(window_layer, text_layer_get_layer(s_text_layer));
+}
+
+static void prv_window_unload(Window *window) {
+ text_layer_destroy(s_text_layer);
+}
+
+static void prv_init(void) {
+ s_window = window_create();
+ window_set_click_config_provider(s_window, prv_click_config_provider);
+ window_set_window_handlers(s_window, (WindowHandlers) {
+ .load = prv_window_load,
+ .unload = prv_window_unload,
+ });
+ const bool animated = true;
+ window_stack_push(s_window, animated);
+}
+
+static void prv_deinit(void) {
+ window_destroy(s_window);
+}
+
+int main(void) {
+ prv_init();
+
+ APP_LOG(APP_LOG_LEVEL_DEBUG, "Done initializing, pushed window: %p", s_window);
+
+ app_event_loop();
+ prv_deinit();
+}
diff --git a/wscript b/wscript
new file mode 100644
index 0000000..5238bc8
--- /dev/null
+++ b/wscript
@@ -0,0 +1,54 @@
+#
+# This file is the default set of rules to compile a Pebble application.
+#
+# Feel free to customize this to your needs.
+#
+import os.path
+
+top = '.'
+out = 'build'
+
+
+def options(ctx):
+ ctx.load('pebble_sdk')
+
+
+def configure(ctx):
+ """
+ This method is used to configure your build. ctx.load(`pebble_sdk`) automatically configures
+ a build for each valid platform in `targetPlatforms`. Platform-specific configuration: add your
+ change after calling ctx.load('pebble_sdk') and make sure to set the correct environment first.
+ Universal configuration: add your change prior to calling ctx.load('pebble_sdk').
+ """
+ ctx.load('pebble_sdk')
+
+
+def build(ctx):
+ ctx.load('pebble_sdk')
+
+ build_worker = os.path.exists('worker_src')
+ binaries = []
+
+ cached_env = ctx.env
+ for platform in ctx.env.TARGET_PLATFORMS:
+ ctx.env = ctx.all_envs[platform]
+ ctx.set_group(ctx.env.PLATFORM_NAME)
+ app_elf = '{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)
+ ctx.pbl_build(source=ctx.path.ant_glob('src/c/**/*.c'), target=app_elf, bin_type='app')
+
+ if build_worker:
+ worker_elf = '{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)
+ binaries.append({'platform': platform, 'app_elf': app_elf, 'worker_elf': worker_elf})
+ ctx.pbl_build(source=ctx.path.ant_glob('worker_src/c/**/*.c'),
+ target=worker_elf,
+ bin_type='worker')
+ else:
+ binaries.append({'platform': platform, 'app_elf': app_elf})
+ ctx.env = cached_env
+
+ ctx.set_group('bundle')
+ ctx.pbl_bundle(binaries=binaries,
+ js=ctx.path.ant_glob(['src/pkjs/**/*.js',
+ 'src/pkjs/**/*.json',
+ 'src/common/**/*.js']),
+ js_entry_file='src/pkjs/index.js')