[gtk+] gdk: Add gdk_seat_get_master_pointers()



commit 4c45022ed0bfeb0219613744c2453c949c254382
Author: Carlos Garnacho <carlosg gnome org>
Date:   Mon Nov 27 20:21:42 2017 +0100

    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

 docs/reference/gdk/gdk4-sections.txt |    1 +
 gdk/gdkseat.c                        |   26 ++++++++++++++++++++++++++
 gdk/gdkseat.h                        |    4 ++++
 gdk/gdkseatdefault.c                 |   13 +++++++++++++
 gdk/gdkseatprivate.h                 |    2 ++
 gdk/wayland/gdkdevice-wayland.c      |   27 +++++++++++++++++++++++++++
 6 files changed, 73 insertions(+), 0 deletions(-)
---
diff --git a/docs/reference/gdk/gdk4-sections.txt b/docs/reference/gdk/gdk4-sections.txt
index bd5d05d..63b09bb 100644
--- a/docs/reference/gdk/gdk4-sections.txt
+++ b/docs/reference/gdk/gdk4-sections.txt
@@ -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
diff --git a/gdk/gdkseat.c b/gdk/gdkseat.c
index a507d45..c224003 100644
--- a/gdk/gdkseat.c
+++ b/gdk/gdkseat.c
@@ -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);
+}
diff --git a/gdk/gdkseat.h b/gdk/gdkseat.h
index b4ce279..f60b93d 100644
--- a/gdk/gdkseat.h
+++ b/gdk/gdkseat.h
@@ -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__ */
diff --git a/gdk/gdkseatdefault.c b/gdk/gdkseatdefault.c
index 32a441f..bf3f410 100644
--- a/gdk/gdkseatdefault.c
+++ b/gdk/gdkseatdefault.c
@@ -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;
 }
diff --git a/gdk/gdkseatprivate.h b/gdk/gdkseatprivate.h
index bd66f68..22cdd08 100644
--- a/gdk/gdkseatprivate.h
+++ b/gdk/gdkseatprivate.h
@@ -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,
diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c
index 5b067bf..02f9418 100644
--- a/gdk/wayland/gdkdevice-wayland.c
+++ b/gdk/wayland/gdkdevice-wayland.c
@@ -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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]