diff options
| -rw-r--r-- | locales/en_gb.ini | 4 | ||||
| -rw-r--r-- | locales/en_us.ini | 4 | ||||
| -rw-r--r-- | src/Routes/Search.c | 22 | ||||
| -rw-r--r-- | src/Routes/Settings.c | 16 | ||||
| -rw-r--r-- | src/Routes/SettingsSave.c | 30 | ||||
| -rw-r--r-- | src/Utility/Utility.c | 9 | ||||
| -rw-r--r-- | src/Utility/Utility.h | 1 | ||||
| -rw-r--r-- | templates/settings.html | 17 |
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> |
