backends/x11: Implement ClutterSeat::touch-mode for the X11 backend

This only checks touchscreen availability as we have no access to
tablet-mode switch events as we do on the native backend.

Fixes: https://gitlab.gnome.org/GNOME/mutter/-/issues/1242

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1278


(cherry picked from commit 38bbd9593b)
This commit is contained in:
Carlos Garnacho 2020-05-29 12:01:11 +00:00 committed by Florian Müllner
parent 63fc71f05b
commit a1bc2e0adc

View File

@ -38,7 +38,10 @@ enum
PROP_OPCODE, PROP_OPCODE,
PROP_POINTER_ID, PROP_POINTER_ID,
PROP_KEYBOARD_ID, PROP_KEYBOARD_ID,
N_PROPS N_PROPS,
/* This property is overridden */
PROP_TOUCH_MODE,
}; };
struct _MetaSeatX11 struct _MetaSeatX11
@ -54,6 +57,8 @@ struct _MetaSeatX11
int pointer_id; int pointer_id;
int keyboard_id; int keyboard_id;
int opcode; int opcode;
guint has_touchscreens : 1;
guint touch_mode : 1;
}; };
static GParamSpec *props[N_PROPS] = { 0 }; static GParamSpec *props[N_PROPS] = { 0 };
@ -605,6 +610,20 @@ pad_passive_button_grab (ClutterInputDevice *device)
g_free (xi_event_mask.mask); g_free (xi_event_mask.mask);
} }
static void
update_touch_mode (MetaSeatX11 *seat_x11)
{
gboolean touch_mode;
touch_mode = seat_x11->has_touchscreens;
if (seat_x11->touch_mode == touch_mode)
return;
seat_x11->touch_mode = touch_mode;
g_object_notify (G_OBJECT (seat_x11), "touch-mode");
}
static ClutterInputDevice * static ClutterInputDevice *
add_device (MetaSeatX11 *seat_x11, add_device (MetaSeatX11 *seat_x11,
ClutterBackend *backend, ClutterBackend *backend,
@ -635,6 +654,8 @@ add_device (MetaSeatX11 *seat_x11,
info->attachment == seat_x11->keyboard_id)) info->attachment == seat_x11->keyboard_id))
{ {
seat_x11->devices = g_list_prepend (seat_x11->devices, device); seat_x11->devices = g_list_prepend (seat_x11->devices, device);
seat_x11->has_touchscreens |=
clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE;
} }
else else
{ {
@ -663,18 +684,38 @@ add_device (MetaSeatX11 *seat_x11,
} }
} }
update_touch_mode (seat_x11);
return device; return device;
} }
static gboolean
has_touchscreens (MetaSeatX11 *seat_x11)
{
GList *l;
for (l = seat_x11->devices; l; l = l->next)
{
if (clutter_input_device_get_device_type (l->data) == CLUTTER_TOUCHSCREEN_DEVICE)
return TRUE;
}
return FALSE;
}
static void static void
remove_device (MetaSeatX11 *seat_x11, remove_device (MetaSeatX11 *seat_x11,
int device_id) int device_id)
{ {
ClutterInputDevice *device; ClutterInputDevice *device;
gboolean check_touchscreens = FALSE;
device = g_hash_table_lookup (seat_x11->devices_by_id, device = g_hash_table_lookup (seat_x11->devices_by_id,
GINT_TO_POINTER (device_id)); GINT_TO_POINTER (device_id));
if (clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE)
check_touchscreens = TRUE;
if (device != NULL) if (device != NULL)
{ {
if (seat_x11->core_pointer == device) if (seat_x11->core_pointer == device)
@ -695,6 +736,12 @@ remove_device (MetaSeatX11 *seat_x11,
g_hash_table_remove (seat_x11->devices_by_id, g_hash_table_remove (seat_x11->devices_by_id,
GINT_TO_POINTER (device_id)); GINT_TO_POINTER (device_id));
} }
if (check_touchscreens)
{
seat_x11->has_touchscreens = has_touchscreens (seat_x11);
update_touch_mode (seat_x11);
}
} }
static void static void
@ -1272,6 +1319,7 @@ meta_seat_x11_set_property (GObject *object,
case PROP_KEYBOARD_ID: case PROP_KEYBOARD_ID:
seat_x11->keyboard_id = g_value_get_int (value); seat_x11->keyboard_id = g_value_get_int (value);
break; break;
case PROP_TOUCH_MODE:
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
} }
@ -1296,6 +1344,9 @@ meta_seat_x11_get_property (GObject *object,
case PROP_KEYBOARD_ID: case PROP_KEYBOARD_ID:
g_value_set_int (value, seat_x11->keyboard_id); g_value_set_int (value, seat_x11->keyboard_id);
break; break;
case PROP_TOUCH_MODE:
g_value_set_boolean (value, seat_x11->touch_mode);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
} }
@ -1547,6 +1598,9 @@ meta_seat_x11_class_init (MetaSeatX11Class *klass)
G_PARAM_CONSTRUCT_ONLY); G_PARAM_CONSTRUCT_ONLY);
g_object_class_install_properties (object_class, N_PROPS, props); g_object_class_install_properties (object_class, N_PROPS, props);
g_object_class_override_property (object_class, PROP_TOUCH_MODE,
"touch-mode");
} }
static void static void