mirror of https://github.com/mpv-player/mpv
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:
parent
4d5903f915
commit
7eb047b241
|
@ -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).
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue