diff options
author | Uoti Urpala <uau@mplayer2.org> | 2011-04-25 14:12:04 +0300 |
---|---|---|
committer | Uoti Urpala <uau@mplayer2.org> | 2011-05-02 00:44:21 +0300 |
commit | b9eaafe1ed4f38efcd08d113d9e51e9ebb034f6e (patch) | |
tree | fd70a279e23af0e61b98f3bb66382005f18ca3c4 | |
parent | 325926f9f87070615521747646c47012f1434e15 (diff) | |
download | mpv-b9eaafe1ed4f38efcd08d113d9e51e9ebb034f6e.tar.bz2 mpv-b9eaafe1ed4f38efcd08d113d9e51e9ebb034f6e.tar.xz |
input: modify interpretation of doubleclick events
The code combining button presses into multibutton commands prevented
single click commands from triggering if a doubleclick event had been
generated from the same button press. As a result using the mouse
wheel to seek worked very badly. Special-case doubleclick events in
the event interpretation code to avoid this issue. This changes the
sequence of generated "keys" for press-release-press-release from
MOUSE_BTN0 MOUSE_BTN0-MOUSE_BTN0_DBL MOUSE_BTN0_DBL to
MOUSE_BTN0 MOUSE_BTN0_DBL MOUSE_BTN0.
"Keys" like MOUSE_BTN0-MOUSE_BTN0_DBL will never be generated now; any
existing configuration files using those need to be changed.
-rw-r--r-- | DOCS/man/en/mplayer.1 | 4 | ||||
-rw-r--r-- | input/input.c | 13 | ||||
-rw-r--r-- | mp_fifo.c | 18 |
3 files changed, 19 insertions, 16 deletions
diff --git a/DOCS/man/en/mplayer.1 b/DOCS/man/en/mplayer.1 index 081171a2de..7d96bd2773 100644 --- a/DOCS/man/en/mplayer.1 +++ b/DOCS/man/en/mplayer.1 @@ -780,10 +780,6 @@ Time in milliseconds to recognize two consecutive button presses as a double-click (default: 300). Set to 0 to let your windowing system decide what a double-click is (\-vo directx only). -.br -.I NOTE: -You will get slightly different behaviour depending on whether you bind -MOUSE_BTN0_DBL or MOUSE_BTN0\-MOUSE_BTN0_DBL. . .TP .B \-edlout <filename> diff --git a/input/input.c b/input/input.c index ccce08e450..4c69d00400 100644 --- a/input/input.c +++ b/input/input.c @@ -1184,6 +1184,15 @@ static mp_cmd_t *interpret_key(struct input_ctx *ictx, int code) if (ictx->key_down[j] == code) break; } + bool doubleclick = code >= MOUSE_BTN0_DBL && code < MOUSE_BTN_DBL_END; + if (doubleclick) { + int btn = code - MOUSE_BTN0_DBL + MOUSE_BTN0; + if (!ictx->num_key_down + || ictx->key_down[ictx->num_key_down - 1] != btn) + return NULL; + j = ictx->num_key_down - 1; + ictx->key_down[j] = code; + } if (j == ictx->num_key_down) { // was not already down; add temporarily if (ictx->num_key_down > MP_MAX_KEY_DOWN) { mp_tmsg(MSGT_INPUT, MSGL_ERR, "Too many key down events " @@ -1198,6 +1207,10 @@ static mp_cmd_t *interpret_key(struct input_ctx *ictx, int code) ret = ictx->last_key_down ? get_cmd_from_keys(ictx, ictx->num_key_down, ictx->key_down) : NULL; + if (doubleclick) { + ictx->key_down[j] = code - MOUSE_BTN0_DBL + MOUSE_BTN0; + return ret; + } // Remove the key if (j + 1 < ictx->num_key_down) memmove(&ictx->key_down[j], &ictx->key_down[j + 1], @@ -31,8 +31,8 @@ struct mp_fifo { int readpos; int writepos; int size; - unsigned last_key_time[2]; - int last_key[2]; + int last_key_down; + unsigned last_down_time; }; struct mp_fifo *mp_fifo_create(struct MPOpts *opts) @@ -86,16 +86,10 @@ void mplayer_put_key(struct mp_fifo *fifo, int code) mplayer_put_key_internal(fifo, code); if (code & MP_KEY_DOWN) { code &= ~MP_KEY_DOWN; - fifo->last_key[1] = fifo->last_key[0]; - fifo->last_key[0] = code; - fifo->last_key_time[1] = fifo->last_key_time[0]; - fifo->last_key_time[0] = now; - if (fifo->last_key[1] == code - && now - fifo->last_key_time[1] < doubleclick_time) + if (fifo->last_key_down == code + && now - fifo->last_down_time < doubleclick_time) put_double(fifo, code); - return; + fifo->last_key_down = code; + fifo->last_down_time = now; } - if (fifo->last_key[0] == code && fifo->last_key[1] == code - && now - fifo->last_key_time[1] < doubleclick_time) - put_double(fifo, code); } |