[gtk/wip/chergert/quartz4u] find monitor for the surface



commit 7fd3cb502bb266a7b6f3312deed0995a1f056aa4
Author: Christian Hergert <chergert redhat com>
Date:   Mon Apr 27 17:16:11 2020 -0700

    find monitor for the surface

 gdk/macos/gdkmacosdisplay.c         | 24 ++++++++++++++++++++
 gdk/macos/gdkmacosmonitor-private.h |  5 +++--
 gdk/macos/gdkmacosmonitor.c         | 18 +++++++++++++--
 gdk/macos/gdkmacossurface-private.h | 45 ++++++++++++++++++++++---------------
 gdk/macos/gdkmacossurface.c         |  8 +++++++
 gdk/macos/gdkmacostoplevelsurface.c | 17 ++++++++++++++
 6 files changed, 95 insertions(+), 22 deletions(-)
---
diff --git a/gdk/macos/gdkmacosdisplay.c b/gdk/macos/gdkmacosdisplay.c
index 660f34ed66..b60a08b5f6 100644
--- a/gdk/macos/gdkmacosdisplay.c
+++ b/gdk/macos/gdkmacosdisplay.c
@@ -123,6 +123,29 @@ gdk_macos_display_get_primary_monitor (GdkDisplay *display)
   return g_ptr_array_index (self->monitors, 0);
 }
 
+static GdkMonitor *
+gdk_macos_display_get_monitor_at_surface (GdkDisplay *display,
+                                          GdkSurface *surface)
+{
+  GdkMacosDisplay *self = (GdkMacosDisplay *)display;
+  CGDirectDisplayID screen_id;
+
+  g_assert (GDK_IS_MACOS_DISPLAY (self));
+  g_assert (GDK_IS_MACOS_SURFACE (surface));
+
+  screen_id = _gdk_macos_surface_get_screen_id (GDK_MACOS_SURFACE (surface));
+
+  for (guint i = 0; i < self->monitors->len; i++)
+    {
+      GdkMacosMonitor *monitor = g_ptr_array_index (self->monitors, i);
+
+      if (screen_id == _gdk_macos_monitor_get_screen_id (monitor))
+        return GDK_MONITOR (monitor);
+    }
+
+  return gdk_macos_display_get_primary_monitor (display);
+}
+
 static void
 gdk_macos_display_add_monitor (GdkMacosDisplay *self,
                                GdkMacosMonitor *monitor)
@@ -331,6 +354,7 @@ gdk_macos_display_class_init (GdkMacosDisplayClass *klass)
   display_class->flush = gdk_macos_display_flush;
   display_class->get_keymap = gdk_macos_display_get_keymap;
   display_class->get_monitor = gdk_macos_display_get_monitor;
+  display_class->get_monitor_at_surface = gdk_macos_display_get_monitor_at_surface;
   display_class->get_next_serial = gdk_macos_display_get_next_serial;
   display_class->get_n_monitors = gdk_macos_display_get_n_monitors;
   display_class->get_name = gdk_macos_display_get_name;
diff --git a/gdk/macos/gdkmacosmonitor-private.h b/gdk/macos/gdkmacosmonitor-private.h
index 7eb24819f4..8e65e73c3d 100644
--- a/gdk/macos/gdkmacosmonitor-private.h
+++ b/gdk/macos/gdkmacosmonitor-private.h
@@ -29,8 +29,9 @@
 
 G_BEGIN_DECLS
 
-GdkMacosMonitor *_gdk_macos_monitor_new (GdkMacosDisplay   *display,
-                                         CGDirectDisplayID  monitor_id);
+GdkMacosMonitor   *_gdk_macos_monitor_new           (GdkMacosDisplay   *display,
+                                                     CGDirectDisplayID  screen_id);
+CGDirectDisplayID  _gdk_macos_monitor_get_screen_id (GdkMacosMonitor   *self);
 
 G_END_DECLS
 
diff --git a/gdk/macos/gdkmacosmonitor.c b/gdk/macos/gdkmacosmonitor.c
index 652c400696..3b98691695 100644
--- a/gdk/macos/gdkmacosmonitor.c
+++ b/gdk/macos/gdkmacosmonitor.c
@@ -25,7 +25,8 @@
 
 struct _GdkMacosMonitor
 {
-  GdkMonitor parent_instance;
+  GdkMonitor        parent_instance;
+  CGDirectDisplayID screen_id;
 };
 
 struct _GdkMacosMonitorClass
@@ -60,9 +61,22 @@ GdkMacosMonitor *
 _gdk_macos_monitor_new (GdkMacosDisplay   *display,
                         CGDirectDisplayID  screen_id)
 {
+  GdkMacosMonitor *self;
+
   g_return_val_if_fail (GDK_IS_MACOS_DISPLAY (display), NULL);
 
-  return g_object_new (GDK_TYPE_MACOS_MONITOR,
+  self = g_object_new (GDK_TYPE_MACOS_MONITOR,
                        "display", display,
                        NULL);
+  self->screen_id = screen_id;
+
+  return g_steal_pointer (&self);
+}
+
+CGDirectDisplayID
+_gdk_macos_monitor_get_screen_id (GdkMacosMonitor *self)
+{
+  g_return_val_if_fail (GDK_IS_MACOS_MONITOR (self), 0);
+
+  return self->screen_id;
 }
diff --git a/gdk/macos/gdkmacossurface-private.h b/gdk/macos/gdkmacossurface-private.h
index 01b5a6bdfb..22d8a7f6f1 100644
--- a/gdk/macos/gdkmacossurface-private.h
+++ b/gdk/macos/gdkmacossurface-private.h
@@ -20,6 +20,8 @@
 #ifndef __GDK_MACOS_SURFACE_PRIVATE_H__
 #define __GDK_MACOS_SURFACE_PRIVATE_H__
 
+#include <AppKit/AppKit.h>
+
 #include "gdksurfaceprivate.h"
 
 #include "gdkmacosdisplay.h"
@@ -27,6 +29,10 @@
 
 G_BEGIN_DECLS
 
+#define GDK_MACOS_SURFACE_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_MACOS_SURFACE, 
GdkMacosSurfaceClass))
+#define GDK_IS_MACOS_SURFACE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_MACOS_SURFACE))
+#define GDK_MACOS_SURFACE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_MACOS_SURFACE, 
GdkMacosSurfaceClass))
+
 struct _GdkMacosSurface
 {
   GdkSurface parent_instance;
@@ -35,26 +41,29 @@ struct _GdkMacosSurface
 struct _GdkMacosSurfaceClass
 {
   GdkSurfaceClass parent_class;
+
+  CGDirectDisplayID (*get_screen_id) (GdkMacosSurface *self);
 };
 
-GdkMacosSurface *_gdk_macos_surface_new            (GdkMacosDisplay *display,
-                                                    GdkSurfaceType   surface_type,
-                                                    GdkSurface      *parent,
-                                                    int              x,
-                                                    int              y,
-                                                    int              width,
-                                                    int              height);
-const char      *_gdk_macos_surface_get_title      (GdkMacosSurface *self);
-void             _gdk_macos_surface_set_title      (GdkMacosSurface *self,
-                                                    const gchar     *title);
-void             _gdk_macos_surface_get_shadow     (GdkMacosSurface *self,
-                                                    gint            *top,
-                                                    gint            *right,
-                                                    gint            *bottom,
-                                                    gint            *left);
-gboolean         _gdk_macos_surface_get_modal_hint (GdkMacosSurface *self);
-void             _gdk_macos_surface_set_modal_hint (GdkMacosSurface *self,
-                                                    gboolean         modal_hint);
+GdkMacosSurface   *_gdk_macos_surface_new            (GdkMacosDisplay *display,
+                                                      GdkSurfaceType   surface_type,
+                                                      GdkSurface      *parent,
+                                                      int              x,
+                                                      int              y,
+                                                      int              width,
+                                                      int              height);
+CGDirectDisplayID  _gdk_macos_surface_get_screen_id  (GdkMacosSurface *self);
+const char        *_gdk_macos_surface_get_title      (GdkMacosSurface *self);
+void               _gdk_macos_surface_set_title      (GdkMacosSurface *self,
+                                                      const gchar     *title);
+void               _gdk_macos_surface_get_shadow     (GdkMacosSurface *self,
+                                                      gint            *top,
+                                                      gint            *right,
+                                                      gint            *bottom,
+                                                      gint            *left);
+gboolean           _gdk_macos_surface_get_modal_hint (GdkMacosSurface *self);
+void               _gdk_macos_surface_set_modal_hint (GdkMacosSurface *self,
+                                                      gboolean         modal_hint);
 
 G_END_DECLS
 
diff --git a/gdk/macos/gdkmacossurface.c b/gdk/macos/gdkmacossurface.c
index d7bdaf8d9a..ddf0ce3520 100644
--- a/gdk/macos/gdkmacossurface.c
+++ b/gdk/macos/gdkmacossurface.c
@@ -171,3 +171,11 @@ _gdk_macos_surface_set_modal_hint (GdkMacosSurface *self,
 
   priv->modal_hint = !!modal_hint;
 }
+
+CGDirectDisplayID
+_gdk_macos_surface_get_screen_id (GdkMacosSurface *self)
+{
+  g_return_val_if_fail (GDK_IS_MACOS_SURFACE (self), 0);
+
+  return GDK_MACOS_SURFACE_GET_CLASS (self)->get_screen_id (self);
+}
diff --git a/gdk/macos/gdkmacostoplevelsurface.c b/gdk/macos/gdkmacostoplevelsurface.c
index f2c691fd7b..479cf38112 100644
--- a/gdk/macos/gdkmacostoplevelsurface.c
+++ b/gdk/macos/gdkmacostoplevelsurface.c
@@ -53,6 +53,20 @@ enum {
 G_DEFINE_TYPE_WITH_CODE (GdkMacosToplevelSurface, _gdk_macos_toplevel_surface, GDK_TYPE_MACOS_SURFACE,
                          G_IMPLEMENT_INTERFACE (GDK_TYPE_TOPLEVEL, toplevel_iface_init))
 
+static CGDirectDisplayID
+_gdk_macos_toplevel_surface_get_screen_id (GdkMacosSurface *base)
+{
+  GdkMacosToplevelSurface *self = (GdkMacosToplevelSurface *)base;
+
+  if (self->window != NULL)
+    {
+      NSScreen *screen = [self->window screen];
+      return [[[screen deviceDescription] objectForKey:@"NSScreenNumber"] unsignedIntValue];
+    }
+
+  return 0;
+}
+
 static void
 _gdk_macos_toplevel_surface_set_transient_for (GdkMacosToplevelSurface *self,
                                                GdkMacosSurface         *parent)
@@ -217,12 +231,15 @@ _gdk_macos_toplevel_surface_class_init (GdkMacosToplevelSurfaceClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GdkSurfaceClass *surface_class = GDK_SURFACE_CLASS (klass);
+  GdkMacosSurfaceClass *base_class = GDK_MACOS_SURFACE_CLASS (klass);
 
   object_class->get_property = _gdk_macos_toplevel_surface_get_property;
   object_class->set_property = _gdk_macos_toplevel_surface_set_property;
 
   surface_class->destroy = _gdk_macos_toplevel_surface_destroy;
 
+  base_class->get_screen_id = _gdk_macos_toplevel_surface_get_screen_id;
+
   gdk_toplevel_install_properties (object_class, LAST_PROP);
 }
 


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