gdk: Add gdk_seat_get_master_pointers()

Traditionally (and on most backends) there's a single master pointer driven
by all pointing devices. The notable exception is Wayland though, where
master pointing devices are created per capability in the case of
pointer/touch, and one for each drawing tablet.

This function call makes it easy to access all these.

https://bugzilla.gnome.org/show_bug.cgi?id=790920
This commit is contained in:
Carlos Garnacho 2017-11-27 20:21:42 +01:00 committed by Matthias Clasen
parent 62f1695cb3
commit 4c45022ed0
6 changed files with 73 additions and 0 deletions

View File

@ -673,6 +673,7 @@ gdk_seat_get_capabilities
gdk_seat_get_pointer
gdk_seat_get_keyboard
gdk_seat_get_slaves
gdk_seat_get_master_pointers
<SUBSECTION Standard>
GDK_SEAT

View File

@ -458,3 +458,29 @@ gdk_seat_get_tool (GdkSeat *seat,
seat_class = GDK_SEAT_GET_CLASS (seat);
return seat_class->get_tool (seat, serial);
}
/**
* gdk_seat_get_master_pointers:
* @seat: The #GdkSeat
* @capabilities: Queried capabilities
*
* Returns all master pointers with the given capabilities driven by this @seat.
* On most backends this function will return a list with a single element (meaning
* that all input devices drive the same onscreen cursor).
*
* In other backends where there can possibly be multiple foci (eg. wayland),
* this function will return all master #GdkDevices that represent these.
*
* Returns: (transfer container) (element-type GdkDevice): A list
* of master pointing devices
*
* Since: 3.93.
*/
GList *
gdk_seat_get_master_pointers (GdkSeat *seat,
GdkSeatCapabilities capabilities)
{
g_return_val_if_fail (GDK_IS_SEAT (seat), NULL);
return GDK_SEAT_GET_CLASS (seat)->get_master_pointers (seat, capabilities);
}

View File

@ -112,6 +112,10 @@ GdkDevice * gdk_seat_get_pointer (GdkSeat *seat);
GDK_AVAILABLE_IN_3_20
GdkDevice * gdk_seat_get_keyboard (GdkSeat *seat);
GDK_AVAILABLE_IN_3_93
GList * gdk_seat_get_master_pointers (GdkSeat *seat,
GdkSeatCapabilities capabilities);
G_END_DECLS
#endif /* __GDK_SEAT_H__ */

View File

@ -299,6 +299,18 @@ gdk_seat_default_get_tool (GdkSeat *seat,
return NULL;
}
static GList *
gdk_seat_default_get_master_pointers (GdkSeat *seat,
GdkSeatCapabilities capabilities)
{
GList *masters = NULL;
if (capabilities & GDK_SEAT_CAPABILITY_ALL_POINTING)
masters = g_list_prepend (masters, gdk_seat_get_pointer (seat));
return masters;
}
static void
gdk_seat_default_class_init (GdkSeatDefaultClass *klass)
{
@ -314,6 +326,7 @@ gdk_seat_default_class_init (GdkSeatDefaultClass *klass)
seat_class->get_master = gdk_seat_default_get_master;
seat_class->get_slaves = gdk_seat_default_get_slaves;
seat_class->get_master_pointers = gdk_seat_default_get_master_pointers;
seat_class->get_tool = gdk_seat_default_get_tool;
}

View File

@ -58,6 +58,8 @@ struct _GdkSeatClass
GdkDeviceTool * (* get_tool) (GdkSeat *seat,
guint64 serial);
GList * (* get_master_pointers) (GdkSeat *seat,
GdkSeatCapabilities capabilities);
};
void gdk_seat_device_added (GdkSeat *seat,

View File

@ -4714,6 +4714,32 @@ gdk_wayland_seat_get_slaves (GdkSeat *seat,
return slaves;
}
static GList *
gdk_wayland_seat_get_master_pointers (GdkSeat *seat,
GdkSeatCapabilities capabilities)
{
GdkWaylandSeat *wayland_seat = GDK_WAYLAND_SEAT (seat);
GList *masters = NULL;
if (capabilities & GDK_SEAT_CAPABILITY_POINTER)
masters = g_list_prepend (masters, wayland_seat->master_pointer);
if (capabilities & GDK_SEAT_CAPABILITY_TOUCH)
masters = g_list_prepend (masters, wayland_seat->touch_master);
if (capabilities & GDK_SEAT_CAPABILITY_TABLET_STYLUS)
{
GList *l;
for (l = wayland_seat->tablets; l; l = l->next)
{
GdkWaylandTabletData *tablet = l->data;
masters = g_list_prepend (masters, tablet->master);
}
}
return masters;
}
static void
gdk_wayland_seat_class_init (GdkWaylandSeatClass *klass)
{
@ -4727,6 +4753,7 @@ gdk_wayland_seat_class_init (GdkWaylandSeatClass *klass)
seat_class->ungrab = gdk_wayland_seat_ungrab;
seat_class->get_master = gdk_wayland_seat_get_master;
seat_class->get_slaves = gdk_wayland_seat_get_slaves;
seat_class->get_master_pointers = gdk_wayland_seat_get_master_pointers;
}
static void