diff options
-rw-r--r-- | etc/input.conf | 6 | ||||
-rw-r--r-- | mpvcore/command.c | 6 | ||||
-rw-r--r-- | mpvcore/input/input.c | 18 | ||||
-rw-r--r-- | mpvcore/input/input.h | 5 | ||||
-rw-r--r-- | mpvcore/input/keycodes.h | 7 |
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) |