wayland: Check serial on wp_tablet_pad.set_feedback

We must lookup the mode switch serial for the group where the button
belongs to. Also, avoid the changes if the client requests setting
the feedback for buttons owned by the compositor.
This commit is contained in:
Carlos Garnacho 2016-06-29 18:31:24 +02:00
parent aef997f7a1
commit 1c1785ea6e

View File

@ -222,6 +222,23 @@ meta_wayland_tablet_pad_free (MetaWaylandTabletPad *pad)
g_slice_free (MetaWaylandTabletPad, pad); g_slice_free (MetaWaylandTabletPad, pad);
} }
static MetaWaylandTabletPadGroup *
tablet_pad_lookup_button_group (MetaWaylandTabletPad *pad,
guint button)
{
GList *l;
for (l = pad->groups; l; l = l->next)
{
MetaWaylandTabletPadGroup *group = l->data;
if (meta_wayland_tablet_pad_group_has_button (group, button))
return group;
}
return NULL;
}
static void static void
tablet_pad_set_feedback (struct wl_client *client, tablet_pad_set_feedback (struct wl_client *client,
struct wl_resource *resource, struct wl_resource *resource,
@ -230,8 +247,20 @@ tablet_pad_set_feedback (struct wl_client *client,
uint32_t serial) uint32_t serial)
{ {
MetaWaylandTabletPad *pad = wl_resource_get_user_data (resource); MetaWaylandTabletPad *pad = wl_resource_get_user_data (resource);
MetaWaylandTabletPadGroup *group = tablet_pad_lookup_button_group (pad, button);
MetaInputSettings *input_settings;
/* FIXME: check serial */ if (!group || group->mode_switch_serial != serial)
return;
input_settings = meta_input_settings_get ();
if (input_settings &&
meta_input_settings_is_pad_button_grabbed (input_settings, pad->device, button))
return;
if (meta_wayland_tablet_pad_group_is_mode_switch_button (group, button))
return;
g_hash_table_insert (pad->feedback, GUINT_TO_POINTER (button), g_strdup (str)); g_hash_table_insert (pad->feedback, GUINT_TO_POINTER (button), g_strdup (str));
} }