diff options
author | wm4 <wm4@nowhere> | 2014-07-27 21:33:11 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2014-07-27 21:33:11 +0200 |
commit | 89391e7c949216d7edec461e9bb2cb6c787475c6 (patch) | |
tree | 0607c4609ffe505f810403585d54c8fa233e164f /input | |
parent | bc6359313f55ef42e2e4737323844a224f17730b (diff) |
vo: different hack for VOs which need to mangle mouse input
Follow up on commit 760548da. Mouse handling is a bit confusing, because
there are at least 3 coordinate systems associated with it, and it
should be cleaned up. But that is hard, so just apply a hack which gets
the currently-annoying issue (VO backends needing access to the VO) out
of the way.
Diffstat (limited to 'input')
-rw-r--r-- | input/input.c | 29 | ||||
-rw-r--r-- | input/input.h | 7 |
2 files changed, 36 insertions, 0 deletions
diff --git a/input/input.c b/input/input.c index c035187126..97943e05b3 100644 --- a/input/input.c +++ b/input/input.c @@ -159,6 +159,9 @@ struct input_ctx { // Unlike mouse_x/y, this can be used to resolve mouse click bindings. int mouse_vo_x, mouse_vo_y; + bool mouse_mangle, mouse_src_mangle; + struct mp_rect mouse_src, mouse_dst; + bool test; bool default_bindings; @@ -738,11 +741,37 @@ void mp_input_put_axis(struct input_ctx *ictx, int direction, double value) input_unlock(ictx); } +void mp_input_set_mouse_transform(struct input_ctx *ictx, struct mp_rect *dst, + struct mp_rect *src) +{ + input_lock(ictx); + ictx->mouse_mangle = dst || src; + if (ictx->mouse_mangle) { + ictx->mouse_dst = *dst; + ictx->mouse_src_mangle = !!src; + if (ictx->mouse_src_mangle) + ictx->mouse_src = *src; + } + input_unlock(ictx); +} + void mp_input_set_mouse_pos(struct input_ctx *ictx, int x, int y) { input_lock(ictx); MP_DBG(ictx, "mouse move %d/%d\n", x, y); + if (ictx->mouse_mangle) { + struct mp_rect *src = &ictx->mouse_src; + struct mp_rect *dst = &ictx->mouse_dst; + x = MPCLAMP(x, dst->x0, dst->x1) - dst->x0; + y = MPCLAMP(y, dst->y0, dst->y1) - dst->y0; + if (ictx->mouse_src_mangle) { + x = x * 1.0 / (dst->x1 - dst->x0) * (src->x1 - src->x0) + src->x0; + y = y * 1.0 / (dst->y1 - dst->y0) * (src->y1 - src->y0) + src->y0; + } + MP_DBG(ictx, "-> %d/%d\n", x, y); + } + ictx->mouse_event_counter++; ictx->mouse_vo_x = x; ictx->mouse_vo_y = y; diff --git a/input/input.h b/input/input.h index 2dc7b4b366..2c572fa788 100644 --- a/input/input.h +++ b/input/input.h @@ -133,6 +133,13 @@ void mp_input_set_mouse_pos(struct input_ctx *ictx, int x, int y); void mp_input_get_mouse_pos(struct input_ctx *ictx, int *x, int *y); +/* Make mp_input_set_mouse_pos() mangle the mouse coordinates. Hack for certain + * VOs. dst=NULL, src=NULL reset it. src can be NULL. + */ +struct mp_rect; +void mp_input_set_mouse_transform(struct input_ctx *ictx, struct mp_rect *dst, + struct mp_rect *src); + // As for the cmd one you usually don't need this function. void mp_input_rm_key_fd(struct input_ctx *ictx, int fd); |