From 58cc0f637f13d2eeeeb3c24aed4b72fc02a4cbc7 Mon Sep 17 00:00:00 2001 From: wm4 Date: Sat, 18 May 2013 12:56:22 +0200 Subject: input: do property expansion for all input command string arguments Also add a "raw" prefix for commands, which prevents property expansion. The idea is that if the commands are generated by a program, it doesn't have to know whether the command expands properties or not. --- DOCS/man/en/input.rst | 8 ++++++-- core/command.c | 37 +++++++++++++++++++------------------ core/input/input.c | 6 ++++++ core/input/input.h | 1 + osdep/macosx_application.m | 2 +- 5 files changed, 33 insertions(+), 21 deletions(-) diff --git a/DOCS/man/en/input.rst b/DOCS/man/en/input.rst index 4acba49169..671e05bf05 100644 --- a/DOCS/man/en/input.rst +++ b/DOCS/man/en/input.rst @@ -289,10 +289,14 @@ osd-msg value as text. osd-msg-bar Combine osd-bar and osd-msg. +raw + Don't expand properties in string arguments. (Like ``"${property-name}"``.) +expand-properties (default) + All string arguments are expanded like in ``--playing-msg``. - -All of these are still overridden by the global ``--osd-level`` settings. +All of the osd prefixes are still overridden by the global ``--osd-level`` +settings. Undocumented prefixes: pausing, pausing_keep, pausing_toggle, pausing_keep_force. (Should these be made official?) diff --git a/core/command.c b/core/command.c index 9e16804e8a..7ef9982fc9 100644 --- a/core/command.c +++ b/core/command.c @@ -1821,6 +1821,19 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd) bool msg_osd = auto_osd || (cmd->on_osd & MP_ON_OSD_MSG); bool bar_osd = auto_osd || (cmd->on_osd & MP_ON_OSD_BAR); int osdl = msg_osd ? 1 : OSD_LEVEL_INVISIBLE; + + if (!cmd->raw_args) { + for (int n = 0; n < cmd->nargs; n++) { + if (cmd->args[n].type.type == CONF_TYPE_STRING) { + cmd->args[n].v.s = + mp_property_expand_string(mpctx, cmd->args[n].v.s); + if (!cmd->args[n].v.s) + return; + talloc_steal(cmd, cmd->args[n].v.s); + } + } + } + switch (cmd->id) { case MP_CMD_SEEK: { double v = cmd->args[0].v.d; @@ -1985,23 +1998,15 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd) } case MP_CMD_PRINT_TEXT: { - char *txt = mp_property_expand_string(mpctx, cmd->args[0].v.s); - if (txt) { - mp_msg(MSGT_GLOBAL, MSGL_INFO, "%s\n", txt); - talloc_free(txt); - } + mp_msg(MSGT_GLOBAL, MSGL_INFO, "%s\n", cmd->args[0].v.s); break; } case MP_CMD_SHOW_TEXT: { - char *txt = mp_property_expand_string(mpctx, cmd->args[0].v.s); - if (txt) { - // if no argument supplied use default osd_duration, else ms. - set_osd_msg(mpctx, OSD_MSG_TEXT, cmd->args[2].v.i, - (cmd->args[1].v.i < 0 ? osd_duration : cmd->args[1].v.i), - "%s", txt); - talloc_free(txt); - } + // if no argument supplied use default osd_duration, else ms. + set_osd_msg(mpctx, OSD_MSG_TEXT, cmd->args[2].v.i, + (cmd->args[1].v.i < 0 ? osd_duration : cmd->args[1].v.i), + "%s", cmd->args[0].v.s); break; } @@ -2284,11 +2289,7 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd) case MP_CMD_RUN: #ifndef __MINGW32__ if (!fork()) { - char *s = mp_property_expand_string(mpctx, cmd->args[0].v.s); - if (s) { - execl("/bin/sh", "sh", "-c", s, NULL); - talloc_free(s); - } + execl("/bin/sh", "sh", "-c", cmd->args[0].v.s, NULL); exit(0); } #endif diff --git a/core/input/input.c b/core/input/input.c index ebfd74a7ea..3861a6e8c0 100644 --- a/core/input/input.c +++ b/core/input/input.c @@ -790,6 +790,7 @@ mp_cmd_t *mp_input_parse_cmd(bstr str, const char *loc) { int pausing = 0; int on_osd = MP_ON_OSD_AUTO; + bool raw_args = false; struct mp_cmd *cmd = NULL; bstr start = str; void *tmp = talloc_new(NULL); @@ -829,6 +830,10 @@ mp_cmd_t *mp_input_parse_cmd(bstr str, const char *loc) on_osd = MP_ON_OSD_MSG | MP_ON_OSD_BAR; } else if (eat_token(&str, "osd-auto")) { // default + } else if (eat_token(&str, "raw")) { + raw_args = true; + } else if (eat_token(&str, "expand-properties")) { + // default } else { break; } @@ -851,6 +856,7 @@ mp_cmd_t *mp_input_parse_cmd(bstr str, const char *loc) *cmd = mp_cmds[cmd_idx]; cmd->pausing = pausing; cmd->on_osd = on_osd; + cmd->raw_args = raw_args; for (int i = 0; i < MP_CMD_MAX_ARGS; i++) { struct mp_cmd_arg *cmdarg = &cmd->args[i]; diff --git a/core/input/input.h b/core/input/input.h index 12823dd004..e09e080db1 100644 --- a/core/input/input.h +++ b/core/input/input.h @@ -137,6 +137,7 @@ typedef struct mp_cmd { struct mp_cmd_arg args[MP_CMD_MAX_ARGS]; int nargs; int pausing; + bool raw_args; enum mp_on_osd on_osd; bstr original; struct mp_cmd *queue_next; diff --git a/osdep/macosx_application.m b/osdep/macosx_application.m index 77c51a5180..7242403bc5 100644 --- a/osdep/macosx_application.m +++ b/osdep/macosx_application.m @@ -206,7 +206,7 @@ static pthread_t playback_thread_id; [self.files enumerateObjectsUsingBlock:^(id obj, NSUInteger i, BOOL *_){ const char *file = [escape_loadfile_name(obj) UTF8String]; const char *append = (i == 0) ? "" : " append"; - char *cmd = talloc_asprintf(ctx, "loadfile \"%s\"%s", file, append); + char *cmd = talloc_asprintf(ctx, "raw loadfile \"%s\"%s", file, append); mp_cmd_t *cmdt = mp_input_parse_cmd(bstr0(cmd), ""); mp_input_queue_cmd(self.inputContext, cmdt); }]; -- cgit v1.2.3