From 56412a8e8b3ee508d560c502bc76a60c617af5dd Mon Sep 17 00:00:00 2001 From: anihilis Date: Thu, 12 Feb 2026 10:35:18 -0800 Subject: [PATCH 01/10] initial commit -- upload --- README.md | 6 +- clock | Bin 0 -> 25984 bytes clock.c | 211 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 215 insertions(+), 2 deletions(-) create mode 100755 clock create mode 100644 clock.c diff --git a/README.md b/README.md index 7eb4904..89f9b7b 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,4 @@ -# cclock - +# cclock +#### Simply C program to display the time and temperature without too much fuss, made for home use. + +Build with ```gcc -Wall -Wextra -pedantic -std=c11 clock.c -lncurses -o clock``` diff --git a/clock b/clock new file mode 100755 index 0000000000000000000000000000000000000000..7c438daa5cb10c741c9af9ebe9f34e8b6eb847f0 GIT binary patch literal 25984 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 AYXATM literal 0 HcmV?d00001 diff --git a/clock.c b/clock.c new file mode 100644 index 0000000..3e682df --- /dev/null +++ b/clock.c @@ -0,0 +1,211 @@ +#define _POSIX_C_SOURCE 200809L + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static volatile sig_atomic_t running = 1; +static volatile sig_atomic_t resized = 0; + +static void handle_sigint(int sig) { (void)sig; running = 0; } +static void handle_winch(int sig) { (void)sig; resized = 1; } + +/* ---------------- Config ---------------- */ +typedef struct { + char api_key[128]; + char location[64]; + char units[16]; +} config_t; + +/* Simple TOML parser for [weather] section */ +static bool load_config_toml(config_t *cfg, const char *path) { + FILE *f = fopen(path, "r"); + if (!f) return false; + + bool in_weather_section = false; + while (!feof(f)) { + char line[256]; + if (!fgets(line, sizeof(line), f)) break; + + /* Remove comments */ + char *hash = strchr(line, '#'); + if (hash) *hash = '\0'; + + /* Strip leading/trailing whitespace */ + char *start = line; + while (*start && (*start == ' ' || *start == '\t')) start++; + char *end = start + strlen(start) - 1; + while (end > start && (*end == ' ' || *end == '\t' || *end == '\n' || *end == '\r')) *end-- = '\0'; + + if (strlen(start) == 0) continue; + + if (start[0] == '[' && start[strlen(start)-1] == ']') { + if (strncmp(start+1, "weather", 7) == 0) in_weather_section = true; + else in_weather_section = false; + continue; + } + + if (!in_weather_section) continue; + + char key[32], val[128]; + if (sscanf(start, "%31[^=]= \"%127[^\"]\"", key, val) == 2) { + char *k_end = key + strlen(key) - 1; + while (k_end > key && (*k_end == ' ' || *k_end == '\t')) *k_end-- = '\0'; + + if (strcmp(key, "api_key") == 0) strncpy(cfg->api_key, val, sizeof(cfg->api_key)-1); + else if (strcmp(key, "location") == 0) strncpy(cfg->location, val, sizeof(cfg->location)-1); + else if (strcmp(key, "units") == 0) strncpy(cfg->units, val, sizeof(cfg->units)-1); + } + } + + fclose(f); + return cfg->api_key[0] && cfg->location[0]; +} + +/* ---------------- libcurl callback ---------------- */ +struct mem { + char *data; + size_t size; +}; + +static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *userdata) { + struct mem *m = (struct mem *)userdata; + size_t total = size * nmemb; + + if (m->size + total < 10240) { + memcpy(m->data + m->size, ptr, total); + m->size += total; + m->data[m->size] = '\0'; + } + return total; +} + +/* ---------------- Fetch temperature ---------------- */ +bool fetch_temp_owm(const config_t *cfg, char *out, size_t out_size) { + if (!cfg || !out) return false; + + CURL *curl = curl_easy_init(); + if (!curl) return false; + + char url[512]; + snprintf(url, sizeof(url), + "https://api.openweathermap.org/data/2.5/weather?q=%s&units=%s&appid=%s", + cfg->location, cfg->units[0] ? cfg->units : "metric", cfg->api_key); + + char buffer[10240] = {0}; + struct mem m = { buffer, 0 }; + + curl_easy_setopt(curl, CURLOPT_URL, url); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &m); + curl_easy_setopt(curl, CURLOPT_USERAGENT, "tty-clock-weather/1.0"); + + CURLcode res = curl_easy_perform(curl); + curl_easy_cleanup(curl); + + if (res != CURLE_OK) return false; + + char *p = strstr(buffer, "\"temp\":"); + if (!p) return false; + p += 7; + + double temp = atof(p); + char unit = (cfg->units[0] && strcmp(cfg->units, "imperial") == 0) ? 'F' : 'C'; + snprintf(out, out_size, "%.0f°%c %s", temp, unit, cfg->location); + + return true; +} + +/* ---------------- Main ---------------- */ +int main(int argc, char **argv) { + config_t cfg = {0}; + char config_path[512]; + snprintf(config_path, sizeof(config_path), "%s/.config/cclock/config", getenv("HOME")); + + if (!load_config_toml(&cfg, config_path)) { + printf("Failed to load config from %s\n", config_path); + return 1; + } + + bool twelve_hour = false; + for (int i = 1; i < argc; i++) + if (strcmp(argv[i], "-t") == 0) twelve_hour = true; + + signal(SIGINT, handle_sigint); + signal(SIGWINCH, handle_winch); + + initscr(); + cbreak(); + noecho(); + curs_set(0); + keypad(stdscr, TRUE); + nodelay(stdscr, TRUE); + + curl_global_init(CURL_GLOBAL_DEFAULT); + + char time_buf[16], date_buf[11], temp_buf[64]; + time_t last_fetch = 0; + const int refresh_interval = 600; /* 10 minutes */ + + if (!fetch_temp_owm(&cfg, temp_buf, sizeof(temp_buf))) + strncpy(temp_buf, "N/A", sizeof(temp_buf)); + + while (running) { + if (resized) { + endwin(); + refresh(); + clear(); + resized = 0; + } + + clear(); + + time_t now = time(NULL); + struct tm *tm_now = localtime(&now); + if (!tm_now) break; + + const char *time_fmt = twelve_hour ? "%I:%M %p" : "%H:%M"; + strftime(time_buf, sizeof(time_buf), time_fmt, tm_now); + strftime(date_buf, sizeof(date_buf), "%m/%d/%Y", tm_now); + + if (difftime(now, last_fetch) >= refresh_interval) { + if (!fetch_temp_owm(&cfg, temp_buf, sizeof(temp_buf))) + strncpy(temp_buf, "N/A", sizeof(temp_buf)); + last_fetch = now; + } + + int rows, cols; + getmaxyx(stdscr, rows, cols); + + int time_x = (cols - strlen(time_buf)) / 2; + int y_mid = rows / 2; + attron(A_BOLD); + mvprintw(y_mid, time_x, "%s", time_buf); + attroff(A_BOLD); + + int date_x = (cols - strlen(date_buf)) / 2; + mvprintw(y_mid + 1, date_x, "%s", date_buf); + + int temp_x = (cols - strlen(temp_buf)) / 2; + mvprintw(y_mid + 2, temp_x, "%s", temp_buf); + + mvprintw(rows - 1, 0, "Press 'q' to quit"); + + refresh(); + + int ch = getch(); + if (ch == 'q' || ch == 'Q') break; + + sleep(1); + } + + curl_global_cleanup(); + endwin(); + return 0; +} From bf7f116bed1c8c1189f77e6b7671d1a861409b30 Mon Sep 17 00:00:00 2001 From: anihilis Date: Thu, 12 Feb 2026 10:38:06 -0800 Subject: [PATCH 02/10] updated README --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 89f9b7b..6ea7c86 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,11 @@ # cclock #### Simply C program to display the time and temperature without too much fuss, made for home use. -Build with ```gcc -Wall -Wextra -pedantic -std=c11 clock.c -lncurses -o clock``` +Current the only dependencies are: +``` +gcc +libncurses +libcurl +``` + +Build with ```gcc -Wall -Wextra -pedantic -std=c11 clock.c -lncurses -lcurl -o clock``` From 1d93eb8f53809a51a905a6687c197c294ca7c0e2 Mon Sep 17 00:00:00 2001 From: anihilis Date: Thu, 12 Feb 2026 10:58:34 -0800 Subject: [PATCH 03/10] forgot to rename the C file, fixed README for same problem. --- README.md | 2 +- clock.c => cclock.c | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename clock.c => cclock.c (100%) diff --git a/README.md b/README.md index 6ea7c86..5cfb6a5 100644 --- a/README.md +++ b/README.md @@ -8,4 +8,4 @@ libncurses libcurl ``` -Build with ```gcc -Wall -Wextra -pedantic -std=c11 clock.c -lncurses -lcurl -o clock``` +Build with ```gcc -Wall -Wextra -pedantic -std=c11 cclock.c -lncurses -lcurl -o cclock``` diff --git a/clock.c b/cclock.c similarity index 100% rename from clock.c rename to cclock.c From e38bf84a6c385f4c129b831ce7323c811e18c6c2 Mon Sep 17 00:00:00 2001 From: anihilis Date: Thu, 12 Feb 2026 11:16:14 -0800 Subject: [PATCH 04/10] fixed README to show config example --- README.md | 12 +++++++++++- error | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 error diff --git a/README.md b/README.md index 5cfb6a5..bd168a9 100644 --- a/README.md +++ b/README.md @@ -8,4 +8,14 @@ libncurses libcurl ``` -Build with ```gcc -Wall -Wextra -pedantic -std=c11 cclock.c -lncurses -lcurl -o cclock``` +Build with ```gcc -Wall -Wextra -pedantic -std=c11 cclock.c -lncurses -lcurl -o cclock``` + +To effectively use this program, there is a toml config you must provide +$HOME/.conifg/cclock/config +``` +[weather] +api_key = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +location = "Portland,US" +units = "imperial" # metric is another option +``` + diff --git a/error b/error new file mode 100644 index 0000000..c70d5e6 --- /dev/null +++ b/error @@ -0,0 +1 @@ +cannot evaluate a function that has an argument without a value ('lib') Nix attempted to evaluate a function as a top level expression; in this case it must have its arguments supplied either by default values, or passed explicitly with '--arg' or '--argstr'. From 90ce4d2338d7be2bb1763bbe76ce0c0927461150 Mon Sep 17 00:00:00 2001 From: anihilis Date: Mon, 16 Feb 2026 12:09:24 -0800 Subject: [PATCH 05/10] added several flags for customization --- cclock | Bin 0 -> 20856 bytes cclock.c | 132 +++++++++++++++++++++++++++++++++++++++++++++++++------ clock | Bin 25984 -> 0 bytes 3 files changed, 118 insertions(+), 14 deletions(-) create mode 100755 cclock delete mode 100755 clock diff --git a/cclock b/cclock new file mode 100755 index 0000000000000000000000000000000000000000..709b6cd31f60083657743489b0022b93c8247bb7 GIT binary patch literal 20856 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 refresh_interval) { if (!fetch_temp_owm(&cfg, temp_buf, sizeof(temp_buf))) @@ -192,10 +293,13 @@ int main(int argc, char **argv) { int date_x = (cols - strlen(date_buf)) / 2; mvprintw(y_mid + 1, date_x, "%s", date_buf); - int temp_x = (cols - strlen(temp_buf)) / 2; - mvprintw(y_mid + 2, temp_x, "%s", temp_buf); + if (!hide_temp) { + int temp_x = (cols - strlen(temp_buf)) / 2; + mvprintw(y_mid + 2, temp_x, "%s", temp_buf); + } - mvprintw(rows - 1, 0, "Press 'q' to quit"); + if (!quiet) + mvprintw(rows - 1, 0, "Press 'q' to quit"); refresh(); diff --git a/clock b/clock deleted file mode 100755 index 7c438daa5cb10c741c9af9ebe9f34e8b6eb847f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25984 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 AYXATM From 9c6b92372bda859ed11cb8643ed20fda6f05186b Mon Sep 17 00:00:00 2001 From: anihilis Date: Mon, 16 Feb 2026 20:20:24 +0000 Subject: [PATCH 06/10] fixed some missplaced flags --- cclock | Bin 20856 -> 20856 bytes cclock.c | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cclock b/cclock index 709b6cd31f60083657743489b0022b93c8247bb7..1e22c4022661d864544bd0de24c1958e1ec7d127 100755 GIT binary patch delta 83 zcmeydi1EiF#tjn0Ih9PTKsHZ!(9hM`1{b lvs)||7lVI6NoIatu@wUtC@AQbC`?`|-p3fS*+jy{5&&nM9Pj`D delta 83 zcmeydi1EiF#tjtz%@=fNDH8k=l nEOB;=<>F%SFDS{(&nvcK009LBT|=YEOU3&bOE#NGxL5)J4`v^H diff --git a/cclock.c b/cclock.c index 5aad641..640ec28 100644 --- a/cclock.c +++ b/cclock.c @@ -161,13 +161,13 @@ for (int i = 1; i < argc; i++) { /* Help/Usage output */ show_help: -printf("Usage: %s [-12HqtCF]\n\n", argv[0]); +printf("Usage: %s [-HqTtCF]\n\n", argv[0]); printf("Options:\n"); -printf(" -12 Use 12-hour time format\n"); +printf(" -t Use 12-hour time format\n"); printf(" -H Human-readable date (\"Tuesday 16, Feb\")\n"); printf(" -q Hide \"Press q to quit\" footer\n"); -printf(" -t Hide temperature display\n"); +printf(" -T Hide temperature display\n"); printf(" -C Force Celsius\n"); printf(" -F Force Fahrenheit\n"); printf(" -h,--help Show this help\n"); From 474108c9759254b2592b56623a9ff2665b0c1dd8 Mon Sep 17 00:00:00 2001 From: anihilis Date: Mon, 16 Feb 2026 17:49:19 -0800 Subject: [PATCH 07/10] fixed goto placement --- cclock | Bin 20856 -> 26032 bytes cclock.c | 32 ++++++++++++++------------------ 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/cclock b/cclock index 1e22c4022661d864544bd0de24c1958e1ec7d127..dd001a85d32a22694a0982be144562ce32a23346 100755 GIT binary patch literal 26032 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 diff --git a/cclock.c b/cclock.c index 640ec28..f17d789 100644 --- a/cclock.c +++ b/cclock.c @@ -158,22 +158,6 @@ for (int i = 1; i < argc; i++) { } } -/* Help/Usage output */ -show_help: - -printf("Usage: %s [-HqTtCF]\n\n", argv[0]); - -printf("Options:\n"); -printf(" -t Use 12-hour time format\n"); -printf(" -H Human-readable date (\"Tuesday 16, Feb\")\n"); -printf(" -q Hide \"Press q to quit\" footer\n"); -printf(" -T Hide temperature display\n"); -printf(" -C Force Celsius\n"); -printf(" -F Force Fahrenheit\n"); -printf(" -h,--help Show this help\n"); - -return 0; - /* NOW load config */ config_t cfg = {0}; @@ -226,8 +210,7 @@ for (int i = 1; i < argc; i++) { break; case 'h': - printf("Usage: %s [-tH]\n", argv[0]); - return 0; + goto show_help; default: printf("Unknown flag: -%c\n", argv[i][j]); @@ -311,5 +294,18 @@ for (int i = 1; i < argc; i++) { curl_global_cleanup(); endwin(); + + /* Help/Usage output */ + show_help: + + printf("Usage: %s [-HqTtCF]\n\n", argv[0]); + printf("Options:\n"); + printf(" -t Use 12-hour time format\n"); + printf(" -H Human-readable date (\"Tuesday 16, Feb\")\n"); + printf(" -q Hide \"Press q to quit\" footer\n"); + printf(" -T Hide temperature display\n"); + printf(" -C Force Celsius\n"); + printf(" -F Force Fahrenheit\n"); + printf(" -h,--help Show this help\n"); return 0; } From ac5e3349560dc87828bc1bf61c611525ed2be23d Mon Sep 17 00:00:00 2001 From: anihilis Date: Tue, 17 Feb 2026 09:33:48 -0800 Subject: [PATCH 08/10] lack of config is handled more lax, began work for summoning a custom config --- cclock | Bin 26032 -> 26032 bytes cclock.c | 36 ++++++++++++++++++++++-------------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/cclock b/cclock index dd001a85d32a22694a0982be144562ce32a23346..78ccf25800ff287e98048c74b429c9c39309ac20 100755 GIT binary patch delta 2532 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 Date: Tue, 17 Feb 2026 12:51:25 -0800 Subject: [PATCH 09/10] fixed buffer for human-readable date --- cclock | Bin 26032 -> 26032 bytes cclock.c | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/cclock b/cclock index 78ccf25800ff287e98048c74b429c9c39309ac20..46470c7285a07a28a78b92a6d2bf636963a05532 100755 GIT binary patch delta 252 zcmdmRnh}IFm_=$8+e&M{Oi+_pof2_wvkh}5H{S_n28PbPHh=#A_vqYe zFnKedIitbk*L-@629u@u4Hyk3d-JbhG?@H@zlqUcaZ~tVL|Hg(#m?z@PvBcR4UHFzj2d=Kxl? j@u1%ipdQ-DrGavkh}5H{T9s28PbPK7aoI_vqZ} zFnKedIithm*L-@64wI$$4Hz9Jd-JbhbeQ~uzlqUdaDw0ve1yn_mm)Gcr0% zmKFjjQWO@MoFG)m=r9??dM9KAW@#|`O!g9PVN95OURZ-MVe${*T#g8kO}(uVlXFE1 zMHl}0|9>Ap0|SFc=kXVX@Bjbz=x&Xe{8>Z~tVL|Hg(#m?!k_>DcR4UHFzj2d=Kxl? j Date: Sun, 15 Mar 2026 23:11:26 -0700 Subject: [PATCH 10/10] update --- cclock | Bin 26032 -> 26032 bytes cclock.bkp.c | 319 +++++++++++++++++++++++++++++++++++++++++++++++++++ cclock.c | 6 +- toml-parse | Bin 0 -> 12632 bytes toml-parse.c | 26 +++++ 5 files changed, 348 insertions(+), 3 deletions(-) create mode 100644 cclock.bkp.c create mode 100755 toml-parse create mode 100644 toml-parse.c diff --git a/cclock b/cclock index 46470c7285a07a28a78b92a6d2bf636963a05532..1cf1aaa1681b0c674af09b3ce8d412ffc5d44127 100755 GIT binary patch delta 158 zcmdmRnh}IFm_?5MR+t{fGik{JNzlU9^1jdz`*b#^!@+;9^I^Y)(i~0Kmz+17!(*hI*-4Q`2bSC!Xx>H zM{nzdKmY%O1ed@4|KCINut(=DkIoAo7hiO`&hhA-3X<(Eoiq8NsPN=aF$+e<&3$4@ F{s3;`O!EK$ delta 152 zcmdmRnh}IFm_=$8+e&M{Oi+_pof2_wvkmiXA#;!3sT=2e~)g~LTd(wT_Ayd3=9ek9-YTu$WIm&6VYAu_Wyqm w&BGp@w>&y8cwBtZ={l#|bwO_hqet)52_QpV=fF)oHrZdyj*)3|pO}(A0A5^0;Q#;t diff --git a/cclock.bkp.c b/cclock.bkp.c new file mode 100644 index 0000000..192f620 --- /dev/null +++ b/cclock.bkp.c @@ -0,0 +1,319 @@ +#define _POSIX_C_SOURCE 200809L + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static volatile sig_atomic_t running = 1; +static volatile sig_atomic_t resized = 0; + +static void handle_sigint(int sig) { (void)sig; running = 0; } +static void handle_winch(int sig) { (void)sig; resized = 1; } + +/* ---------------- Config ---------------- */ +typedef struct { + char api_key[128]; + char location[64]; + char units[16]; +} config_t; + +/* Simple TOML parser for [weather] section */ +static bool load_config_toml(config_t *cfg, const char *path) { + FILE *f = fopen(path, "r"); + if (!f) return false; + + bool in_weather_section = false; + while (!feof(f)) { + char line[256]; + if (!fgets(line, sizeof(line), f)) break; + + /* Remove comments */ + char *hash = strchr(line, '#'); + if (hash) *hash = '\0'; + + /* Strip leading/trailing whitespace */ + char *start = line; + while (*start && (*start == ' ' || *start == '\t')) start++; + char *end = start + strlen(start) - 1; + while (end > start && (*end == ' ' || *end == '\t' || *end == '\n' || *end == '\r')) *end-- = '\0'; + + if (strlen(start) == 0) continue; + + if (start[0] == '[' && start[strlen(start)-1] == ']') { + if (strncmp(start+1, "weather", 7) == 0) in_weather_section = true; + else in_weather_section = false; + continue; + } + + if (!in_weather_section) continue; + + char key[32], val[128]; + if (sscanf(start, "%31[^=]= \"%127[^\"]\"", key, val) == 2) { + char *k_end = key + strlen(key) - 1; + while (k_end > key && (*k_end == ' ' || *k_end == '\t')) *k_end-- = '\0'; + + if (strcmp(key, "api_key") == 0) strncpy(cfg->api_key, val, sizeof(cfg->api_key)-1); + else if (strcmp(key, "location") == 0) strncpy(cfg->location, val, sizeof(cfg->location)-1); + else if (strcmp(key, "units") == 0) strncpy(cfg->units, val, sizeof(cfg->units)-1); + } + } + + fclose(f); + return cfg->api_key[0] && cfg->location[0]; +} + +/* ---------------- libcurl callback ---------------- */ +struct mem { + char *data; + size_t size; +}; + +static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *userdata) { + struct mem *m = (struct mem *)userdata; + size_t total = size * nmemb; + + if (m->size + total < 10240) { + memcpy(m->data + m->size, ptr, total); + m->size += total; + m->data[m->size] = '\0'; + } + return total; +} + +/* ---------------- Fetch temperature ---------------- */ +bool fetch_temp_owm(const config_t *cfg, char *out, size_t out_size) { + if (!cfg || !out) return false; + + CURL *curl = curl_easy_init(); + if (!curl) return false; + + char url[512]; + snprintf(url, sizeof(url), + "https://api.openweathermap.org/data/2.5/weather?q=%s&units=%s&appid=%s", + cfg->location, cfg->units[0] ? cfg->units : "metric", cfg->api_key); + + char buffer[10240] = {0}; + struct mem m = { buffer, 0 }; + + curl_easy_setopt(curl, CURLOPT_URL, url); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &m); + curl_easy_setopt(curl, CURLOPT_USERAGENT, "tty-clock-weather/1.0"); + + CURLcode res = curl_easy_perform(curl); + curl_easy_cleanup(curl); + + if (res != CURLE_OK) return false; + + char *p = strstr(buffer, "\"temp\":"); + if (!p) return false; + p += 7; + + double temp = atof(p); + char unit = (cfg->units[0] && strcmp(cfg->units, "imperial") == 0) ? 'F' : 'C'; + snprintf(out, out_size, "%.0f°%c %s", temp, unit, cfg->location); + + return true; +} + +/* ---------------- Main ---------------- */ +int main(int argc, char **argv) { +bool twelve_hour = false; +bool human_date = false; +bool quiet = false; +bool hide_temp = false; +bool force_c = false; +bool force_f = false; + +/* Parse CLI flags FIRST */ + +for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "--help") == 0) { + goto show_help; + } + if (argv[i][0] != '-') continue; + + for (int j = 1; argv[i][j]; j++) { + switch (argv[i][j]) { + case 't': twelve_hour = true; break; + case 'H': human_date = true; break; + case 'q': quiet = true; break; + case 'T': hide_temp = true; break; + case 'C': force_c = true; break; + case 'F': force_f = true; break; + + case 'h': + goto show_help; + + show_help: + + printf("Usage: %s [-HqTtCF]\n\n", argv[0]); + printf("Options:\n"); + printf(" -t Use 12-hour time format\n"); + printf(" -H Human-readable date (\"Tuesday 16, Feb\")\n"); + printf(" -q Hide \"Press q to quit\" footer\n"); + printf(" -T Hide temperature display\n"); + printf(" -C Force Celsius\n"); + printf(" -F Force Fahrenheit\n"); + printf(" -h,--help Show this help\n"); + return 0; + + default: + printf("Unknown flag: -%c\n", argv[i][j]); + return 1; + } + } +} + +/* NOW load config */ + +config_t cfg = {0}; +char config_path[512]; +snprintf(config_path, sizeof(config_path), "%s/.config/cclock/config", getenv("HOME")); + +if (!load_config_toml(&cfg, config_path)) { + hide_temp = true; + printf("Failed to load config from %s\n", config_path); +} +/* WORK IN PROGRESS CUSTOM_CONFIG +else if (custom_config = true) { + snprintf(config_path, sizeof(config_path), "%s/.config/cclock/config", getenv("HOME")); +}*/ + + +/* NOW apply overrides */ + +if (force_c) { + strncpy(cfg.units, "metric", sizeof(cfg.units) - 1); + cfg.units[sizeof(cfg.units) - 1] = '\0'; +} +else if (force_f) { + strncpy(cfg.units, "imperial", sizeof(cfg.units) - 1); + cfg.units[sizeof(cfg.units) - 1] = '\0'; +} + +for (int i = 1; i < argc; i++) { + if (argv[i][0] != '-') continue; + + for (int j = 1; argv[i][j]; j++) { + switch (argv[i][j]) { + case 't': + twelve_hour = true; + break; + + case 'T': + hide_temp = true; + break; + + case 'C': + force_c = true; + break; + + case 'F': + force_f = true; + break; + + case 'H': + human_date = true; + break; + + case 'q': + quiet = true; + break; + + /*case 'c': + goto custom_config;*/ + + case 'h': + goto show_help; + + default: + printf("Unknown flag: -%c\n", argv[i][j]); + return 1; + } + } +} + + signal(SIGINT, handle_sigint); + signal(SIGWINCH, handle_winch); + + initscr(); + cbreak(); + noecho(); + curs_set(0); + keypad(stdscr, TRUE); + nodelay(stdscr, TRUE); + + curl_global_init(CURL_GLOBAL_DEFAULT); + + char time_buf[16], date_buf[20], temp_buf[64]; + time_t last_fetch = 0; + const int refresh_interval = 600; /* 10 minutes */ + + if (!fetch_temp_owm(&cfg, temp_buf, sizeof(temp_buf))) + strncpy(temp_buf, "N/A", sizeof(temp_buf)); + + while (running) { + if (resized) { + endwin(); + refresh(); + clear(); + resized = 0; + } + + clear(); + + time_t now = time(NULL); + struct tm *tm_now = localtime(&now); + if (!tm_now) break; + + const char *time_fmt = twelve_hour ? "%I:%M %p" : "%H:%M"; + strftime(time_buf, sizeof(time_buf), time_fmt, tm_now); + + const char *date_fmt = human_date ? "%A %d, %b" : "%m/%d/%Y"; + strftime(date_buf, sizeof(date_buf), date_fmt, tm_now); + + if (difftime(now, last_fetch) >= refresh_interval) { + if (!fetch_temp_owm(&cfg, temp_buf, sizeof(temp_buf))) + strncpy(temp_buf, "N/A", sizeof(temp_buf)); + last_fetch = now; + } + + int rows, cols; + getmaxyx(stdscr, rows, cols); + + int time_x = (cols - strlen(time_buf)) / 2; + int y_mid = rows / 2; + attron(A_BOLD); + mvprintw(y_mid -1, time_x, "%s", time_buf); + attroff(A_BOLD); + + int date_x = (cols - strlen(date_buf)) / 2; + mvprintw(y_mid, date_x, "%s", date_buf); + + if (!hide_temp) { + int temp_x = (cols - strlen(temp_buf)) / 2; + mvprintw(y_mid + 1, temp_x, "%s", temp_buf); + } + + if (!quiet) + mvprintw(rows - 1, 0, "Press 'q' to quit"); + + refresh(); + + int ch = getch(); + if (ch == 'q' || ch == 'Q') break; + + sleep(1); + } + + curl_global_cleanup(); + endwin(); + return 0; +} diff --git a/cclock.c b/cclock.c index e63f70f..192f620 100644 --- a/cclock.c +++ b/cclock.c @@ -291,15 +291,15 @@ for (int i = 1; i < argc; i++) { int time_x = (cols - strlen(time_buf)) / 2; int y_mid = rows / 2; attron(A_BOLD); - mvprintw(y_mid, time_x, "%s", time_buf); + mvprintw(y_mid -1, time_x, "%s", time_buf); attroff(A_BOLD); int date_x = (cols - strlen(date_buf)) / 2; - mvprintw(y_mid + 1, date_x, "%s", date_buf); + mvprintw(y_mid, date_x, "%s", date_buf); if (!hide_temp) { int temp_x = (cols - strlen(temp_buf)) / 2; - mvprintw(y_mid + 2, temp_x, "%s", temp_buf); + mvprintw(y_mid + 1, temp_x, "%s", temp_buf); } if (!quiet) diff --git a/toml-parse b/toml-parse new file mode 100755 index 0000000000000000000000000000000000000000..09b80acec276ba358c4b09dcd0b71802bf33e243 GIT binary patch literal 12632 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 GxC{Uxj&QvI literal 0 HcmV?d00001 diff --git a/toml-parse.c b/toml-parse.c new file mode 100644 index 0000000..3408764 --- /dev/null +++ b/toml-parse.c @@ -0,0 +1,26 @@ +#include +#include + +typedef struct { + char api_key[128]; + char location[64]; + char units[16]; +} config_t; + +static bool load_config_toml(config_t *cfg, const char *path) { + +int main() { + config_t cfg = {0}; + char config_path[512]; + snprintf(config_path, sizeof(config_path), "%s/.config/cclock/config", getenv("HOME")); + + if (!load_config_toml(&cfg, config_path)) { + printf("Failed to load config from %s\n", config_path); + } + + else if (load_config_toml(&cfg, config_path)) { + printf("Loaded config from %s\n", config_path); + } + + return 0; +}