aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/en/input.rst5
-rw-r--r--input/cmd_list.c16
-rw-r--r--input/cmd_list.h3
-rw-r--r--input/input.c4
-rw-r--r--player/loadfile.c2
5 files changed, 20 insertions, 10 deletions
diff --git a/DOCS/man/en/input.rst b/DOCS/man/en/input.rst
index dc31ea081e..99e51e8ca9 100644
--- a/DOCS/man/en/input.rst
+++ b/DOCS/man/en/input.rst
@@ -52,11 +52,6 @@ You can bind multiple commands to one key. For example:
| a show_text "command 1" ; show_text "command 2"
-Note that some magic is disabled for keys: seek commands inside lists are not
-coalesced (seeking will appear slower), and no check is done for abort commands
-(so these commands can't be used to abort playback if the network cache is
-stuck).
-
List of Input Commands
----------------------
diff --git a/input/cmd_list.c b/input/cmd_list.c
index f89195ad56..c5bfbc34aa 100644
--- a/input/cmd_list.c
+++ b/input/cmd_list.c
@@ -255,7 +255,7 @@ bool mp_replace_legacy_cmd(void *t, bstr *s)
return false;
}
-bool mp_input_is_abort_cmd(int cmd_id)
+static bool is_abort_cmd(int cmd_id)
{
switch (cmd_id) {
case MP_CMD_QUIT:
@@ -266,6 +266,20 @@ bool mp_input_is_abort_cmd(int cmd_id)
return false;
}
+bool mp_input_is_abort_cmd(struct mp_cmd *cmd)
+{
+ if (is_abort_cmd(cmd->id))
+ return true;
+ if (cmd->id == MP_CMD_COMMAND_LIST) {
+ for (struct mp_cmd *sub = cmd->args[0].v.p; sub; sub = sub->queue_next)
+ {
+ if (mp_input_is_abort_cmd(cmd))
+ return true;
+ }
+ }
+ return false;
+}
+
void mp_print_cmd_list(struct mp_log *out)
{
for (int i = 0; mp_cmds[i].name; i++) {
diff --git a/input/cmd_list.h b/input/cmd_list.h
index bee981b309..e74a21921e 100644
--- a/input/cmd_list.h
+++ b/input/cmd_list.h
@@ -108,7 +108,8 @@ enum mp_command_type {
};
// Executing this command will abort playback (play something else, or quit).
-bool mp_input_is_abort_cmd(int cmd_id);
+struct mp_cmd;
+bool mp_input_is_abort_cmd(struct mp_cmd *cmd);
struct bstr;
bool mp_replace_legacy_cmd(void *talloc_ctx, struct bstr *s);
diff --git a/input/input.c b/input/input.c
index 96699b5ba0..9061f2008a 100644
--- a/input/input.c
+++ b/input/input.c
@@ -238,7 +238,7 @@ static bool queue_has_abort_cmds(struct cmd_queue *queue)
{
bool ret = false;
for (struct mp_cmd *cmd = queue->first; cmd; cmd = cmd->queue_next)
- if (mp_input_is_abort_cmd(cmd->id)) {
+ if (mp_input_is_abort_cmd(cmd)) {
ret = true;
break;
}
@@ -584,7 +584,7 @@ static bool should_drop_cmd(struct input_ctx *ictx, struct mp_cmd *cmd)
{
struct cmd_queue *queue = &ictx->cmd_queue;
return (queue_count_cmds(queue) >= ictx->key_fifo_size &&
- (!mp_input_is_abort_cmd(cmd->id) || queue_has_abort_cmds(queue)));
+ (!mp_input_is_abort_cmd(cmd) || queue_has_abort_cmds(queue)));
}
static void interpret_key(struct input_ctx *ictx, int code, double scale)
diff --git a/player/loadfile.c b/player/loadfile.c
index f062bce27c..b5b42fe67c 100644
--- a/player/loadfile.c
+++ b/player/loadfile.c
@@ -1024,7 +1024,7 @@ static bool demux_was_interrupted(struct MPContext *mpctx)
mp_cmd_t *cmd = mp_input_get_cmd(mpctx->input, 0, 0);
if (!cmd)
break;
- if (mp_input_is_abort_cmd(cmd->id))
+ if (mp_input_is_abort_cmd(cmd))
run_command(mpctx, cmd);
mp_cmd_free(cmd);
}