mirror of
https://github.com/mpv-player/mpv
synced 2025-02-28 19:30:44 +00:00
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.
This commit is contained in:
parent
325926f9f8
commit
b9eaafe1ed
@ -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>
|
||||
|
@ -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],
|
||||
|
18
mp_fifo.c
18
mp_fifo.c
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user