[gtk+/wip/wayland-tablet: 4/23] gdkdevice: Add GdkDevice::tool-changed signal



commit b485bef9007fa17042fb078aaf737ac57acb0343
Author: Carlos Garnacho <carlosg gnome org>
Date:   Tue Jan 6 14:44:15 2015 +0100

    gdkdevice: Add GdkDevice::tool-changed signal
    
    On the devices and backends that support it, this signal will be emitted
    on slave/floating devices whenever the tool they are interacting with
    changes. These notifications may also work as a sort of proximity events,
    as the tool will be unset when the pen moves too far.
    
    For backends, gdk_device_update_tool() has been included, all that should
    be done on their side is just calling this whenever any tool might have
    changed.

 gdk/gdkdevice.c        |   34 ++++++++++++++++++++++++++++++++++
 gdk/gdkdeviceprivate.h |    3 +++
 2 files changed, 37 insertions(+), 0 deletions(-)
---
diff --git a/gdk/gdkdevice.c b/gdk/gdkdevice.c
index 8b9f73e..93378c2 100644
--- a/gdk/gdkdevice.c
+++ b/gdk/gdkdevice.c
@@ -57,6 +57,7 @@ struct _GdkAxisInfo
 
 enum {
   CHANGED,
+  TOOL_CHANGED,
   LAST_SIGNAL
 };
 
@@ -303,6 +304,24 @@ gdk_device_class_init (GdkDeviceClass *klass)
                   0, NULL, NULL,
                   g_cclosure_marshal_VOID__VOID,
                   G_TYPE_NONE, 0);
+
+  /**
+   * GdkDevice::tool-changed:
+   * @device: the #GdkDevice that changed.
+   * @tool: The new current tool
+   *
+   * The ::tool-changed signal is emitted on pen/eraser
+   * #GdkDevice<!-- -->s whenever tools enter or leave proximity.
+   *
+   * Since: 3.18
+   */
+  signals[TOOL_CHANGED] =
+    g_signal_new (g_intern_static_string ("tool-changed"),
+                  G_TYPE_FROM_CLASS (object_class),
+                  G_SIGNAL_RUN_LAST,
+                  0, NULL, NULL,
+                  g_cclosure_marshal_VOID__BOXED,
+                  G_TYPE_NONE, 1, GDK_TYPE_DEVICE_TOOL);
 }
 
 static void
@@ -1984,6 +2003,21 @@ gdk_device_lookup_tool (GdkDevice *device,
   return NULL;
 }
 
+void
+gdk_device_update_tool (GdkDevice     *device,
+                        GdkDeviceTool *tool)
+{
+  g_return_if_fail (GDK_IS_DEVICE (device));
+  g_return_if_fail (gdk_device_get_device_type (device) != GDK_DEVICE_TYPE_MASTER);
+  g_return_if_fail (!tool || gdk_device_lookup_tool (device, gdk_device_tool_get_serial (tool)) != NULL);
+
+  if (device->last_tool == tool)
+    return;
+
+  device->last_tool = tool;
+  g_signal_emit (device, signals[TOOL_CHANGED], 0, tool);
+}
+
 /**
  * gdk_device_tool_get_serial:
  * @tool: a #GdkDeviceTool
diff --git a/gdk/gdkdeviceprivate.h b/gdk/gdkdeviceprivate.h
index bd3dd50..0163211 100644
--- a/gdk/gdkdeviceprivate.h
+++ b/gdk/gdkdeviceprivate.h
@@ -68,6 +68,7 @@ struct _GdkDevice
   gchar *product_id;
 
   GPtrArray *tools;
+  GdkDeviceTool *last_tool;
 };
 
 struct _GdkDeviceClass
@@ -191,6 +192,8 @@ GdkDeviceTool *gdk_device_lookup_tool (GdkDevice     *device,
                                        guint          serial);
 void           gdk_device_add_tool    (GdkDevice     *device,
                                        GdkDeviceTool *tool);
+void           gdk_device_update_tool (GdkDevice     *device,
+                                       GdkDeviceTool *tool);
 
 GdkDeviceTool *gdk_device_tool_ref    (GdkDeviceTool *tool);
 void           gdk_device_tool_unref  (GdkDeviceTool *tool);


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