From 89f20cd2f35ad25271ac91606ec459467d61a0ed Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 20 Feb 2014 13:38:39 +0100 Subject: input: check for abort cmd in multi-commands MP_CMD_COMMAND_LIST commands (used to implement key bindings with multiple commands) were not checked for abort commands. Implement it. Remove the remarks about multi-commands being special from the manpage. Seek coalescing is handled differently now, and the issue with abort commands is fixed with this commit. --- DOCS/man/en/input.rst | 5 ----- input/cmd_list.c | 16 +++++++++++++++- input/cmd_list.h | 3 ++- input/input.c | 4 ++-- player/loadfile.c | 2 +- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/DOCS/man/en/input.rst b/DOCS/man/en/input.rst index a5de6df18d..7caa4e4896 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 05dcb72d25..bb7d2413f8 100644 --- a/input/cmd_list.c +++ b/input/cmd_list.c @@ -253,7 +253,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: @@ -264,6 +264,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 211df2b0b0..870294cfaf 100644 --- a/input/cmd_list.h +++ b/input/cmd_list.h @@ -107,7 +107,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 def7b77710..56c21b4fe1 100644 --- a/input/input.c +++ b/input/input.c @@ -237,7 +237,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; } @@ -580,7 +580,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 adf708858c..d6b2467430 100644 --- a/player/loadfile.c +++ b/player/loadfile.c @@ -1014,7 +1014,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); } -- cgit v1.2.3