mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-26 13:41:07 +00:00
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:
parent
62f1695cb3
commit
4c45022ed0
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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__ */
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user