1
mirror of https://github.com/mpv-player/mpv synced 2024-11-07 01:47:00 +01:00

command: make reverse cycle_values match up with forward one

The behavior of reverse cycling (with the "!reverse" magic value) was a
bit weird and acted with a "delay". This was because the command set the
value the _next_ command should use. Change this and make each command
invocation select and use the next command directly. This requires an
"uninitialized" special index in the counter, but that is no problem at
all.
This commit is contained in:
wm4 2014-10-21 23:55:32 +02:00
parent 4d5903f915
commit 7eb047b241
2 changed files with 4 additions and 5 deletions

View File

@ -419,7 +419,7 @@ Input Commands that are Possibly Subject to Change
The special argument ``!reverse`` can be used to cycle the value list in
reverse. Compared with a command that just lists the value in reverse, this
command will actually share the internal counter with the forward-cycling
key binding.
key binding (as long as the rest of the arguments are the same).
Note that there is a static limit of (as of this writing) 10 arguments
(this limit could be raised on demand).

View File

@ -3650,7 +3650,7 @@ static int *get_cmd_cycle_counter(struct MPContext *mpctx, char **args)
if (stringlist_equals(ctr->args, args))
return &ctr->counter;
}
struct cycle_counter ctr = {stringlist_dup(cmd, args), 0};
struct cycle_counter ctr = {stringlist_dup(cmd, args), -1};
MP_TARRAY_APPEND(cmd, cmd->cycle_counters, cmd->num_cycle_counters, ctr);
return &cmd->cycle_counters[cmd->num_cycle_counters - 1].counter;
}
@ -3840,14 +3840,13 @@ int run_command(MPContext *mpctx, mp_cmd_t *cmd)
int *ptr = get_cmd_cycle_counter(mpctx, &args[first - 1]);
int count = cmd->nargs - first;
if (ptr && count > 0) {
int next = *ptr;
*ptr += dir;
*ptr = *ptr < 0 ? (dir > 0 ? 0 : -1) : *ptr + dir;
if (*ptr >= count)
*ptr = 0;
if (*ptr < 0)
*ptr = count - 1;
char *property = args[first - 1];
char *value = args[first + next];
char *value = args[first + *ptr];
int r = mp_property_do(property, M_PROPERTY_SET_STRING, value, mpctx);
if (r == M_PROPERTY_OK || r == M_PROPERTY_UNAVAILABLE) {
show_property_osd(mpctx, property, on_osd);