aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--locales/en_gb.ini4
-rw-r--r--locales/en_us.ini4
-rw-r--r--src/Routes/Search.c22
-rw-r--r--src/Routes/Settings.c16
-rw-r--r--src/Routes/SettingsSave.c30
-rw-r--r--src/Utility/Utility.c9
-rw-r--r--src/Utility/Utility.h1
-rw-r--r--templates/settings.html17
8 files changed, 96 insertions, 7 deletions
diff --git a/locales/en_gb.ini b/locales/en_gb.ini
index db919a3..cdb5f57 100644
--- a/locales/en_gb.ini
+++ b/locales/en_gb.ini
@@ -21,6 +21,10 @@ display_language_label = "Display Language"
language_desc = "Choose your preferred language."
engines_label = "Search Engines"
engines_desc = "Choose which search engines to use. Only engines enabled on the server are shown."
+other_label = "Other Settings"
+other_desc = "Choose additional settings."
+default_engine_label = "Default Search Engine"
+all_engines_option = "All enabled engines"
save_settings_button = "Save Settings"
no_results = "No results found"
error_images = "Error fetching images"
diff --git a/locales/en_us.ini b/locales/en_us.ini
index 422f220..e83aa80 100644
--- a/locales/en_us.ini
+++ b/locales/en_us.ini
@@ -21,6 +21,10 @@ display_language_label = "Display Language"
language_desc = "Choose your preferred language."
engines_label = "Search Engines"
engines_desc = "Choose which search engines to use. Only engines enabled on the server are shown."
+other_label = "Other Settings"
+other_desc = "Choose additional settings."
+default_engine_label = "Default Search Engine"
+all_engines_option = "All enabled engines"
save_settings_button = "Save Settings"
no_results = "No results found"
error_images = "Error fetching images"
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);
diff --git a/src/Utility/Utility.c b/src/Utility/Utility.c
index 5183efe..35fc491 100644
--- a/src/Utility/Utility.c
+++ b/src/Utility/Utility.c
@@ -217,6 +217,15 @@ int user_engines_contains(const char *engine_id, char **ids, int count) {
return 0;
}
+char *get_default_search_engine(void) {
+ char *cookie = get_cookie("default_engine");
+ if (cookie && (strcmp(cookie, "all") == 0 || is_engine_id_enabled(cookie)))
+ return cookie;
+
+ free(cookie);
+ return strdup("all");
+}
+
void free_string_matrix(char ***matrix, int *inner_counts, int row_count) {
if (matrix) {
for (int i = 0; i < row_count; i++) {
diff --git a/src/Utility/Utility.h b/src/Utility/Utility.h
index a78fe65..a194f21 100644
--- a/src/Utility/Utility.h
+++ b/src/Utility/Utility.h
@@ -30,6 +30,7 @@ char *get_locale(const char *default_locale);
int is_engine_id_enabled(const char *engine_id);
int get_user_engines(char ***out_ids, int *out_count);
int user_engines_contains(const char *engine_id, char **ids, int count);
+char *get_default_search_engine(void);
void free_string_matrix(char ***matrix, int *inner_counts, int row_count);
diff --git a/templates/settings.html b/templates/settings.html
index 2f4ecb6..ecc2936 100644
--- a/templates/settings.html
+++ b/templates/settings.html
@@ -87,6 +87,21 @@
</div>
{{endfor}}
</section>
+ <section class="settings-section">
+ <h3 class="settings-section-title">{{l("other_label")}}</h3>
+ <p class="settings-section-desc">{{l("other_desc")}}</p>
+ <div class="settings-field">
+ <label class="settings-label" for="default_engine">{{l("default_engine_label")}}</label>
+ <select id="default_engine" name="default_engine" class="settings-select">
+ <option value="all" {{if default_engine == "all"}}selected{{endif}}>{{l("all_engines_option")}}</option>
+ {{for eng in enabled_engines}}
+ {{if eng[2] != ""}}
+ <option value="{{eng[0]}}" {{eng[3]}}>{{eng[1]}}</option>
+ {{endif}}
+ {{endfor}}
+ </select>
+ </div>
+ </section>
{{endif}}
<div class="settings-actions">
<button type="submit" class="btn-primary">{{l("save_settings_button")}}</button>
@@ -96,4 +111,4 @@
</div>
</body>
-</html> \ No newline at end of file
+</html>