[mutter/wip/carlosg/x11-devices-config: 2/2] backends/x11: Emit CLUTTER_DEVICE_ADDED events for initial devices




commit 46df98b3412f5fac61c891ce80c048ed5b2eb76b
Author: Carlos Garnacho <carlosg gnome org>
Date:   Fri Nov 6 18:00:55 2020 +0100

    backends/x11: Emit CLUTTER_DEVICE_ADDED events for initial devices
    
    This is similar to commit b9e5a2d6e23, but for the X11 backend.

 src/backends/x11/meta-seat-x11.c | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)
---
diff --git a/src/backends/x11/meta-seat-x11.c b/src/backends/x11/meta-seat-x11.c
index de775e1f91..ddf81082fe 100644
--- a/src/backends/x11/meta-seat-x11.c
+++ b/src/backends/x11/meta-seat-x11.c
@@ -54,6 +54,9 @@ struct _MetaSeatX11
   GHashTable *tools_by_serial;
   MetaKeymapX11 *keymap;
 
+  ClutterStageManager *stage_manager;
+  gulong stage_added_handler;
+
   int pointer_id;
   int keyboard_id;
   int opcode;
@@ -1383,6 +1386,32 @@ meta_seat_x11_get_property (GObject    *object,
     }
 }
 
+static void
+meta_seat_x11_stage_added_cb (ClutterStageManager *manager,
+                             ClutterStage        *stage,
+                             MetaSeatX11         *seat_x11)
+{
+  GHashTableIter iter;
+  ClutterInputDevice *device;
+
+  g_hash_table_iter_init (&iter, seat_x11->devices_by_id);
+  while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &device))
+    {
+      ClutterEvent *event;
+
+      event = clutter_event_new (CLUTTER_DEVICE_ADDED);
+      clutter_event_set_device (event, device);
+      clutter_event_set_stage (event, stage);
+      clutter_do_event (event);
+    }
+
+  /* We only want to do this once so we can catch the default
+     stage. If the application has multiple stages then it will need
+     to manage the stage of the input devices itself */
+  g_clear_signal_handler (&seat_x11->stage_added_handler,
+                          seat_x11->stage_manager);
+}
+
 static void
 meta_seat_x11_constructed (GObject *object)
 {
@@ -1395,6 +1424,13 @@ meta_seat_x11_constructed (GObject *object)
   int n_devices, i;
   Display *xdisplay;
 
+  seat_x11->stage_manager = clutter_stage_manager_get_default ();
+  seat_x11->stage_added_handler =
+    g_signal_connect (seat_x11->stage_manager,
+                      "stage-added",
+                      G_CALLBACK (meta_seat_x11_stage_added_cb),
+                      seat_x11);
+
   xdisplay = clutter_x11_get_default_display ();
   logical_devices = g_hash_table_new (NULL, NULL);
   physical_devices = g_hash_table_new (NULL, NULL);
@@ -1479,6 +1515,8 @@ meta_seat_x11_finalize (GObject *object)
 {
   MetaSeatX11 *seat_x11 = META_SEAT_X11 (object);
 
+  g_clear_signal_handler (&seat_x11->stage_added_handler,
+                          seat_x11->stage_manager);
   g_hash_table_unref (seat_x11->devices_by_id);
   g_hash_table_unref (seat_x11->tools_by_serial);
   g_list_free (seat_x11->devices);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]