frames: Allow for unknown mouse buttons

Commit 47131b1d ("frames: Handle touch events") introduced an assert to
make sure that all mouse button actions are handled in mutter.

However, mice can have a more than 5 buttons, so simply ignore the
"other" actions instead of aborting.

Fixes: https://gitlab.gnome.org/GNOME/mutter/issues/160
This commit is contained in:
Olivier Fourdan 2018-05-22 11:23:13 +02:00
parent f7747e4d4f
commit 473bf38753

View File

@ -75,7 +75,8 @@ enum {
META_ACTION_CLICK, META_ACTION_CLICK,
META_ACTION_RIGHT_CLICK, META_ACTION_RIGHT_CLICK,
META_ACTION_MIDDLE_CLICK, META_ACTION_MIDDLE_CLICK,
META_ACTION_DOUBLE_CLICK META_ACTION_DOUBLE_CLICK,
META_ACTION_IGNORE
}; };
static GObject * static GObject *
@ -974,6 +975,10 @@ get_action (const ClutterEvent *event)
return META_ACTION_RIGHT_CLICK; return META_ACTION_RIGHT_CLICK;
case CLUTTER_BUTTON_MIDDLE: case CLUTTER_BUTTON_MIDDLE:
return META_ACTION_MIDDLE_CLICK; return META_ACTION_MIDDLE_CLICK;
default:
meta_verbose ("No action triggered for button %u %s\n",
event->button.button,
(event->type == CLUTTER_BUTTON_PRESS) ? "press" : "release");
} }
} }
else if (event->type == CLUTTER_TOUCH_BEGIN || else if (event->type == CLUTTER_TOUCH_BEGIN ||
@ -983,7 +988,7 @@ get_action (const ClutterEvent *event)
return META_ACTION_CLICK; return META_ACTION_CLICK;
} }
g_assert_not_reached (); return META_ACTION_IGNORE;
} }
static uint32_t static uint32_t
@ -1115,13 +1120,15 @@ handle_press_event (MetaUIFrame *frame,
g_assert (event->type == CLUTTER_BUTTON_PRESS || g_assert (event->type == CLUTTER_BUTTON_PRESS ||
event->type == CLUTTER_TOUCH_BEGIN); event->type == CLUTTER_TOUCH_BEGIN);
action = get_action (event);
if (action == META_ACTION_IGNORE)
return FALSE;
display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
evtime = clutter_event_get_time (event); evtime = clutter_event_get_time (event);
clutter_event_get_coords (event, &x, &y); clutter_event_get_coords (event, &x, &y);
control = get_control (frame, x, y); control = get_control (frame, x, y);
action = get_action (event);
/* don't do the rest of this if on client area */ /* don't do the rest of this if on client area */
if (control == META_FRAME_CONTROL_CLIENT_AREA) if (control == META_FRAME_CONTROL_CLIENT_AREA)
return FALSE; /* not on the frame, just passed through from client */ return FALSE; /* not on the frame, just passed through from client */