gdk: Add GdkSeat::tool-added/removed signals

And a helper function to lookup a tool from the seat. Those are
tracker per-seat, and may be shared across devices.
This commit is contained in:
Carlos Garnacho 2016-01-29 13:06:02 +01:00
parent d5f141a9b7
commit 6824dd7b8a
2 changed files with 82 additions and 0 deletions

View File

@ -46,6 +46,8 @@ struct _GdkSeatPrivate
enum { enum {
DEVICE_ADDED, DEVICE_ADDED,
DEVICE_REMOVED, DEVICE_REMOVED,
TOOL_ADDED,
TOOL_REMOVED,
N_SIGNALS N_SIGNALS
}; };
@ -146,6 +148,48 @@ gdk_seat_class_init (GdkSeatClass *klass)
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
GDK_TYPE_DEVICE); GDK_TYPE_DEVICE);
/**
* GdkSeat::tool-added:
* @seat: the object on which the signal is emitted
* @tool: the new #GdkDeviceTool known to the seat
*
* The ::tool-added signal is emitted whenever a new tool
* is made known to the seat. The tool may later be assigned
* to a device (i.e. on proximity with a tablet). The device
* will emit the #GdkDevice::tool-changed signal accordingly.
*
* A same tool may be used by several devices.
*
* Since: 3.22
*/
signals [TOOL_ADDED] =
g_signal_new (g_intern_static_string ("tool-added"),
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0, NULL, NULL,
g_cclosure_marshal_VOID__BOXED,
G_TYPE_NONE, 1,
GDK_TYPE_DEVICE_TOOL);
/**
* GdkSeat::tool-removed:
* @seat: the object on which the signal is emitted
* @tool: the just removed #GdkDeviceTool
*
* This signal is emitted whenever a tool is no longer known
* to this @seat.
*
* Since: 3.22
*/
signals [TOOL_REMOVED] =
g_signal_new (g_intern_static_string ("tool-removed"),
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0, NULL, NULL,
g_cclosure_marshal_VOID__BOXED,
G_TYPE_NONE, 1,
GDK_TYPE_DEVICE_TOOL);
/** /**
* GdkSeat:display: * GdkSeat:display:
* *
@ -388,3 +432,29 @@ gdk_seat_get_display (GdkSeat *seat)
return priv->display; return priv->display;
} }
void
gdk_seat_tool_added (GdkSeat *seat,
GdkDeviceTool *tool)
{
g_signal_emit (seat, signals[TOOL_ADDED], 0, tool);
}
void
gdk_seat_tool_removed (GdkSeat *seat,
GdkDeviceTool *tool)
{
g_signal_emit (seat, signals[TOOL_REMOVED], 0, tool);
}
GdkDeviceTool *
gdk_seat_get_tool (GdkSeat *seat,
guint64 serial)
{
GdkSeatClass *seat_class;
g_return_val_if_fail (GDK_IS_SEAT (seat), NULL);
seat_class = GDK_SEAT_GET_CLASS (seat);
return seat_class->get_tool (seat, serial);
}

View File

@ -55,6 +55,9 @@ struct _GdkSeatClass
GdkSeatCapabilities capability); GdkSeatCapabilities capability);
GList * (* get_slaves) (GdkSeat *seat, GList * (* get_slaves) (GdkSeat *seat,
GdkSeatCapabilities capabilities); GdkSeatCapabilities capabilities);
GdkDeviceTool * (* get_tool) (GdkSeat *seat,
guint64 serial);
}; };
void gdk_seat_device_added (GdkSeat *seat, void gdk_seat_device_added (GdkSeat *seat,
@ -62,4 +65,13 @@ void gdk_seat_device_added (GdkSeat *seat,
void gdk_seat_device_removed (GdkSeat *seat, void gdk_seat_device_removed (GdkSeat *seat,
GdkDevice *device); GdkDevice *device);
void gdk_seat_tool_added (GdkSeat *seat,
GdkDeviceTool *tool);
void gdk_seat_tool_removed (GdkSeat *seat,
GdkDeviceTool *tool);
GdkDeviceTool *
gdk_seat_get_tool (GdkSeat *seat,
guint64 serial);
#endif /* __GDK_SEAT_PRIVATE_H__ */ #endif /* __GDK_SEAT_PRIVATE_H__ */