From f4067d64f3eecab1891cbd2d664e6f495e654372 Mon Sep 17 00:00:00 2001 From: yellows8 Date: Mon, 6 Apr 2020 10:34:44 -0400 Subject: [PATCH] Added app_args config setting for fileassoc. --- common/menu-entry.c | 48 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/common/menu-entry.c b/common/menu-entry.c index b28e134..e655cd0 100644 --- a/common/menu-entry.c +++ b/common/menu-entry.c @@ -210,7 +210,7 @@ bool menuEntryLoad(menuEntry_s* me, const char* name, bool shortcut, bool check_ menu_s *menu_fileassoc = menuFileassocGetCurrent(); menuEntry_s* fileassoc_me = NULL; char *strptr = NULL; - char tempbuf[PATH_MAX+1]; + char tempbuf[PATH_MAX+16]; //bool isOldAppFolder = false; if (check_exists && !fsobjExists(me->path)) return false; @@ -504,9 +504,28 @@ bool menuEntryLoad(menuEntry_s* me, const char* name, bool shortcut, bool check_ // Initialize the argument data argData_s* ad = &me->args; + argData_s* ad_assoc = &fileassoc_me->args; + char *arg_src = (char*)&ad_assoc->buf[1]; + bool ftoken_found=0; ad->dst = (char*)&ad->buf[1]; - launchAddArg(ad, fileassoc_me->path); - launchAddArg(ad, me->path); + + for (u32 argi=0; argibuf[0]; argi++, arg_src+= strlen(arg_src)+1) { + if (argi) { + strptr = strchr(arg_src, '%'); + if (strptr && strptr[0] && strptr[1] && (strptr == arg_src || strptr[-1] != '\\')) { + if (strptr[1] == 'f') { + memset(tempbuf, 0, sizeof(tempbuf)); + snprintf(tempbuf, sizeof(tempbuf)-1, "%.*s%s%s", (int)((uintptr_t)strptr-(uintptr_t)arg_src), arg_src, me->path, &strptr[2]); + launchAddArg(ad, tempbuf); + ftoken_found = 1; + continue; + } + } + } + + launchAddArg(ad, arg_src); + } + if (!ftoken_found) launchAddArg(ad, me->path); strncpy(me->path, fileassoc_me->path, sizeof(me->path)); me->path[sizeof(me->path)-1] = 0; @@ -530,9 +549,9 @@ void menuEntryFileassocLoad(const char* filepath) { bool success=0, iconLoaded=0; menuEntry_s* me = NULL; - config_setting_t *fileassoc = NULL, *targets = NULL, *target = NULL; + config_setting_t *fileassoc = NULL, *targets = NULL, *target = NULL, *app_args = NULL, *target_args = NULL; config_t cfg = {0}; - int targets_len=0, i; + int targets_len=0, args_len=0, i; const char *strptr = NULL; char app_path[PATH_MAX+8]; @@ -564,7 +583,8 @@ void menuEntryFileassocLoad(const char* filepath) { snprintf(app_path, sizeof(app_path)-1, "%s%s", menuGetRootBasePath(), strptr); if (config_setting_lookup_string(fileassoc, "icon_path", &strptr)) snprintf(main_icon_path, sizeof(main_icon_path)-1, "%s%s", menuGetRootBasePath(), strptr); - targets = config_setting_get_member(fileassoc, "targets"); + app_args = config_setting_lookup(fileassoc, "app_args"); + targets = config_setting_lookup(fileassoc, "targets"); if (app_path[0] && targets) { targets_len = config_setting_length(targets); @@ -610,6 +630,7 @@ void menuEntryFileassocLoad(const char* filepath) { strncpy(target_file_extension, strptr, sizeof(target_file_extension)-1); if (config_setting_lookup_string(target, "filename", &strptr)) strncpy(target_filename, strptr, sizeof(target_filename)-1); + target_args = config_setting_lookup(target, "app_args"); //string_is_set for target_file_extension and target_filename must differ: only 1 can be set, not both set or both not set. if ((target_file_extension[0]!=0) == (target_filename[0]!=0)) continue; @@ -642,6 +663,21 @@ void menuEntryFileassocLoad(const char* filepath) { } else { iconLoaded = menuEntryImportIconGfx(me, app_icon_gfx, app_icon_gfx_small); } + + argData_s* ad = &me->args; + ad->dst = (char*)&ad->buf[1]; + launchAddArg(ad, me->path); + + config_setting_t *config_args = target_args ? target_args : app_args; + if (config_args) { + args_len = config_setting_length(config_args); + for (int argi=0; argi