summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-05-18 12:56:22 +0200
committerwm4 <wm4@nowhere>2013-05-18 17:45:55 +0200
commit58cc0f637f13d2eeeeb3c24aed4b72fc02a4cbc7 (patch)
treebd7d8844a73d647902b72b5a1c2fd5a998e9617d /core
parent3e6ec6dfa551740c4d52ede83a0cacba3ab59532 (diff)
downloadmpv-58cc0f637f13d2eeeeb3c24aed4b72fc02a4cbc7.tar.bz2
mpv-58cc0f637f13d2eeeeb3c24aed4b72fc02a4cbc7.tar.xz
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.
Diffstat (limited to 'core')
-rw-r--r--core/command.c37
-rw-r--r--core/input/input.c6
-rw-r--r--core/input/input.h1
3 files changed, 26 insertions, 18 deletions
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 <arg> 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 <arg> 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;