From d7848e38bc2d916f88e889352f337a5c617fb26d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Wennerstr=C3=B6m?= Date: Tue, 8 Dec 2020 20:01:17 +0100 Subject: [PATCH] Remove scheme and filetype matching for url (save|open) --- src/command/cmd_defs.c | 35 ++++++++----- src/command/cmd_funcs.c | 108 +++++++++++++++++++++------------------ src/command/cmd_funcs.h | 4 +- src/config/preferences.c | 4 +- src/ui/console.c | 9 ++-- 5 files changed, 91 insertions(+), 69 deletions(-) diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c index d291856c..4a78ba70 100644 --- a/src/command/cmd_defs.c +++ b/src/command/cmd_defs.c @@ -2374,7 +2374,7 @@ static struct cmd_t command_defs[] = { "Settings for consistent color generation for nicks (XEP-0392). Including corrections for Color Vision Deficiencies. " "Your terminal needs to support 256 colors.") CMD_ARGS( - { "on|off|redgreen|blue", "Enable or disable nick colorization for MUC nicks. 'redgreen' is for people with red/green blindess and 'blue' for people with blue blindness." }, + { "on|off|redgreen|blue", "Enable or disable nick colorization for MUC nicks. 'redgreen' is for people with red/green blindness and 'blue' for people with blue blindness." }, { "own on|off", "Enable color generation for own nick. If disabled the color from the color from the theme ('me') will get used." }) CMD_EXAMPLES( "/color off", @@ -2493,26 +2493,35 @@ static struct cmd_t command_defs[] = { { "/executable", parse_args, 2, 4, &cons_executable_setting, - CMD_NOSUBFUNCS - CMD_MAINFUNC(cmd_executable) + CMD_SUBFUNCS( + { "avatar", cmd_executable_avatar }, + { "urlopen", cmd_executable_urlopen }, + { "urlsave", cmd_executable_urlsave }) + CMD_NOMAINFUNC CMD_TAGS( CMD_TAG_DISCOVERY) CMD_SYN( "/executable avatar ", - "/executable urlopen (|DEF ", - "/executable urlsave (|DEF) ") + "/executable urlopen set ", + "/executable urlopen default", + "/executable urlsave set ", + "/executable urlsave default") CMD_DESC( - "Configure executable that should be called upon a certain command." - "Default is xdg-open.") + "Configure executable that should be called upon a certain command.") CMD_ARGS( - { "avatar", "Set executable that is run in /avatar open. Use your favourite image viewer." }, - { "urlopen", "Set executable that is run in /url open for a given file type. It may be your favorite browser or a specific viewer. Use DEF to set default command for undefined file type." }, - { "urlsave", "Set executable that is run in /url save for a given protocol. Use your favourite downloader. Use DEF to set default command for undefined protocol." }) + { "avatar", "Set executable that is run by /avatar open. Use your favorite image viewer." }, + { "urlopen set", "Set executable that is run by /url open. It may be your favorite browser or a specific viewer." }, + { "urlopen default", "Restore to default settings." }, + { "urlsave set", "Set executable that is run by /url save. It may be your favorite downloader.'" }, + { "urlsave default", "Use the built-in download method for saving." }) CMD_EXAMPLES( "/executable avatar xdg-open", - "/executable urlopen DEF false \"xdg-open %u\"", - "/executable urlopen html false \"firefox %u\"", - "/executable urlsave aesgcm \"omut -d -o %p %u\"") + "/executable urlopen set \"xdg-open %u\"", + "/executable urlopen set \"firefox %u\"", + "/executable urlopen default", + "/executable urlsave set \"wget %u -O %p\"", + "/executable urlsave set \"curl %u -o %p\"", + "/executable urlsave default") }, { "/url", diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index d2ec46ee..fd9d2ffd 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -9135,9 +9135,9 @@ cmd_url_open(ProfWin* window, const char* const command, gchar** args) goto out; } - cmd_template = prefs_get_string_with_option(PREF_URL_OPEN_CMD, scheme); + cmd_template = prefs_get_string(PREF_URL_OPEN_CMD); if (cmd_template == NULL) { - cons_show("No default open command found in url open preferences"); + cons_show("No default `url open` command found in executables preferences."); goto out; } @@ -9195,20 +9195,17 @@ cmd_url_save(ProfWin* window, const char* const command, gchar** args) goto out; } - cmd_template = prefs_get_string_with_option(PREF_URL_SAVE_CMD, scheme); - if (cmd_template == NULL) { - if (g_strcmp0(scheme, "http") == 0 - || g_strcmp0(scheme, "https") == 0) { - _url_http_method(window, cmd_template, url, filename); + cmd_template = prefs_get_string(PREF_URL_SAVE_CMD); + if (cmd_template == NULL && (g_strcmp0(scheme, "http") == 0 || g_strcmp0(scheme, "https") == 0)) { + _url_http_method(window, cmd_template, url, filename); #ifdef HAVE_OMEMO - } else if (g_strcmp0(scheme, "aesgcm") == 0) { - _url_aesgcm_method(window, cmd_template, url, filename); + } else if (g_strcmp0(scheme, "aesgcm") == 0) { + _url_aesgcm_method(window, cmd_template, url, filename); #endif - } else { - cons_show_error("No download method defined for the scheme '%s'.", scheme); - } - } else { + } else if (cmd_template != NULL) { _url_external_method(cmd_template, url, filename); + } else { + cons_show_error("No download method defined for the scheme '%s'.", scheme); } out: @@ -9223,48 +9220,59 @@ out: } gboolean -cmd_executable(ProfWin* window, const char* const command, gchar** args) +cmd_executable_avatar(ProfWin* window, const char* const command, gchar** args) +{ + prefs_set_string(PREF_AVATAR_CMD, args[1]); + cons_show("`avatar` command set to invoke '%s'", args[1]); + return TRUE; +} + +gboolean +cmd_executable_urlopen(ProfWin* window, const char* const command, gchar** args) { guint num_args = g_strv_length(args); + if (num_args < 2) { + cons_bad_cmd_usage(command); + return TRUE; + } - if (g_strcmp0(args[0], "avatar") == 0) { - prefs_set_string(PREF_AVATAR_CMD, args[1]); - cons_show("Avatar command set to: %s", args[1]); - - } else if (g_strcmp0(args[0], "urlopen") == 0) { - if (num_args < 4) { - cons_bad_cmd_usage(command); - return TRUE; - } - - gchar* str = g_strjoinv(" ", &args[3]); - const gchar* const list[] = { args[2], str, NULL }; - prefs_set_string_list_with_option(PREF_URL_OPEN_CMD, args[1], list); - cons_show("`url open` command set to: %s for %s files", str, args[1]); + if (g_strcmp0(args[1], "set") == 0 && num_args >= 3) { + gchar* str = g_strjoinv(" ", &args[2]); + prefs_set_string(PREF_URL_OPEN_CMD, str); + cons_show("`url open` command set to invoke '%s'", str); g_free(str); - } else if (g_strcmp0(args[0], "urlsave") == 0) { - - if (num_args < 3) { - cons_bad_cmd_usage(command); - return TRUE; - } - - if (g_strcmp0(args[1], "set") == 0 && num_args >= 4) { - gchar* str = g_strjoinv(" ", &args[3]); - prefs_set_string_with_option(PREF_URL_SAVE_CMD, args[2], str); - cons_show("`url save` command set to: %s for scheme %s", str, args[2]); - g_free(str); - - } else if (g_strcmp0(args[1], "clear") == 0) { - prefs_set_string_with_option(PREF_URL_SAVE_CMD, args[2], NULL); - cons_show("`url save` will use internal download method for scheme %s", args[2]); - - } else { - cons_bad_cmd_usage(command); - return TRUE; - } - + } else if (g_strcmp0(args[1], "default") == 0) { + prefs_set_string(PREF_URL_SAVE_CMD, NULL); + gchar* def = prefs_get_string(PREF_URL_SAVE_CMD); + cons_show("`url open` command set to invoke %s (default)", def); + g_free(def); + } else { + cons_bad_cmd_usage(command); + } + + return TRUE; +} + +gboolean +cmd_executable_urlsave(ProfWin* window, const char* const command, gchar** args) +{ + + guint num_args = g_strv_length(args); + if (num_args < 2) { + cons_bad_cmd_usage(command); + return TRUE; + } + + if (g_strcmp0(args[1], "set") == 0 && num_args >= 3) { + gchar* str = g_strjoinv(" ", &args[2]); + prefs_set_string(PREF_URL_SAVE_CMD, str); + cons_show("`url save` command set to invoke '%s'", str); + g_free(str); + + } else if (g_strcmp0(args[1], "default") == 0) { + prefs_set_string(PREF_URL_SAVE_CMD, NULL); + cons_show("`url save` will use built-in download method (default)"); } else { cons_bad_cmd_usage(command); } diff --git a/src/command/cmd_funcs.h b/src/command/cmd_funcs.h index 03c92522..4955972c 100644 --- a/src/command/cmd_funcs.h +++ b/src/command/cmd_funcs.h @@ -237,6 +237,8 @@ gboolean cmd_slashguard(ProfWin* window, const char* const command, gchar** args gboolean cmd_serversoftware(ProfWin* window, const char* const command, gchar** args); gboolean cmd_url_open(ProfWin* window, const char* const command, gchar** args); gboolean cmd_url_save(ProfWin* window, const char* const command, gchar** args); -gboolean cmd_executable(ProfWin* window, const char* const command, gchar** args); +gboolean cmd_executable_avatar(ProfWin* window, const char* const command, gchar** args); +gboolean cmd_executable_urlopen(ProfWin* window, const char* const command, gchar** args); +gboolean cmd_executable_urlsave(ProfWin* window, const char* const command, gchar** args); #endif diff --git a/src/config/preferences.c b/src/config/preferences.c index 7a9b842b..9d7d4f7b 100644 --- a/src/config/preferences.c +++ b/src/config/preferences.c @@ -170,7 +170,7 @@ _prefs_load(void) value = g_string_append(value, val); value = g_string_append(value, " %u;"); - g_key_file_set_locale_string(prefs, PREF_GROUP_EXECUTABLES, "url.open.cmd", "DEF", value->str); + g_key_file_set_locale_string(prefs, PREF_GROUP_EXECUTABLES, "url.open.cmd", "*", value->str); g_key_file_remove_key(prefs, PREF_GROUP_LOGGING, "urlopen.cmd", NULL); g_string_free(value, TRUE); @@ -529,7 +529,7 @@ prefs_get_string_with_option(preference_t pref, gchar* option) if (result == NULL) { // check for user set default - result = g_key_file_get_locale_string(prefs, group, key, "DEF", NULL); + result = g_key_file_get_locale_string(prefs, group, key, "*", NULL); if (result == NULL) { if (def) { // use hardcoded profanity default diff --git a/src/ui/console.c b/src/ui/console.c index 623556f7..306b13d5 100644 --- a/src/ui/console.c +++ b/src/ui/console.c @@ -2068,17 +2068,20 @@ cons_correction_setting(void) void cons_executable_setting(void) { - char* avatar = prefs_get_string(PREF_AVATAR_CMD); + gchar* avatar = prefs_get_string(PREF_AVATAR_CMD); cons_show("Default '/avatar open' command (/executable avatar) : %s", avatar); g_free(avatar); //TODO: there needs to be a way to get all the "locales"/schemes so we can //display the default openers for all filetypes - char* urlopen = prefs_get_string_with_option(PREF_URL_OPEN_CMD, ""); + gchar* urlopen = prefs_get_string(PREF_URL_OPEN_CMD); cons_show("Default '/url open' command (/executable urlopen) : %s", urlopen); g_free(urlopen); - char* urlsave = prefs_get_string(PREF_URL_SAVE_CMD); + gchar* urlsave = prefs_get_string(PREF_URL_SAVE_CMD); + if (urlsave == NULL) { + urlsave = g_strdup("(built-in)"); + } cons_show("Default '/url save' command (/executable urlsave) : %s", urlsave); g_free(urlsave); }