Mousegrabber: Correctly handle press/release events

When you run a mousegrabber, the C code calls this callback when the pointer is
moved or when a button is pressed/released. However, the button state is totally
bogus on press/release events, always claiming that the button that was
pressed/released is the only button that is pressed (even for release events!).

This commit fixes up the code so that the button state after the press/release
event is passed to the mousegrabber callback function.

Fixes: #280
Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
Uli Schlachter 2015-07-05 16:14:41 +02:00
parent 55bffbcc45
commit 18f6ab107f
1 changed files with 12 additions and 2 deletions

12
event.c
View File

@ -173,8 +173,18 @@ event_handle_button(xcb_button_press_event_t *ev)
globalconf.timestamp = ev->time; globalconf.timestamp = ev->time;
if(event_handle_mousegrabber(ev->root_x, ev->root_y, 1 << (ev->detail - 1 + 8))) {
/* ev->state contains the state before the event. Compute the state
* after the event for the mousegrabber.
*/
uint16_t state = ev->state, change = 1 << (ev->detail - 1 + 8);
if (XCB_EVENT_RESPONSE_TYPE(ev) == XCB_BUTTON_PRESS)
state |= change;
else
state &= ~change;
if(event_handle_mousegrabber(ev->root_x, ev->root_y, state))
return; return;
}
/* ev->state is /* ev->state is
* button status (8 bits) + modifiers status (8 bits) * button status (8 bits) + modifiers status (8 bits)