event: add support for AnyModifier in grabbed button
Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
parent
21e8c0c89e
commit
503283ac28
12
event.c
12
event.c
|
@ -42,6 +42,10 @@
|
||||||
#include "common/atoms.h"
|
#include "common/atoms.h"
|
||||||
#include "common/xutil.h"
|
#include "common/xutil.h"
|
||||||
|
|
||||||
|
#define EVENT_BUTTON_MATCH(b, state, xbutton) \
|
||||||
|
((!(b)->button || (xbutton) == (b)->button) \
|
||||||
|
&& ((b)->mod == XCB_BUTTON_MASK_ANY || (b)->mod == (state)))
|
||||||
|
|
||||||
/** Handle mouse button events.
|
/** Handle mouse button events.
|
||||||
* \param c The client on which the event happened or NULL.
|
* \param c The client on which the event happened or NULL.
|
||||||
* \param type Event type, press or release.
|
* \param type Event type, press or release.
|
||||||
|
@ -57,7 +61,7 @@ event_handle_mouse_button(client_t *c,
|
||||||
button_array_t *buttons)
|
button_array_t *buttons)
|
||||||
{
|
{
|
||||||
foreach(b, *buttons)
|
foreach(b, *buttons)
|
||||||
if((!(*b)->button || button == (*b)->button) && state == (*b)->mod)
|
if(EVENT_BUTTON_MATCH(*b, state, button))
|
||||||
switch(type)
|
switch(type)
|
||||||
{
|
{
|
||||||
case XCB_BUTTON_PRESS:
|
case XCB_BUTTON_PRESS:
|
||||||
|
@ -144,7 +148,7 @@ event_handle_button(void *data, xcb_connection_t *connection, xcb_button_press_e
|
||||||
|
|
||||||
/* check if we match a binding on the wibox */
|
/* check if we match a binding on the wibox */
|
||||||
foreach(b, wibox->buttons)
|
foreach(b, wibox->buttons)
|
||||||
if((!(*b)->button || ev->detail == (*b)->button) && ev->state == (*b)->mod)
|
if(EVENT_BUTTON_MATCH(*b, ev->state, ev->detail))
|
||||||
switch(ev->response_type)
|
switch(ev->response_type)
|
||||||
{
|
{
|
||||||
case XCB_BUTTON_PRESS:
|
case XCB_BUTTON_PRESS:
|
||||||
|
@ -170,7 +174,7 @@ event_handle_button(void *data, xcb_connection_t *connection, xcb_button_press_e
|
||||||
&ev->event_x, &ev->event_y);
|
&ev->event_x, &ev->event_y);
|
||||||
if(w)
|
if(w)
|
||||||
foreach(b, w->buttons)
|
foreach(b, w->buttons)
|
||||||
if((!(*b)->button || ev->detail == (*b)->button) && ev->state == (*b)->mod)
|
if(EVENT_BUTTON_MATCH(*b, ev->state, ev->detail))
|
||||||
switch(ev->response_type)
|
switch(ev->response_type)
|
||||||
{
|
{
|
||||||
case XCB_BUTTON_PRESS:
|
case XCB_BUTTON_PRESS:
|
||||||
|
@ -200,14 +204,12 @@ event_handle_button(void *data, xcb_connection_t *connection, xcb_button_press_e
|
||||||
XCB_CURRENT_TIME);
|
XCB_CURRENT_TIME);
|
||||||
}
|
}
|
||||||
else if(ev->child == XCB_NONE)
|
else if(ev->child == XCB_NONE)
|
||||||
{
|
|
||||||
for(screen = 0; screen < nb_screen; screen++)
|
for(screen = 0; screen < nb_screen; screen++)
|
||||||
if(xutil_screen_get(connection, screen)->root == ev->event)
|
if(xutil_screen_get(connection, screen)->root == ev->event)
|
||||||
{
|
{
|
||||||
event_handle_mouse_button(NULL, ev->response_type, ev->detail, ev->state, &globalconf.buttons);
|
event_handle_mouse_button(NULL, ev->response_type, ev->detail, ev->state, &globalconf.buttons);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue