From 702fdbdd809a3d99e47bfe7d90b9e3378834136f Mon Sep 17 00:00:00 2001 From: DogWaterDev Date: Sat, 14 Mar 2026 11:16:38 +0100 Subject: [PATCH 1/3] Added ability to set colors at run-time instead of at compile-time using the --background-color, --pause-color, and --main-color flags, which accept a hexadecimal input (e.g. AAAAAA or 696969). --- README.md | 10 ++++++- src/common.c | 79 ++++++++++++++++++++++++++++++++++++++++++++-------- src/main.c | 20 +++++++------ 3 files changed, 88 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 2d3d127..93de6f0 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,14 @@ $ make $ ./sowon ``` +### Fedora 42+ + +```console +$ sudo dnf install libXi-devel libXrandr-devel +$ make +$ ./sowon +``` + ### MacOS ```console @@ -50,7 +58,7 @@ $ ./sowon | Key | Description | | --- | --- | | SPACE | Toggle pause | -| = | Zoom in | +| = or + | Zoom in | | - | Zoom out | | 0 | Zoom 100% | | F5 | Restart | diff --git a/src/common.c b/src/common.c index b24b10d..b8e4c90 100644 --- a/src/common.c +++ b/src/common.c @@ -1,11 +1,14 @@ #include "digits.h" + #ifdef PENGER #include "penger_walk_sheet.h" #endif #include #include +#include +#include #define FPS 60 #define COLON_INDEX 10 @@ -18,15 +21,6 @@ #define CHARS_COUNT 8 #define TEXT_WIDTH (CHAR_WIDTH * CHARS_COUNT) #define TEXT_HEIGHT (CHAR_HEIGHT) -#define MAIN_COLOR_R 220 -#define MAIN_COLOR_G 220 -#define MAIN_COLOR_B 220 -#define PAUSE_COLOR_R 220 -#define PAUSE_COLOR_G 120 -#define PAUSE_COLOR_B 120 -#define BACKGROUND_COLOR_R 24 -#define BACKGROUND_COLOR_G 24 -#define BACKGROUND_COLOR_B 24 #define PENGER_STEPS_PER_SECOND 3 #define PENGER_SCALE 4 #define SCALE_FACTOR 0.15f @@ -81,6 +75,12 @@ typedef struct { char prev_title[TITLE_CAP]; } State; +typedef struct { + int red; + int green; + int blue; +} Color; + void parse_state_from_args(State *state, int argc, char **argv) { memset(state, 0, sizeof(*state)); @@ -95,13 +95,70 @@ void parse_state_from_args(State *state, int argc, char **argv) state->exit_after_countdown = 1; } else if (strcmp(argv[i], "clock") == 0) { state->mode = MODE_CLOCK; - } else { + } else if (strcmp(argv[i], "-t") == 0) { + if (i+1 == argc) { + fprintf(stderr, "Missing argument for flag -t!\n"); + exit(1); + } state->mode = MODE_COUNTDOWN; - state->displayed_time = parse_time(argv[i]); + state->displayed_time = parse_time(argv[i+1]); } } + } +void parse_hex_color_code(Color *container, char *code) { + container->red = -1; + container->green = -1; + container->blue = -1; + if (strlen(code) != 6) { + printf("Invalid hexademical string enter for color, defaulting to 0!"); + return; + } + int cur = 0; + char *tmp = malloc(3 * sizeof(char)); + for (int i = 0; i < 6; i++) { + if (i % 2 == 0) { + strncpy(tmp, code+i, 2); + tmp[2] = '\0'; + cur = (int)strtol(tmp, NULL, 16); + + if (container->red == -1) { container->red = cur; } + else if (container->green == -1) { container->green = cur; } + else if (container->blue == -1) { container->blue = cur; } + } + } + free(tmp); +} + +void parse_colors_from_args(Color *background_color, Color *pause_color, Color *main_color, int argc, char **argv) { + memset(background_color, 0, sizeof(*background_color)); + memset(pause_color, 0, sizeof(*pause_color)); + memset(main_color, 0, sizeof(*main_color)); + + for (int i = 1; i < argc; ++i) { + if (strcmp(argv[i], "--background-color") == 0) { + if (i+1 == argc) { + fprintf(stderr,"No background color supplied, but flag used!"); + exit(1); + } + parse_hex_color_code(background_color, argv[i+1]); + } else if (strcmp(argv[i], "--pause-color") == 0) { + if (i+1 == argc) { + fprintf(stderr,"No pause color supplied, but flag used!"); + exit(1); + } + parse_hex_color_code(pause_color, argv[i+1]); + } else if (strcmp(argv[i], "--main-color") == 0) { + if (i+1 == argc) { + fprintf(stderr,"No main color supplied, but flag used!"); + exit(1); + } + parse_hex_color_code(main_color, argv[i+1]); + } + } + +} void state_update(State *state, float dt) { if (state->wiggle_cooldown <= 0.0f) { diff --git a/src/main.c b/src/main.c index 79f2e98..bcaef02 100644 --- a/src/main.c +++ b/src/main.c @@ -269,8 +269,12 @@ void render_penger_at(GLint penger_tex_unit, int window_width, int window_height int main(int argc, char **argv) { State state = {0}; + Color background_color = {0}; + Color pause_color = {0}; + Color main_color = {0}; parse_state_from_args(&state, argc, argv); + parse_colors_from_args(&background_color, &pause_color, &main_color, argc, argv); RGFW_glHints *hints = RGFW_getGlobalHints_OpenGL(); hints->profile = RGFW_glCore; @@ -311,11 +315,9 @@ int main(int argc, char **argv) GLint penger_tex_unit = load_image_data_as_gl_texture(penger_data, penger_width, penger_height); #endif - set_texture_color_mod(MAIN_COLOR_R/255.0f, MAIN_COLOR_G/255.0f, MAIN_COLOR_B/255.0f); + set_texture_color_mod(main_color.red/255.0f, main_color.green/255.0f, main_color.blue/255.0f); if (state.paused) { - set_texture_color_mod(PAUSE_COLOR_R/255.0f, PAUSE_COLOR_G/255.0f, PAUSE_COLOR_B/255.0f); - } else { - set_texture_color_mod(MAIN_COLOR_R/255.0f, MAIN_COLOR_G/255.0f, MAIN_COLOR_B/255.0f); + set_texture_color_mod(pause_color.red/255.0f, pause_color.green/255.0f, pause_color.blue/255.0f); } GLuint vao; @@ -341,9 +343,9 @@ int main(int argc, char **argv) case RGFW_space: { state.paused = !state.paused; if (state.paused) { - set_texture_color_mod(PAUSE_COLOR_R/255.0f, PAUSE_COLOR_G/255.0f, PAUSE_COLOR_B/255.0f); + set_texture_color_mod(pause_color.red/255.0f, pause_color.green/255.0f, pause_color.blue/255.0f); } else { - set_texture_color_mod(MAIN_COLOR_R/255.0f, MAIN_COLOR_G/255.0f, MAIN_COLOR_B/255.0f); + set_texture_color_mod(main_color.red/255.0f, main_color.green/255.0f, main_color.blue/255.0f); } } break; @@ -368,9 +370,9 @@ int main(int argc, char **argv) case RGFW_F5: { parse_state_from_args(&state, argc, argv); if (state.paused) { - set_texture_color_mod(PAUSE_COLOR_R/255.0f, PAUSE_COLOR_G/255.0f, PAUSE_COLOR_B/255.0f); + set_texture_color_mod(pause_color.red/255.0f, pause_color.green/255.0f, pause_color.blue/255.0f); } else { - set_texture_color_mod(MAIN_COLOR_R/255.0f, MAIN_COLOR_G/255.0f, MAIN_COLOR_B/255.0f); + set_texture_color_mod(main_color.red/255.0f, main_color.green/255.0f, main_color.blue/255.0f); } } break; @@ -398,7 +400,7 @@ int main(int argc, char **argv) // INPUT END ////////////////////////////// // RENDER BEGIN ////////////////////////////// - glClearColor(BACKGROUND_COLOR_R/255.0f, BACKGROUND_COLOR_G/255.0f, BACKGROUND_COLOR_B/255.0f, 1); + glClearColor(background_color.red/255.0f, background_color.green/255.0f, background_color.blue/255.0f, 1); glClear(GL_COLOR_BUFFER_BIT); { From 3d8dad1a3acff81484da4a59ce518a6cec5fe4dc Mon Sep 17 00:00:00 2001 From: DogWaterDev Date: Sat, 14 Mar 2026 11:22:35 +0100 Subject: [PATCH 2/3] Made error / warning messages cleaner --- src/common.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common.c b/src/common.c index b8e4c90..4361012 100644 --- a/src/common.c +++ b/src/common.c @@ -112,7 +112,7 @@ void parse_hex_color_code(Color *container, char *code) { container->green = -1; container->blue = -1; if (strlen(code) != 6) { - printf("Invalid hexademical string enter for color, defaulting to 0!"); + printf("WARNING: Invalid hexademical string enter for color, defaulting to 0!\n"); return; } int cur = 0; @@ -139,19 +139,19 @@ void parse_colors_from_args(Color *background_color, Color *pause_color, Color * for (int i = 1; i < argc; ++i) { if (strcmp(argv[i], "--background-color") == 0) { if (i+1 == argc) { - fprintf(stderr,"No background color supplied, but flag used!"); + fprintf(stderr,"ERROR: No background color supplied, but flag used!\n"); exit(1); } parse_hex_color_code(background_color, argv[i+1]); } else if (strcmp(argv[i], "--pause-color") == 0) { if (i+1 == argc) { - fprintf(stderr,"No pause color supplied, but flag used!"); + fprintf(stderr,"ERROR: No pause color supplied, but flag used!\n"); exit(1); } parse_hex_color_code(pause_color, argv[i+1]); } else if (strcmp(argv[i], "--main-color") == 0) { if (i+1 == argc) { - fprintf(stderr,"No main color supplied, but flag used!"); + fprintf(stderr,"ERROR: No main color supplied, but flag used!\n"); exit(1); } parse_hex_color_code(main_color, argv[i+1]); From ab1e0ee0f60094e3e79127ae1131dbc365072892 Mon Sep 17 00:00:00 2001 From: DogWaterDev <103907925+DogWaterDev@users.noreply.github.com> Date: Mon, 16 Mar 2026 11:29:53 +0100 Subject: [PATCH 3/3] Create TODO.md --- TODO.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 TODO.md diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..32384fa --- /dev/null +++ b/TODO.md @@ -0,0 +1,13 @@ +# TODO + +## General + + +## QOL + +- more sane defaults for config (default is 0 for all colors rn) + +### Audio +- alert sound when countdown mode is enabled and it hits 0 +- option clock ticking noise +-