[mutter] backend: Add meta_backend_update_last_device()



commit 9e3bac0237c9746c52fe66d70bac82f07f3a7f4d
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Feb 11 14:59:21 2015 +0100

    backend: Add meta_backend_update_last_device()
    
    This function can be used to trigger changes depending on the device type
    that is currently emitting the events. So far, it is used to switch cursor
    visibility on/off on touchscreen interaction.
    
    A "last-device-updated" signal has also been added, in order allow hooking
    other behavior changes (eg. OSK) when the last device changes.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=712775

 src/backends/meta-backend-private.h |    4 +++
 src/backends/meta-backend.c         |   46 +++++++++++++++++++++++++++++++++++
 2 files changed, 50 insertions(+), 0 deletions(-)
---
diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h
index 9a0c806..d2c6276 100644
--- a/src/backends/meta-backend-private.h
+++ b/src/backends/meta-backend-private.h
@@ -50,6 +50,7 @@ struct _MetaBackend
   GObject parent;
 
   GHashTable *device_monitors;
+  gint current_device_id;
 };
 
 struct _MetaBackendClass
@@ -106,4 +107,7 @@ void meta_backend_warp_pointer (MetaBackend *backend,
 
 struct xkb_keymap * meta_backend_get_keymap (MetaBackend *backend);
 
+void meta_backend_update_last_device (MetaBackend *backend,
+                                      int          device_id);
+
 #endif /* META_BACKEND_PRIVATE_H */
diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
index dd9641f..474184a 100644
--- a/src/backends/meta-backend.c
+++ b/src/backends/meta-backend.c
@@ -29,6 +29,7 @@
 #include "meta-input-settings-private.h"
 
 #include "backends/x11/meta-backend-x11.h"
+#include "meta-cursor-tracker-private.h"
 #include "meta-stage.h"
 
 #ifdef HAVE_NATIVE_BACKEND
@@ -268,6 +269,12 @@ meta_backend_class_init (MetaBackendClass *klass)
                 0,
                 NULL, NULL, NULL,
                 G_TYPE_NONE, 1, G_TYPE_UINT);
+  g_signal_new ("last-device-changed",
+                G_TYPE_FROM_CLASS (object_class),
+                G_SIGNAL_RUN_LAST,
+                0,
+                NULL, NULL, NULL,
+                G_TYPE_NONE, 1, G_TYPE_INT);
 }
 
 static void
@@ -388,6 +395,45 @@ meta_backend_get_stage (MetaBackend *backend)
   return priv->stage;
 }
 
+void
+meta_backend_update_last_device (MetaBackend *backend,
+                                 int          device_id)
+{
+  ClutterInputDeviceType device_type;
+  MetaCursorTracker *cursor_tracker;
+  ClutterDeviceManager *manager;
+  ClutterInputDevice *device;
+
+  if (backend->current_device_id == device_id)
+    return;
+
+  manager = clutter_device_manager_get_default ();
+  device = clutter_device_manager_get_device (manager, device_id);
+
+  if (!device ||
+      clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER)
+    return;
+
+  device_type = clutter_input_device_get_device_type (device);
+
+  cursor_tracker = meta_cursor_tracker_get_for_screen (NULL);
+  backend->current_device_id = device_id;
+  g_signal_emit_by_name (backend, "last-device-changed", device_id);
+
+  if (device_type == CLUTTER_KEYBOARD_DEVICE)
+    return;
+
+  switch (device_type)
+    {
+    case CLUTTER_TOUCHSCREEN_DEVICE:
+      meta_cursor_tracker_set_pointer_visible (cursor_tracker, FALSE);
+      break;
+    default:
+      meta_cursor_tracker_set_pointer_visible (cursor_tracker, TRUE);
+      break;
+    }
+}
+
 static GType
 get_backend_type (void)
 {


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