gdk: Add gdk_display_get_monitors()
authorBenjamin Otte <otte@redhat.com>
Wed, 13 May 2020 05:00:35 +0000 (07:00 +0200)
committerBenjamin Otte <otte@redhat.com>
Wed, 13 May 2020 05:00:35 +0000 (07:00 +0200)
Returns a GListModel of GDK_TYPE_MONITOR.

This will replace the current andling of monitors in GdkDisplay.

docs/reference/gdk/gdk4-sections.txt
gdk/broadway/gdkdisplay-broadway.c
gdk/broadway/gdkdisplay-broadway.h
gdk/gdkdisplay.c
gdk/gdkdisplay.h
gdk/gdkdisplayprivate.h
gdk/wayland/gdkdisplay-wayland.c
gdk/win32/gdkdisplay-win32.c
gdk/x11/gdkdisplay-x11.c

index b753ee9ece158dddae72061a6b0e92ca242eda7d..19ac368ccfad8f9ea016f816460fb4f05dd94886 100644 (file)
@@ -94,6 +94,7 @@ gdk_display_get_default_seat
 gdk_display_list_seats
 gdk_display_get_n_monitors
 gdk_display_get_monitor
+gdk_display_get_monitors
 gdk_display_get_monitor_at_surface
 gdk_display_get_clipboard
 gdk_display_get_primary_clipboard
index 0a507dc3ae83127a4f70c8df70ab5ddc5dcf1a05..049670181b36fc9944a02cb61b7a688f140addcd 100644 (file)
@@ -243,13 +243,18 @@ gdk_broadway_display_get_default_group (GdkDisplay *display)
 static void
 gdk_broadway_display_dispose (GObject *object)
 {
-  GdkBroadwayDisplay *broadway_display = GDK_BROADWAY_DISPLAY (object);
+  GdkBroadwayDisplay *self = GDK_BROADWAY_DISPLAY (object);
 
-  if (broadway_display->event_source)
+  if (self->event_source)
+    {
+      g_source_destroy (self->event_source);
+      g_source_unref (self->event_source);
+      self->event_source = NULL;
+    }
+  if (self->monitors)
     {
-      g_source_destroy (broadway_display->event_source);
-      g_source_unref (broadway_display->event_source);
-      broadway_display->event_source = NULL;
+      g_list_store_remove_all (self->monitors);
+      g_clear_object (&self->monitors);
     }
 
   G_OBJECT_CLASS (gdk_broadway_display_parent_class)->dispose (object);
@@ -332,6 +337,20 @@ gdk_broadway_display_get_monitor (GdkDisplay *display,
   return NULL;
 }
 
+static GListModel *
+gdk_broadway_display_get_monitors (GdkDisplay *display)
+{
+  GdkBroadwayDisplay *self = GDK_BROADWAY_DISPLAY (display);
+
+  if (self->monitors == NULL)
+    {
+      self->monitors = g_list_store_new (GDK_TYPE_MONITOR);
+      g_list_store_append (self->monitors, self->monitor);
+    }
+
+  return G_LIST_MODEL (self->monitors);
+}
+
 static gboolean
 gdk_broadway_display_get_setting (GdkDisplay *display,
                                   const char *name,
@@ -430,5 +449,6 @@ gdk_broadway_display_class_init (GdkBroadwayDisplayClass * class)
 
   display_class->get_n_monitors = gdk_broadway_display_get_n_monitors;
   display_class->get_monitor = gdk_broadway_display_get_monitor;
+  display_class->get_monitors = gdk_broadway_display_get_monitors;
   display_class->get_setting = gdk_broadway_display_get_setting;
 }
index b8e11168ef1980be3c8a053009f7eb172d2539b1..0a2f1c91a527b5239294e7ef815657c86886370e 100644 (file)
@@ -52,6 +52,7 @@ struct _GdkBroadwayDisplay
   GdkBroadwayServer *server;
   gpointer move_resize_data;
 
+  GListStore *monitors;
   GdkMonitor *monitor;
   int scale_factor;
 
index 88e5057e65900bc15b2ed9bb576d472b3ba8582a..a072e3f23f0f1c426c61f7185962608d66e4ee17 100644 (file)
@@ -1569,6 +1569,28 @@ gdk_display_get_monitor (GdkDisplay *display,
   return GDK_DISPLAY_GET_CLASS (display)->get_monitor (display, monitor_num);
 }
 
+/**
+ * gdk_display_get_monitors:
+ * @display: a #GdkDisplay
+ *
+ * Gets the list of monitors associated with this display.
+ *
+ * Subsequent calls to this function will always return the same list for the
+ * same display.
+ *
+ * You can listen to the GListModel::items-changed signal on this list
+ * to monitor changes to the monitor of this display.
+ *
+ * Returns: (transfer none): a #GListModel of #GdkMonitor
+ */
+GListModel *
+gdk_display_get_monitors (GdkDisplay *self)
+{
+  g_return_val_if_fail (GDK_IS_DISPLAY (self), NULL);
+
+  return GDK_DISPLAY_GET_CLASS (self)->get_monitors (self);
+}
+
 /**
  * gdk_display_get_monitor_at_surface:
  * @display: a #GdkDisplay
index bb421f405de6e8d8d9122bbf103c6d6c4acdc317..26918478c25d130fcc97deb79b2e1c5689ad235b 100644 (file)
@@ -112,6 +112,8 @@ GDK_AVAILABLE_IN_ALL
 GdkMonitor * gdk_display_get_monitor           (GdkDisplay *display,
                                                 int         monitor_num);
 GDK_AVAILABLE_IN_ALL
+GListModel * gdk_display_get_monitors          (GdkDisplay *self) G_GNUC_PURE;
+GDK_AVAILABLE_IN_ALL
 GdkMonitor * gdk_display_get_monitor_at_surface (GdkDisplay *display,
                                                 GdkSurface  *surface);
 
index a6afeaa50a58c8b1b8baaa40d1b5efa17151c169..25d1f697ff3c47ac9b5c544bd22eb8b7d136a9b8 100644 (file)
@@ -158,7 +158,8 @@ struct _GdkDisplayClass
   int                    (*get_n_monitors)             (GdkDisplay     *display);
   GdkMonitor *           (*get_monitor)                (GdkDisplay     *display,
                                                         int             index);
-  GdkMonitor *           (*get_monitor_at_surface)      (GdkDisplay     *display,
+  GListModel *           (*get_monitors)               (GdkDisplay     *self);
+  GdkMonitor *           (*get_monitor_at_surface)     (GdkDisplay     *display,
                                                         GdkSurface      *surface);
   gboolean               (*get_setting)                (GdkDisplay     *display,
                                                         const char     *name,
index f052a0069ef3e98e2d9d692b34365a48cdd7c128..b3ffe0060f63b83fd553dae929b4e0bf748c0901 100644 (file)
@@ -977,6 +977,14 @@ gdk_wayland_display_get_monitor (GdkDisplay *display,
   return monitor;
 }
 
+static GListModel *
+gdk_wayland_display_get_monitors (GdkDisplay *display)
+{
+  GdkWaylandDisplay *self = GDK_WAYLAND_DISPLAY (display);
+
+  return G_LIST_MODEL (self->monitors);
+}
+
 static GdkMonitor *
 gdk_wayland_display_get_monitor_at_surface (GdkDisplay *display,
                                            GdkSurface  *window)
@@ -1046,6 +1054,7 @@ gdk_wayland_display_class_init (GdkWaylandDisplayClass *class)
 
   display_class->get_n_monitors = gdk_wayland_display_get_n_monitors;
   display_class->get_monitor = gdk_wayland_display_get_monitor;
+  display_class->get_monitors = gdk_wayland_display_get_monitors;
   display_class->get_monitor_at_surface = gdk_wayland_display_get_monitor_at_surface;
   display_class->get_setting = gdk_wayland_display_get_setting;
   display_class->set_cursor_theme = gdk_wayland_display_set_cursor_theme;
index 8861f6928bee00b25efd56c35d8c01d784cd8aaf..4898dce1ef1f6a4d660f835cd1b30ab5f21a321e 100644 (file)
@@ -990,6 +990,14 @@ gdk_win32_display_get_primary_monitor (GdkDisplay *display)
   return gdk_win32_display_get_monitor (display, 0);
 }
 
+static GListModel *
+gdk_win32_display_get_monitors (GdkDisplay *display)
+{
+  GdkWin32Display *self = GDK_WIN32_DISPLAY (display);
+
+  return self->monitors;
+}
+
 guint
 _gdk_win32_display_get_monitor_scale_factor (GdkWin32Display *win32_display,
                                              HMONITOR         hmonitor,
@@ -1114,6 +1122,7 @@ gdk_win32_display_class_init (GdkWin32DisplayClass *klass)
 
   display_class->get_n_monitors = gdk_win32_display_get_n_monitors;
   display_class->get_monitor = gdk_win32_display_get_monitor;
+  display_class->get_monitors = gdk_win32_display_get_monitors;
 
 #ifdef GDK_RENDERING_VULKAN
   display_class->vk_context_type = GDK_TYPE_WIN32_VULKAN_CONTEXT;
index 73737984b3363d11461fd3983ab3367235e8193a..203feadcf527893d50efd769de7a56ea5b302de0 100644 (file)
@@ -2923,6 +2923,14 @@ gdk_x11_display_get_monitor (GdkDisplay *display,
   return NULL;
 }
 
+static GListModel *
+gdk_x11_display_get_monitors (GdkDisplay *display)
+{
+  GdkX11Display *self = GDK_X11_DISPLAY (display);
+
+  return G_LIST_MODEL (self->monitors);
+}
+
 /**
  * gdk_x11_display_get_primary_monitor:
  * @self: a #GdkDisplay
@@ -3045,6 +3053,7 @@ gdk_x11_display_class_init (GdkX11DisplayClass * class)
 
   display_class->get_n_monitors = gdk_x11_display_get_n_monitors;
   display_class->get_monitor = gdk_x11_display_get_monitor;
+  display_class->get_monitors = gdk_x11_display_get_monitors;
   display_class->get_setting = gdk_x11_display_get_setting;
   display_class->set_cursor_theme = gdk_x11_display_set_cursor_theme;