MetaWaylandTouch: fix running without touch hardware
Refuse to create a touch resource if we don't have the capability (for misbehaving clients), and don't attempt to use touch data structures that are not initialized.
This commit is contained in:
parent
65a8f9100c
commit
e56f963574
@ -452,6 +452,9 @@ meta_wayland_touch_cancel (MetaWaylandTouch *touch)
|
|||||||
{
|
{
|
||||||
GList *surfaces, *s;
|
GList *surfaces, *s;
|
||||||
|
|
||||||
|
if (touch->display == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
surfaces = s = touch_get_surfaces (touch, FALSE);
|
surfaces = s = touch_get_surfaces (touch, FALSE);
|
||||||
|
|
||||||
for (s = surfaces; s; s = s->next)
|
for (s = surfaces; s; s = s->next)
|
||||||
@ -533,6 +536,7 @@ meta_wayland_touch_release (MetaWaylandTouch *touch)
|
|||||||
clutter_evdev_remove_filter (evdev_filter_func, touch);
|
clutter_evdev_remove_filter (evdev_filter_func, touch);
|
||||||
g_clear_pointer (&touch->touch_surfaces, (GDestroyNotify) g_hash_table_unref);
|
g_clear_pointer (&touch->touch_surfaces, (GDestroyNotify) g_hash_table_unref);
|
||||||
g_clear_pointer (&touch->touches, (GDestroyNotify) g_hash_table_unref);
|
g_clear_pointer (&touch->touches, (GDestroyNotify) g_hash_table_unref);
|
||||||
|
touch->display = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -543,6 +547,13 @@ meta_wayland_touch_create_new_resource (MetaWaylandTouch *touch,
|
|||||||
{
|
{
|
||||||
struct wl_resource *cr;
|
struct wl_resource *cr;
|
||||||
|
|
||||||
|
if (touch->display == NULL)
|
||||||
|
{
|
||||||
|
wl_resource_post_error (seat_resource, WL_DISPLAY_ERROR_INVALID_METHOD,
|
||||||
|
"Cannot retrieve touch interface without touch capability");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
cr = wl_resource_create (client, &wl_touch_interface,
|
cr = wl_resource_create (client, &wl_touch_interface,
|
||||||
MIN (META_WL_TOUCH_VERSION, wl_resource_get_version (seat_resource)), id);
|
MIN (META_WL_TOUCH_VERSION, wl_resource_get_version (seat_resource)), id);
|
||||||
wl_resource_set_implementation (cr, &touch_interface, touch, unbind_resource);
|
wl_resource_set_implementation (cr, &touch_interface, touch, unbind_resource);
|
||||||
|
Loading…
Reference in New Issue
Block a user