From: Carlos Garnacho Date: Tue, 6 Jan 2015 13:44:15 +0000 (+0100) Subject: gdkdevice: Add GdkDevice::tool-changed signal X-Git-Tag: archive/raspbian/4.4.1+ds1-2+rpi1^2~18^2~24^2~5011 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=d5f141a9b7e85272b6042d2be6a6bcd09a825bd3;p=gtk4.git 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. --- diff --git a/gdk/gdkdevice.c b/gdk/gdkdevice.c index d05efc260d..63b3f5dc07 100644 --- a/gdk/gdkdevice.c +++ b/gdk/gdkdevice.c @@ -57,6 +57,7 @@ struct _GdkAxisInfo enum { CHANGED, + TOOL_CHANGED, LAST_SIGNAL }; @@ -341,6 +342,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 + * #GdkDevices whenever tools enter or leave proximity. + * + * Since: 3.22 + */ + 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 @@ -388,6 +407,8 @@ gdk_device_dispose (GObject *object) g_object_unref (associated); } + g_clear_object (&device->last_tool); + G_OBJECT_CLASS (gdk_device_parent_class)->dispose (object); } @@ -2083,6 +2104,17 @@ gdk_device_tool_new (guint64 serial) 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); + + if (g_set_object (&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 a0dad3ce46..52ee6c69ef 100644 --- a/gdk/gdkdeviceprivate.h +++ b/gdk/gdkdeviceprivate.h @@ -76,6 +76,7 @@ struct _GdkDevice gchar *product_id; GdkSeat *seat; + GdkDeviceTool *last_tool; }; struct _GdkDeviceClass @@ -198,6 +199,8 @@ void gdk_device_set_seat (GdkDevice *device, /* Device tools */ GdkDeviceTool *gdk_device_tool_new (guint64 serial); +void gdk_device_update_tool (GdkDevice *device, + GdkDeviceTool *tool); G_END_DECLS