input: rework mouse button/motion handling

Store a list of currently pressed buttons, and which surface they
belong to (i.e. which surface that received the press).

Then, in motion events (with a button pressed, aka drag operations),
send the event to the “original” surface (that received the press).

Also send release events to the originating surface.

This means a surface receiving a press will always receive a
corresponding release. And no one will receive a release event without
a corresponding press event.

Motion events with a button pressed will *always* use the *first*
button that was pressed. I.e. if you press a button, start dragging,
and then press another button, we keep generating motion events for
the *first* button.
This commit is contained in:
Daniel Eklöf 2020-12-12 19:05:24 +01:00
parent a1a0b489ee
commit ff96ce1e91
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
4 changed files with 145 additions and 115 deletions

View file

@ -138,6 +138,8 @@ seat_destroy(struct seat *seat)
if (seat == NULL)
return;
tll_free(seat->mouse.buttons);
tll_foreach(seat->kbd.bindings.key, it)
tll_free(it->item.bind.key_codes);
tll_free(seat->kbd.bindings.key);