aboutsummaryrefslogtreecommitdiff
path: root/src/Routes
diff options
context:
space:
mode:
authorfrosty <gabriel@bwaaa.monster>2026-08-12 20:21:12 -0400
committerfrosty <gabriel@bwaaa.monster>2026-08-12 20:21:12 -0400
commita20a9e8878ab6708bd3e3ecb4b1cee8728436dd0 (patch)
treec007b81d99b2dc3be92ae625e34881b0f7cf6943 /src/Routes
parent10d44e7ff547a806e4bf109e7aadd48488ddc9f0 (diff)
downloadomnisearch-a20a9e8878ab6708bd3e3ecb4b1cee8728436dd0.tar.gz
feat: add default search engine option
Diffstat (limited to 'src/Routes')
-rw-r--r--src/Routes/Search.c22
-rw-r--r--src/Routes/Settings.c16
-rw-r--r--src/Routes/SettingsSave.c30
3 files changed, 62 insertions, 6 deletions
diff --git a/src/Routes/Search.c b/src/Routes/Search.c
index a245f6b..e7703be 100644
--- a/src/Routes/Search.c
+++ b/src/Routes/Search.c
@@ -417,7 +417,11 @@ int results_handler(UrlParams *params) {
extern Config global_config;
TemplateContext ctx = new_context();
char *raw_query = "";
- const char *selected_engine_id = "all";
+ char selected_engine_id[32];
+ char *default_engine = get_default_search_engine();
+ snprintf(selected_engine_id, sizeof(selected_engine_id), "%s",
+ default_engine);
+ free(default_engine);
int page = 1;
int btnI = 0;
@@ -435,7 +439,8 @@ int results_handler(UrlParams *params) {
if (parsed > 1)
page = parsed;
} else if (strcmp(params->params[i].key, "engine") == 0) {
- selected_engine_id = params->params[i].value;
+ snprintf(selected_engine_id, sizeof(selected_engine_id), "%s",
+ params->params[i].value);
} else if (strcmp(params->params[i].key, "btnI") == 0) {
btnI = atoi(params->params[i].value);
}
@@ -481,8 +486,17 @@ int results_handler(UrlParams *params) {
}
const SearchEngine *selected_engine = find_enabled_engine(selected_engine_id);
- if (!selected_engine)
- selected_engine_id = "all";
+ if (selected_engine &&
+ !engine_allowed_for_user(selected_engine, user_engines,
+ user_engine_count, has_user_pref)) {
+ selected_engine = NULL;
+ }
+ if (selected_engine) {
+ snprintf(selected_engine_id, sizeof(selected_engine_id), "%s",
+ selected_engine->id);
+ } else {
+ snprintf(selected_engine_id, sizeof(selected_engine_id), "all");
+ }
context_set(&ctx, "selected_engine", selected_engine_id);
char *search_href = build_search_href(raw_query, selected_engine_id, 1);
diff --git a/src/Routes/Settings.c b/src/Routes/Settings.c
index eb3072b..05325e8 100644
--- a/src/Routes/Settings.c
+++ b/src/Routes/Settings.c
@@ -34,6 +34,14 @@ int settings_handler(UrlParams *params) {
int user_engine_count = 0;
int has_user_pref =
(get_user_engines(&user_engines, &user_engine_count) == 0);
+ char *default_engine = get_default_search_engine();
+
+ if (strcmp(default_engine, "all") != 0 && has_user_pref &&
+ !user_engines_contains(default_engine, user_engines,
+ user_engine_count)) {
+ free(default_engine);
+ default_engine = strdup("all");
+ }
int enabled_count = 0;
for (int i = 0; i < ENGINE_COUNT; i++) {
@@ -63,11 +71,13 @@ int settings_handler(UrlParams *params) {
}
}
- engine_data[idx] = malloc(sizeof(char *) * 3);
+ engine_data[idx] = malloc(sizeof(char *) * 4);
engine_data[idx][0] = (char *)ENGINE_REGISTRY[i].id;
engine_data[idx][1] = (char *)ENGINE_REGISTRY[i].name;
engine_data[idx][2] = is_selected ? "checked" : "";
- engine_inner[idx] = 3;
+ engine_data[idx][3] =
+ strcmp(default_engine, ENGINE_REGISTRY[i].id) == 0 ? "selected" : "";
+ engine_inner[idx] = 4;
idx++;
}
@@ -78,6 +88,7 @@ int settings_handler(UrlParams *params) {
context_set(&ctx, "query", query);
context_set(&ctx, "theme", theme);
context_set(&ctx, "locale", locale);
+ context_set(&ctx, "default_engine", default_engine);
context_set_array_of_arrays(&ctx, "locales", locale_data, locale_count,
inner_counts);
@@ -132,6 +143,7 @@ int settings_handler(UrlParams *params) {
send_response(rendered_html);
free(rendered_html);
+ free(default_engine);
free(theme);
free(locale);
free_context(&ctx);
diff --git a/src/Routes/SettingsSave.c b/src/Routes/SettingsSave.c
index cacff50..3cbb1d6 100644
--- a/src/Routes/SettingsSave.c
+++ b/src/Routes/SettingsSave.c
@@ -10,6 +10,8 @@ int settings_save_handler(UrlParams *params) {
const char *theme = "";
const char *locale = "";
const char *query = "";
+ const char *default_engine = "all";
+ int default_engine_present = 0;
int engines_present = 0;
char selected_ids[ENGINE_COUNT][32];
int selected_count = 0;
@@ -22,6 +24,9 @@ int settings_save_handler(UrlParams *params) {
locale = params->params[i].value;
} else if (strcmp(params->params[i].key, "q") == 0) {
query = params->params[i].value;
+ } else if (strcmp(params->params[i].key, "default_engine") == 0) {
+ default_engine = params->params[i].value;
+ default_engine_present = 1;
} else if (strcmp(params->params[i].key, "engines_present") == 0) {
engines_present = 1;
} else if (strncmp(params->params[i].key, "engine_", 7) == 0 &&
@@ -58,6 +63,31 @@ int settings_save_handler(UrlParams *params) {
false, false);
}
+ if (default_engine_present) {
+ const char *validated_default = "all";
+
+ for (int i = 0; i < ENGINE_COUNT; i++) {
+ if (!ENGINE_REGISTRY[i].enabled ||
+ strcmp(default_engine, ENGINE_REGISTRY[i].id) != 0)
+ continue;
+
+ int selected = !engines_present;
+ for (int j = 0; j < selected_count; j++) {
+ if (strcmp(selected_ids[j], ENGINE_REGISTRY[i].id) == 0) {
+ selected = 1;
+ break;
+ }
+ }
+
+ if (selected)
+ validated_default = ENGINE_REGISTRY[i].id;
+ break;
+ }
+
+ set_cookie("default_engine", validated_default,
+ "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);