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.
This commit is contained in:
Carlos Garnacho 2015-01-06 14:44:15 +01:00
parent 4ba95b09ba
commit d5f141a9b7
2 changed files with 35 additions and 0 deletions

View File

@ -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
* #GdkDevice<!-- -->s 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

View File

@ -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