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.
This commit is contained in:
wm4 2013-05-18 12:56:22 +02:00
parent 3e6ec6dfa5
commit 58cc0f637f
5 changed files with 33 additions and 21 deletions

View File

@ -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?)

View File

@ -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

View File

@ -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];

View File

@ -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;

View File

@ -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);
}];