[gtk+/wip/wayland-tablet: 4/23] gdkdevice: Add GdkDevice::tool-changed signal
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/wayland-tablet: 4/23] gdkdevice: Add GdkDevice::tool-changed signal
- Date: Mon, 22 Jun 2015 17:15:13 +0000 (UTC)
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]