From c3ed9017385342944badec46de263560c6ab07c8 Mon Sep 17 00:00:00 2001 From: frosty Date: Mon, 30 Mar 2026 10:37:46 +0300 Subject: feat: begin adding settings menu, move theme to settings --- src/Main.c | 4 ++++ src/Routes/Home.c | 5 +++++ src/Routes/Images.c | 8 +++++++- src/Routes/Search.c | 8 +++++++- src/Routes/Settings.c | 30 ++++++++++++++++++++++++++++++ src/Routes/Settings.h | 8 ++++++++ src/Routes/SettingsSave.c | 28 ++++++++++++++++++++++++++++ src/Routes/SettingsSave.h | 8 ++++++++ src/Utility/Utility.c | 14 ++++++++++++++ src/Utility/Utility.h | 1 + 10 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 src/Routes/Settings.c create mode 100644 src/Routes/Settings.h create mode 100644 src/Routes/SettingsSave.c create mode 100644 src/Routes/SettingsSave.h (limited to 'src') diff --git a/src/Main.c b/src/Main.c index 137cab5..326b5ae 100644 --- a/src/Main.c +++ b/src/Main.c @@ -13,6 +13,8 @@ #include "Routes/ImageProxy.h" #include "Routes/Images.h" #include "Routes/Search.h" +#include "Routes/Settings.h" +#include "Routes/SettingsSave.h" #include "Scraping/Scraping.h" Config global_config; @@ -97,6 +99,8 @@ int main() { set_handler("/search", results_handler); set_handler("/images", images_handler); set_handler("/proxy", image_proxy_handler); + set_handler("/settings", settings_handler); + set_handler("/save_settings", settings_save_handler); fprintf(stderr, "[INFO] Starting Omnisearch on %s:%d\n", cfg.host, cfg.port); diff --git a/src/Routes/Home.c b/src/Routes/Home.c index 4526a9d..c857663 100644 --- a/src/Routes/Home.c +++ b/src/Routes/Home.c @@ -1,14 +1,19 @@ #include "Home.h" +#include "../Utility/Utility.h" #include int home_handler(UrlParams *params) { (void)params; + char *theme = get_theme(""); + TemplateContext ctx = new_context(); + context_set(&ctx, "theme", theme); char *rendered_html = render_template("home.html", &ctx); send_response(rendered_html); free(rendered_html); free_context(&ctx); + free(theme); return 0; } diff --git a/src/Routes/Images.c b/src/Routes/Images.c index 0f8ff1e..03eb280 100644 --- a/src/Routes/Images.c +++ b/src/Routes/Images.c @@ -1,6 +1,7 @@ #include "Images.h" #include "../Scraping/ImageScraping.h" #include "../Utility/Unescape.h" +#include "../Utility/Utility.h" #include "Config.h" int images_handler(UrlParams *params) { @@ -29,6 +30,11 @@ int images_handler(UrlParams *params) { snprintf(two_prev_str, sizeof(two_prev_str), "%d", page > 2 ? page - 2 : 0); snprintf(two_next_str, sizeof(two_next_str), "%d", page + 2); context_set(&ctx, "query", raw_query); + + char *theme = get_theme(""); + context_set(&ctx, "theme", theme); + free(theme); + context_set(&ctx, "page", page_str); context_set(&ctx, "prev_page", prev_str); context_set(&ctx, "next_page", next_str); @@ -39,7 +45,7 @@ int images_handler(UrlParams *params) { context_set(&ctx, "query", display_query); if (!raw_query || strlen(raw_query) == 0) { - send_response("

No query provided

"); + send_redirect("/"); if (display_query) free(display_query); free_context(&ctx); diff --git a/src/Routes/Search.c b/src/Routes/Search.c index 5f89752..81e43d4 100644 --- a/src/Routes/Search.c +++ b/src/Routes/Search.c @@ -7,6 +7,7 @@ #include "../Scraping/Scraping.h" #include "../Utility/Display.h" #include "../Utility/Unescape.h" +#include "../Utility/Utility.h" #include "Config.h" #include #include @@ -401,12 +402,17 @@ int results_handler(UrlParams *params) { } context_set(&ctx, "query", raw_query); + + char *theme = get_theme(""); + context_set(&ctx, "theme", theme); + free(theme); + char page_str[16]; snprintf(page_str, sizeof(page_str), "%d", page); context_set(&ctx, "page", page_str); if (!raw_query || strlen(raw_query) == 0) { - send_response("

No query provided

"); + send_redirect("/"); free_context(&ctx); return -1; } diff --git a/src/Routes/Settings.c b/src/Routes/Settings.c new file mode 100644 index 0000000..05edc56 --- /dev/null +++ b/src/Routes/Settings.c @@ -0,0 +1,30 @@ +#include "Settings.h" +#include "../Utility/Utility.h" +#include +#include + +int settings_handler(UrlParams *params) { + const char *query = ""; + if (params) { + for (int i = 0; i < params->count; i++) { + if (strcmp(params->params[i].key, "q") == 0) { + query = params->params[i].value; + break; + } + } + } + + char *theme = get_theme("system"); + + TemplateContext ctx = new_context(); + context_set(&ctx, "query", query); + context_set(&ctx, "theme", theme); + char *rendered_html = render_template("settings.html", &ctx); + send_response(rendered_html); + + free(rendered_html); + free(theme); + free_context(&ctx); + + return 0; +} diff --git a/src/Routes/Settings.h b/src/Routes/Settings.h new file mode 100644 index 0000000..269c085 --- /dev/null +++ b/src/Routes/Settings.h @@ -0,0 +1,8 @@ +#ifndef SETTINGS_H +#define SETTINGS_H + +#include + +int settings_handler(UrlParams *params); + +#endif diff --git a/src/Routes/SettingsSave.c b/src/Routes/SettingsSave.c new file mode 100644 index 0000000..d286507 --- /dev/null +++ b/src/Routes/SettingsSave.c @@ -0,0 +1,28 @@ +#include "SettingsSave.h" +#include +#include + +int settings_save_handler(UrlParams *params) { + const char *theme = ""; + const char *query = ""; + + if (params) { + for (int i = 0; i < params->count; i++) { + if (strcmp(params->params[i].key, "theme") == 0) { + theme = params->params[i].value; + } else if (strcmp(params->params[i].key, "q") == 0) { + query = params->params[i].value; + } + } + } + + if (strlen(theme) > 0) { + set_cookie("theme", theme, "Fri, 31 Dec 2038 23:59:59 GMT", "/", false, false); + } + + char redirect_url[512]; + snprintf(redirect_url, sizeof(redirect_url), "/settings?q=%s", query); + send_redirect(redirect_url); + + return 0; +} diff --git a/src/Routes/SettingsSave.h b/src/Routes/SettingsSave.h new file mode 100644 index 0000000..e10cc2f --- /dev/null +++ b/src/Routes/SettingsSave.h @@ -0,0 +1,8 @@ +#ifndef SETTINGS_SAVE_H +#define SETTINGS_SAVE_H + +#include + +int settings_save_handler(UrlParams *params); + +#endif diff --git a/src/Utility/Utility.c b/src/Utility/Utility.c index 3be4ef4..b4ad91d 100644 --- a/src/Utility/Utility.c +++ b/src/Utility/Utility.c @@ -1,4 +1,7 @@ #include "Utility.h" +#include +#include +#include int hex_to_int(char c) { if (c >= '0' && c <= '9') @@ -9,3 +12,14 @@ int hex_to_int(char c) { return c - 'A' + 10; return -1; } + +char *get_theme(const char *default_theme) { + char *cookie = get_cookie("theme"); + if (cookie && + (strcmp(cookie, "light") == 0 || + strcmp(cookie, "dark") == 0)) { + return cookie; + } + free(cookie); + return strdup(default_theme); +} diff --git a/src/Utility/Utility.h b/src/Utility/Utility.h index 3b0181c..e67282f 100644 --- a/src/Utility/Utility.h +++ b/src/Utility/Utility.h @@ -2,5 +2,6 @@ #define UTILITY_H int hex_to_int(char c); +char *get_theme(const char *default_theme); #endif -- cgit v1.2.3