[mutter/gnome-3-36] backends/x11: Implement ClutterSeat::touch-mode for the X11 backend
- From: Florian Müllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/gnome-3-36] backends/x11: Implement ClutterSeat::touch-mode for the X11 backend
- Date: Fri, 29 May 2020 14:52:44 +0000 (UTC)
commit a1bc2e0adcd04aea890fb19aa66fdf277b0800ec
Author: Carlos Garnacho <carlosg gnome org>
Date: Fri May 29 12:01:11 2020 +0000
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 38bbd9593bc3d4c8afa77dcd5329adb8c4f20abf)
src/backends/x11/meta-seat-x11.c | 56 +++++++++++++++++++++++++++++++++++++++-
1 file changed, 55 insertions(+), 1 deletion(-)
---
diff --git a/src/backends/x11/meta-seat-x11.c b/src/backends/x11/meta-seat-x11.c
index e6e9968033..f20cac1481 100644
--- a/src/backends/x11/meta-seat-x11.c
+++ b/src/backends/x11/meta-seat-x11.c
@@ -38,7 +38,10 @@ enum
PROP_OPCODE,
PROP_POINTER_ID,
PROP_KEYBOARD_ID,
- N_PROPS
+ N_PROPS,
+
+ /* This property is overridden */
+ PROP_TOUCH_MODE,
};
struct _MetaSeatX11
@@ -54,6 +57,8 @@ struct _MetaSeatX11
int pointer_id;
int keyboard_id;
int opcode;
+ guint has_touchscreens : 1;
+ guint touch_mode : 1;
};
static GParamSpec *props[N_PROPS] = { 0 };
@@ -605,6 +610,20 @@ pad_passive_button_grab (ClutterInputDevice *device)
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 *
add_device (MetaSeatX11 *seat_x11,
ClutterBackend *backend,
@@ -635,6 +654,8 @@ add_device (MetaSeatX11 *seat_x11,
info->attachment == seat_x11->keyboard_id))
{
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
{
@@ -663,18 +684,38 @@ add_device (MetaSeatX11 *seat_x11,
}
}
+ update_touch_mode (seat_x11);
+
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
remove_device (MetaSeatX11 *seat_x11,
int device_id)
{
ClutterInputDevice *device;
+ gboolean check_touchscreens = FALSE;
device = g_hash_table_lookup (seat_x11->devices_by_id,
GINT_TO_POINTER (device_id));
+ if (clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE)
+ check_touchscreens = TRUE;
+
if (device != NULL)
{
if (seat_x11->core_pointer == device)
@@ -695,6 +736,12 @@ remove_device (MetaSeatX11 *seat_x11,
g_hash_table_remove (seat_x11->devices_by_id,
GINT_TO_POINTER (device_id));
}
+
+ if (check_touchscreens)
+ {
+ seat_x11->has_touchscreens = has_touchscreens (seat_x11);
+ update_touch_mode (seat_x11);
+ }
}
static void
@@ -1272,6 +1319,7 @@ meta_seat_x11_set_property (GObject *object,
case PROP_KEYBOARD_ID:
seat_x11->keyboard_id = g_value_get_int (value);
break;
+ case PROP_TOUCH_MODE:
default:
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:
g_value_set_int (value, seat_x11->keyboard_id);
break;
+ case PROP_TOUCH_MODE:
+ g_value_set_boolean (value, seat_x11->touch_mode);
+ break;
default:
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_object_class_install_properties (object_class, N_PROPS, props);
+
+ g_object_class_override_property (object_class, PROP_TOUCH_MODE,
+ "touch-mode");
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]