summaryrefslogtreecommitdiffstats
path: root/input
diff options
context:
space:
mode:
authorJames Ross-Gowan <rossymiles@gmail.com>2017-04-25 18:03:06 +1000
committerJames Ross-Gowan <rossymiles@gmail.com>2017-05-12 22:58:58 +1000
commit89fd3e1d9d25731c6cae8af1b9c5b0bae726c436 (patch)
tree84bd2fbe5b7af1c7245f4387464fd947474b149c /input
parent937128697fbbef6b21e2d23a4785f1334f62b9e3 (diff)
downloadmpv-89fd3e1d9d25731c6cae8af1b9c5b0bae726c436.tar.bz2
mpv-89fd3e1d9d25731c6cae8af1b9c5b0bae726c436.tar.xz
command: use scale_units to add/cycle integer properties
This adds check_property_scalable, which returns true if the property is backed by a floating-point number. When the add or cycle commands operate on these properties, they can benefit from the fractional scale value in cmd->scale. When the property is not backed by a floating-point number, cmd->scale_units is used instead, so for axis events, the property is only incrmented when the user scrolls one full unit. This solution isn't perfect, because in some cases integer-backed properties could benefit from accurate scrolling. For example, if an axis is bound to "cycle audio 5", the cycle command could be made to change the audio track by one when the user scrolls 1/5th of a unit, though this behaviour would require more changes to the options system.
Diffstat (limited to 'input')
-rw-r--r--input/cmd_parse.c3
-rw-r--r--input/input.c2
-rw-r--r--input/input.h1
3 files changed, 5 insertions, 1 deletions
diff --git a/input/cmd_parse.c b/input/cmd_parse.c
index b0c6c50753..0af9665cf0 100644
--- a/input/cmd_parse.c
+++ b/input/cmd_parse.c
@@ -140,7 +140,7 @@ struct mp_cmd *mp_input_parse_cmd_node(struct mp_log *log, mpv_node *node)
{
struct mp_cmd *cmd = talloc_ptrtype(NULL, cmd);
talloc_set_destructor(cmd, destroy_cmd);
- *cmd = (struct mp_cmd) { .scale = 1, };
+ *cmd = (struct mp_cmd) { .scale = 1, .scale_units = 1 };
if (node->format != MPV_FORMAT_NODE_ARRAY)
goto error;
@@ -254,6 +254,7 @@ static struct mp_cmd *parse_cmd_str(struct mp_log *log, void *tmp,
*cmd = (struct mp_cmd) {
.flags = MP_ON_OSD_AUTO | MP_EXPAND_PROPERTIES,
.scale = 1,
+ .scale_units = 1,
};
ctx->str = bstr_lstrip(ctx->str);
diff --git a/input/input.c b/input/input.c
index 04b61cf3b4..c859e5e3db 100644
--- a/input/input.c
+++ b/input/input.c
@@ -618,11 +618,13 @@ static void interpret_key(struct input_ctx *ictx, int code, double scale,
if (mp_input_is_scalable_cmd(cmd)) {
cmd->scale = scale;
+ cmd->scale_units = scale_units;
mp_input_queue_cmd(ictx, cmd);
} else {
// Non-scalable commands won't understand cmd->scale, so synthesize
// multiple commands with cmd->scale = 1
cmd->scale = 1;
+ cmd->scale_units = 1;
// Avoid spamming the player with too many commands
scale_units = FFMIN(scale_units, 20);
for (int i = 0; i < scale_units - 1; i++)
diff --git a/input/input.h b/input/input.h
index dfc14078f3..c2933e8bd3 100644
--- a/input/input.h
+++ b/input/input.h
@@ -85,6 +85,7 @@ typedef struct mp_cmd {
int mouse_x, mouse_y;
struct mp_cmd *queue_next;
double scale; // for scaling numeric arguments
+ int scale_units;
const struct mp_cmd_def *def;
char *sender; // name of the client API user which sent this
char *key_name; // string representation of the key binding