[mutter/wip/carlosg/touch-mode-x11] backends/x11: Implement ClutterSeat::touch-mode for the X11 backend



commit 95a34e60bf39f8ea9f523d9c1ab1949772efd44b
Author: Carlos Garnacho <carlosg gnome org>
Date:   Fri May 29 14:01:11 2020 +0200

    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

 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]