summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Preisinger <alexander.preisinger@gmail.com>2013-07-25 18:08:57 +0200
committerAlexander Preisinger <alexander.preisinger@gmail.com>2013-08-07 22:15:39 +0200
commit023e5ccd02609c8a2fdcf63ee0a87025beeb79f0 (patch)
tree4846330cd6d36a8d353f2c287fb061e0de3e05bb
parent406241005e3d897b30a5b168a16ad61f0996c43c (diff)
downloadmpv-023e5ccd02609c8a2fdcf63ee0a87025beeb79f0.tar.bz2
mpv-023e5ccd02609c8a2fdcf63ee0a87025beeb79f0.tar.xz
input: add support for precise scroll axes
Support horizontal and vertical axes of input devices. If the input device support precise scrolling with an input value then it should first be scaled to a standard multiplier, where 1.0 is the default. The multiplier will then applied to the following commands if possible: * MP_CMD_SEEK * MP_CMD_SPEED_MULT * MP_CMD_ADD All other commands will triggered on every axis event, without change the values specified in the config file.
-rw-r--r--etc/input.conf6
-rw-r--r--mpvcore/command.c6
-rw-r--r--mpvcore/input/input.c18
-rw-r--r--mpvcore/input/input.h5
-rw-r--r--mpvcore/input/keycodes.h7
5 files changed, 39 insertions, 3 deletions
diff --git a/etc/input.conf b/etc/input.conf
index 91382d58a5..f2f7d8bedb 100644
--- a/etc/input.conf
+++ b/etc/input.conf
@@ -35,6 +35,12 @@ MOUSE_BTN4 seek -10
MOUSE_BTN5 add volume 1
MOUSE_BTN6 add volume -1
+# Mouse wheels, touchpad or other input devices that have axes
+AXIS_UP seek 10
+AXIS_DOWN seek -10
+AXIS_LEFT speed_mult 0.5
+AXIS_RIGHT speed_mult 1.5
+
# Seek units are in seconds, but note that these are limited by keyframes
RIGHT seek 10
LEFT seek -10
diff --git a/mpvcore/command.c b/mpvcore/command.c
index bc128953ce..d1513bd998 100644
--- a/mpvcore/command.c
+++ b/mpvcore/command.c
@@ -2142,7 +2142,7 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd)
switch (cmd->id) {
case MP_CMD_SEEK: {
- double v = cmd->args[0].v.d;
+ double v = cmd->args[0].v.d * cmd->scale;
int abs = cmd->args[1].v.i;
int exact = cmd->args[2].v.i;
if (abs == 2) { // Absolute seek to a timestamp in seconds
@@ -2187,7 +2187,7 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd)
.wrap = cmd->id == MP_CMD_CYCLE,
};
if (cmd->args[1].v.d)
- s.inc = cmd->args[1].v.d;
+ s.inc = cmd->args[1].v.d * cmd->scale;
int r = mp_property_do(cmd->args[0].v.s, M_PROPERTY_SWITCH, &s, mpctx);
if (r == M_PROPERTY_OK || r == M_PROPERTY_UNAVAILABLE) {
show_property_osd(mpctx, cmd->args[0].v.s, cmd->on_osd);
@@ -2221,7 +2221,7 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd)
}
case MP_CMD_SPEED_MULT: {
- double v = cmd->args[0].v.d;
+ double v = cmd->args[0].v.d * cmd->scale;
v *= mpctx->opts->playback_speed;
mp_property_do("speed", M_PROPERTY_SET, &v, mpctx);
show_property_osd(mpctx, "speed", cmd->on_osd);
diff --git a/mpvcore/input/input.c b/mpvcore/input/input.c
index 935ed62f8e..f900b74357 100644
--- a/mpvcore/input/input.c
+++ b/mpvcore/input/input.c
@@ -424,6 +424,11 @@ static const struct key_name key_names[] = {
{ MP_MK_PREV, "MK_PREV" },
{ MP_MK_NEXT, "MK_NEXT" },
+ { MP_AXIS_UP, "AXIS_UP" },
+ { MP_AXIS_DOWN, "AXIS_DOWN" },
+ { MP_AXIS_LEFT, "AXIS_LEFT" },
+ { MP_AXIS_RIGHT, "AXIS_RIGHT" },
+
{ MP_KEY_POWER, "POWER" },
{ MP_KEY_MENU, "MENU" },
{ MP_KEY_PLAY, "PLAY" },
@@ -910,6 +915,7 @@ static int parse_cmd(struct mp_cmd **dest, bstr str, const char *loc)
cmd = talloc_ptrtype(NULL, cmd);
*cmd = mp_cmds[cmd_idx];
+ cmd->scale = 1;
cmd->pausing = pausing;
cmd->on_osd = on_osd;
cmd->raw_args = raw_args;
@@ -1517,6 +1523,18 @@ void mp_input_put_key_utf8(struct input_ctx *ictx, int mods, struct bstr t)
}
}
+void mp_input_put_axis(struct input_ctx *ictx, int direction, double value)
+{
+ struct mp_cmd *cmd = interpret_key(ictx, direction);
+ if (!cmd)
+ return;
+
+ cmd->scale = value;
+
+ ictx->got_new_events = true;
+ add_key_cmd(ictx, cmd);
+}
+
static void trigger_mouse_leave(struct input_ctx *ictx, char *new_section)
{
if (!new_section)
diff --git a/mpvcore/input/input.h b/mpvcore/input/input.h
index 2c8441c7c0..022ebb3881 100644
--- a/mpvcore/input/input.h
+++ b/mpvcore/input/input.h
@@ -146,6 +146,7 @@ typedef struct mp_cmd {
bool mouse_move;
int mouse_x, mouse_y;
struct mp_cmd *queue_next;
+ double scale; // for scaling numeric arguments
} mp_cmd_t;
@@ -181,6 +182,10 @@ void mp_input_put_key(struct input_ctx *ictx, int code);
// string as key events.
void mp_input_put_key_utf8(struct input_ctx *ictx, int mods, struct bstr t);
+// Process scrolling input. Support for precise scrolling. Scales the given
+// scroll amount add multiplies it with the command (seeking, sub-delay, etc)
+void mp_input_put_axis(struct input_ctx *ictx, int direction, double value);
+
// Update mouse position (in window coordinates).
void mp_input_set_mouse_pos(struct input_ctx *ictx, int x, int y);
diff --git a/mpvcore/input/keycodes.h b/mpvcore/input/keycodes.h
index d91465f3be..cfc011f40a 100644
--- a/mpvcore/input/keycodes.h
+++ b/mpvcore/input/keycodes.h
@@ -201,6 +201,13 @@
#define MP_MK_PREV (MP_MK_BASE + 1)
#define MP_MK_NEXT (MP_MK_BASE + 2)
+// Mouse wheels or touchpad input
+#define MP_AXIS_BASE (MP_KEY_BASE+0x100)
+#define MP_AXIS_UP (MP_AXIS_BASE+0)
+#define MP_AXIS_DOWN (MP_AXIS_BASE+1)
+#define MP_AXIS_LEFT (MP_AXIS_BASE+2)
+#define MP_AXIS_RIGHT (MP_AXIS_BASE+3)
+
/* Special keys */
#define MP_KEY_INTERN (MP_KEY_BASE+0x1000)
#define MP_KEY_CLOSE_WIN (MP_KEY_INTERN+0)