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



commit af3c9f09050e2d28e491ae89e3bdc9bf94a53bbf
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        |   33 +++++++++++++++++++++++++++++++++
 gdk/gdkdeviceprivate.h |    3 +++
 2 files changed, 36 insertions(+), 0 deletions(-)
---
diff --git a/gdk/gdkdevice.c b/gdk/gdkdevice.c
index e70661f..5ce3637 100644
--- a/gdk/gdkdevice.c
+++ b/gdk/gdkdevice.c
@@ -57,6 +57,7 @@ struct _GdkAxisInfo
 
 enum {
   CHANGED,
+  TOOL_CHANGED,
   LAST_SIGNAL
 };
 
@@ -323,6 +324,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
@@ -2011,6 +2030,20 @@ gdk_device_tool_new (guint64 serial)
   return tool;
 }
 
+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);
+
+  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 8031ff1..65cdf50 100644
--- a/gdk/gdkdeviceprivate.h
+++ b/gdk/gdkdeviceprivate.h
@@ -69,6 +69,7 @@ struct _GdkDevice
   gchar *product_id;
 
   GdkSeat *seat;
+  GdkDeviceTool *last_tool;
 };
 
 struct _GdkDeviceClass
@@ -193,6 +194,8 @@ void  gdk_device_set_seat  (GdkDevice *device,
 GdkDeviceTool *gdk_device_tool_new    (guint64        serial);
 GdkDeviceTool *gdk_device_tool_ref    (GdkDeviceTool *tool);
 void           gdk_device_tool_unref  (GdkDeviceTool *tool);
+void           gdk_device_update_tool (GdkDevice     *device,
+                                       GdkDeviceTool *tool);
 
 G_END_DECLS
 


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