diff --git a/src/core/display.c b/src/core/display.c index 5da8c01fc..18621f996 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -1721,6 +1721,7 @@ event_callback (XEvent *event, { Window xwindow = meta_input_event_get_window (display, event); Time evtime = meta_input_event_get_time (display, event); + guint n_button; if (window && !window->override_redirect && ((evtype == KeyPress) || (evtype == ButtonPress))) @@ -1759,16 +1760,18 @@ event_callback (XEvent *event, filter_out_event = bypass_compositor = TRUE; break; case ButtonPress: + meta_input_event_get_button (display, event, &n_button); + if (display->grab_op == META_GRAB_OP_COMPOSITOR) break; - if (event->xbutton.button == 4 || event->xbutton.button == 5) + if (n_button == 4 || n_button == 5) /* Scrollwheel event, do nothing and deliver event to compositor below */ break; if ((window && grab_op_is_mouse (display->grab_op) && - display->grab_button != (int) event->xbutton.button && + display->grab_button != (int) n_button && display->grab_window == window) || grab_op_is_keyboard (display->grab_op)) { @@ -1809,8 +1812,7 @@ event_callback (XEvent *event, */ unmodified = (event->xbutton.state & grab_mask) == 0; - if (unmodified || - event->xbutton.button == 1) + if (unmodified || n_button == 1) { /* don't focus if frame received, will be lowered in * frames.c or special-cased if the click was on a @@ -1831,7 +1833,7 @@ event_callback (XEvent *event, { meta_topic (META_DEBUG_FOCUS, "Focusing %s due to unmodified button %u press (display.c)\n", - window->desc, event->xbutton.button); + window->desc, n_button); meta_window_focus (window, evtime); } else @@ -1847,7 +1849,7 @@ event_callback (XEvent *event, if (!unmodified) begin_move = TRUE; } - else if (!unmodified && event->xbutton.button == meta_prefs_get_mouse_button_resize()) + else if (!unmodified && n_button == meta_prefs_get_mouse_button_resize()) { if (window->has_resize_func) { @@ -1889,21 +1891,21 @@ event_callback (XEvent *event, op, TRUE, FALSE, - event->xbutton.button, + n_button, 0, evtime, event->xbutton.x_root, event->xbutton.y_root); } } - else if (event->xbutton.button == meta_prefs_get_mouse_button_menu()) + else if (n_button == meta_prefs_get_mouse_button_menu()) { if (meta_prefs_get_raise_on_click ()) meta_window_raise (window); meta_window_show_menu (window, event->xbutton.x_root, event->xbutton.y_root, - event->xbutton.button, + n_button, evtime); } @@ -1946,7 +1948,7 @@ event_callback (XEvent *event, META_GRAB_OP_MOVING, TRUE, FALSE, - event->xbutton.button, + n_button, 0, evtime, event->xbutton.x_root, diff --git a/src/core/input-events.c b/src/core/input-events.c index fbd9d2ae8..e17987165 100644 --- a/src/core/input-events.c +++ b/src/core/input-events.c @@ -495,3 +495,48 @@ meta_input_event_get_keycode (MetaDisplay *display, return FALSE; } + +gboolean +meta_input_event_get_button (MetaDisplay *display, + XEvent *ev, + guint *button) +{ +#ifdef HAVE_XINPUT2 + if (ev->type == GenericEvent && + ev->xcookie.extension == display->xinput2_opcode) + { + XIEvent *xev; + + g_assert (display->have_xinput2 == TRUE); + + xev = (XIEvent *) ev->xcookie.data; + + if (xev->evtype == XI_ButtonPress || + xev->evtype == XI_ButtonRelease) + { + if (button) + { + /* The detail field contains + * button number for button events + */ + *button = ((XIDeviceEvent *) xev)->detail; + } + + return TRUE; + } + } + else +#endif /* HAVE_XINPUT2 */ + { + if (ev->type == ButtonPress || + ev->type == ButtonRelease) + { + if (button) + *button = ev->xbutton.button; + + return TRUE; + } + } + + return FALSE; +} diff --git a/src/core/input-events.h b/src/core/input-events.h index ea2c12e38..9cc39ead2 100644 --- a/src/core/input-events.h +++ b/src/core/input-events.h @@ -60,5 +60,8 @@ gboolean meta_input_event_get_state (MetaDisplay *display, gboolean meta_input_event_get_keycode (MetaDisplay *display, XEvent *ev, guint *keycode); +gboolean meta_input_event_get_button (MetaDisplay *display, + XEvent *event, + guint *button); #endif /* META_EVENT_H */