[gtk/wip/chergert/quartz4u] move native property into surface



commit 990592313ab474cf027660c0268da4f057e8af27
Author: Christian Hergert <chergert redhat com>
Date:   Tue Apr 28 18:04:25 2020 -0700

    move native property into surface

 gdk/macos/gdkmacossurface-private.h |   3 +-
 gdk/macos/gdkmacossurface.c         | 103 +++++++++++++++++++++++++++++++++---
 gdk/macos/gdkmacostoplevelsurface.c |  63 ++++------------------
 3 files changed, 108 insertions(+), 61 deletions(-)
---
diff --git a/gdk/macos/gdkmacossurface-private.h b/gdk/macos/gdkmacossurface-private.h
index 22d8a7f6f1..15f9f39719 100644
--- a/gdk/macos/gdkmacossurface-private.h
+++ b/gdk/macos/gdkmacossurface-private.h
@@ -41,8 +41,6 @@ struct _GdkMacosSurface
 struct _GdkMacosSurfaceClass
 {
   GdkSurfaceClass parent_class;
-
-  CGDirectDisplayID (*get_screen_id) (GdkMacosSurface *self);
 };
 
 GdkMacosSurface   *_gdk_macos_surface_new            (GdkMacosDisplay *display,
@@ -52,6 +50,7 @@ GdkMacosSurface   *_gdk_macos_surface_new            (GdkMacosDisplay *display,
                                                       int              y,
                                                       int              width,
                                                       int              height);
+NSWindow          *_gdk_macos_surface_get_native     (GdkMacosSurface *self);
 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,
diff --git a/gdk/macos/gdkmacossurface.c b/gdk/macos/gdkmacossurface.c
index b850191937..dbc6c0a9f1 100644
--- a/gdk/macos/gdkmacossurface.c
+++ b/gdk/macos/gdkmacossurface.c
@@ -22,6 +22,8 @@
 #include <AppKit/AppKit.h>
 #include <gdk/gdk.h>
 
+#import "GdkMacosWindow.h"
+
 #include "gdkframeclockidleprivate.h"
 #include "gdksurfaceprivate.h"
 
@@ -29,9 +31,12 @@
 #include "gdkmacospopupsurface-private.h"
 #include "gdkmacossurface-private.h"
 #include "gdkmacostoplevelsurface-private.h"
+#include "gdkmacosutils-private.h"
 
 typedef struct
 {
+  GdkMacosWindow *window;
+
   char *title;
 
   gint shadow_top;
@@ -44,6 +49,14 @@ typedef struct
 
 G_DEFINE_TYPE_WITH_PRIVATE (GdkMacosSurface, gdk_macos_surface, GDK_TYPE_SURFACE)
 
+enum {
+  PROP_0,
+  PROP_NATIVE,
+  LAST_PROP
+};
+
+static GParamSpec *properties [LAST_PROP];
+
 static void
 gdk_macos_surface_set_input_region (GdkSurface     *surface,
                                     cairo_region_t *region)
@@ -54,14 +67,64 @@ gdk_macos_surface_set_input_region (GdkSurface     *surface,
 }
 
 static void
-gdk_macos_surface_finalize (GObject *object)
+gdk_macos_surface_destroy (GdkSurface *surface,
+                           gboolean    foreign_destroy)
 {
-  GdkMacosSurface *self = (GdkMacosSurface *)object;
+  GDK_BEGIN_MACOS_ALLOC_POOL;
+
+  GdkMacosSurface *self = (GdkMacosSurface *)surface;
   GdkMacosSurfacePrivate *priv = gdk_macos_surface_get_instance_private (self);
+  GdkMacosWindow *window = g_steal_pointer (&priv->window);
 
   g_clear_pointer (&priv->title, g_free);
 
-  G_OBJECT_CLASS (gdk_macos_surface_parent_class)->finalize (object);
+  if (window != NULL)
+    [window close];
+
+  GDK_SURFACE_CLASS (gdk_macos_surface_parent_class)->destroy (surface, foreign_destroy);
+
+  GDK_END_MACOS_ALLOC_POOL;
+}
+
+
+static void
+gdk_macos_surface_get_property (GObject    *object,
+                                guint       prop_id,
+                                GValue     *value,
+                                GParamSpec *pspec)
+{
+  GdkMacosSurface *self = GDK_MACOS_SURFACE (object);
+  GdkMacosSurfacePrivate *priv = gdk_macos_surface_get_instance_private (self);
+
+  switch (prop_id)
+    {
+    case PROP_NATIVE:
+      g_value_set_pointer (value, priv->window);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+gdk_macos_surface_set_property (GObject      *object,
+                                guint         prop_id,
+                                const GValue *value,
+                                GParamSpec   *pspec)
+{
+  GdkMacosSurface *self = GDK_MACOS_SURFACE (object);
+  GdkMacosSurfacePrivate *priv = gdk_macos_surface_get_instance_private (self);
+
+  switch (prop_id)
+    {
+    case PROP_NATIVE:
+      priv->window = g_value_get_pointer (value);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
 }
 
 static void
@@ -70,9 +133,19 @@ gdk_macos_surface_class_init (GdkMacosSurfaceClass *klass)
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GdkSurfaceClass *surface_class = GDK_SURFACE_CLASS (klass);
 
-  object_class->finalize = gdk_macos_surface_finalize;
+  object_class->get_property = gdk_macos_surface_get_property;
+  object_class->set_property = gdk_macos_surface_set_property;
 
+  surface_class->destroy = gdk_macos_surface_destroy;
   surface_class->set_input_region = gdk_macos_surface_set_input_region;
+
+  properties [PROP_NATIVE] =
+    g_param_spec_pointer ("native",
+                          "Native",
+                          "The native NSWindow",
+                          G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+
+  g_object_class_install_properties (object_class, LAST_PROP, properties);
 }
 
 static void
@@ -192,7 +265,25 @@ _gdk_macos_surface_set_modal_hint (GdkMacosSurface *self,
 CGDirectDisplayID
 _gdk_macos_surface_get_screen_id (GdkMacosSurface *self)
 {
-  g_return_val_if_fail (GDK_IS_MACOS_SURFACE (self), 0);
+  GdkMacosSurfacePrivate *priv = gdk_macos_surface_get_instance_private (self);
+
+  g_return_val_if_fail (GDK_IS_MACOS_SURFACE (self), (CGDirectDisplayID)-1);
+
+  if (priv->window != NULL)
+    {
+      NSScreen *screen = [priv->window screen];
+      return [[[screen deviceDescription] objectForKey:@"NSScreenNumber"] unsignedIntValue];
+    }
+
+  return (CGDirectDisplayID)-1;
+}
+
+NSWindow *
+_gdk_macos_surface_get_native (GdkMacosSurface *self)
+{
+  GdkMacosSurfacePrivate *priv = gdk_macos_surface_get_instance_private (self);
+
+  g_return_val_if_fail (GDK_IS_MACOS_SURFACE (self), NULL);
 
-  return GDK_MACOS_SURFACE_GET_CLASS (self)->get_screen_id (self);
+  return (NSWindow *)priv->window;
 }
diff --git a/gdk/macos/gdkmacostoplevelsurface.c b/gdk/macos/gdkmacostoplevelsurface.c
index 51e9bdb3e3..50143b3444 100644
--- a/gdk/macos/gdkmacostoplevelsurface.c
+++ b/gdk/macos/gdkmacostoplevelsurface.c
@@ -32,7 +32,6 @@ struct _GdkMacosToplevelSurface
   GdkMacosSurface  parent_instance;
 
   GdkMacosSurface *transient_for;
-  GdkMacosWindow  *window;
 
   guint            decorated : 1;
 };
@@ -49,7 +48,8 @@ _gdk_macos_toplevel_surface_present (GdkToplevel       *toplevel,
                                      GdkToplevelLayout *layout)
 {
   GdkMacosToplevelSurface *self = (GdkMacosToplevelSurface *)toplevel;
-  [self->window makeKeyAndOrderFront:self->window];
+  NSWindow *window = _gdk_macos_surface_get_native (GDK_MACOS_SURFACE (self));
+  [window makeKeyAndOrderFront:window];
   return TRUE;
 }
 
@@ -57,7 +57,8 @@ static gboolean
 _gdk_macos_toplevel_surface_minimize (GdkToplevel *toplevel)
 {
   GdkMacosToplevelSurface *self = (GdkMacosToplevelSurface *)toplevel;
-  [self->window miniaturize:self->window];
+  NSWindow *window = _gdk_macos_surface_get_native (GDK_MACOS_SURFACE (self));
+  [window miniaturize:window];
   return TRUE;
 }
 
@@ -65,7 +66,8 @@ static gboolean
 _gdk_macos_toplevel_surface_lower (GdkToplevel *toplevel)
 {
   GdkMacosToplevelSurface *self = (GdkMacosToplevelSurface *)toplevel;
-  [self->window orderBack:self->window];
+  NSWindow *window = _gdk_macos_surface_get_native (GDK_MACOS_SURFACE (self));
+  [window orderBack:window];
   return TRUE;
 }
 
@@ -74,7 +76,8 @@ _gdk_macos_toplevel_surface_focus (GdkToplevel *toplevel,
                                    guint32      timestamp)
 {
   GdkMacosToplevelSurface *self = (GdkMacosToplevelSurface *)toplevel;
-  [self->window makeKeyAndOrderFront:self->window];
+  NSWindow *window = _gdk_macos_surface_get_native (GDK_MACOS_SURFACE (self));
+  [window makeKeyAndOrderFront:window];
 }
 
 static void
@@ -91,26 +94,9 @@ G_DEFINE_TYPE_WITH_CODE (GdkMacosToplevelSurface, _gdk_macos_toplevel_surface, G
 
 enum {
   PROP_0,
-  PROP_NATIVE,
   LAST_PROP
 };
 
-static GParamSpec *properties [LAST_PROP];
-
-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)
@@ -131,8 +117,9 @@ _gdk_macos_toplevel_surface_set_decorated (GdkMacosToplevelSurface *self,
 
   if (decorated != self->decorated)
     {
+      NSWindow *window = _gdk_macos_surface_get_native (GDK_MACOS_SURFACE (self));
       self->decorated = decorated;
-      [self->window setHasShadow:decorated ? YES : NO];
+      [window setHasShadow:decorated ? YES : NO];
     }
 }
 
@@ -142,18 +129,6 @@ _gdk_macos_toplevel_surface_destroy (GdkSurface *surface,
 {
   GdkMacosToplevelSurface *self = (GdkMacosToplevelSurface *)surface;
 
-  if (self->window != NULL)
-    {
-      GDK_BEGIN_MACOS_ALLOC_POOL;
-
-      GdkMacosWindow *window = g_steal_pointer (&self->window);
-
-      if (window != NULL)
-        [window close];
-
-      GDK_END_MACOS_ALLOC_POOL;
-    }
-
   g_clear_object (&self->transient_for);
 
   GDK_SURFACE_CLASS (_gdk_macos_toplevel_surface_parent_class)->destroy (surface, foreign_destroy);
@@ -180,10 +155,6 @@ _gdk_macos_toplevel_surface_get_property (GObject    *object,
 
   switch (prop_id)
     {
-    case PROP_NATIVE:
-      g_value_set_pointer (value, toplevel->window);
-      break;
-
     case LAST_PROP + GDK_TOPLEVEL_PROP_STATE:
       g_value_set_flags (value, surface->state);
       break;
@@ -241,10 +212,6 @@ _gdk_macos_toplevel_surface_set_property (GObject      *object,
 
   switch (prop_id)
     {
-    case PROP_NATIVE:
-      toplevel->window = g_value_get_pointer (value);
-      break;
-
     case LAST_PROP + GDK_TOPLEVEL_PROP_TITLE:
       _gdk_macos_surface_set_title (base, g_value_get_string (value));
       g_object_notify_by_pspec (G_OBJECT (surface), pspec);
@@ -300,17 +267,7 @@ _gdk_macos_toplevel_surface_class_init (GdkMacosToplevelSurfaceClass *klass)
 
   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);
-
-  properties [PROP_NATIVE] =
-    g_param_spec_pointer ("native",
-                          "Native",
-                          "The native NSWindow",
-                          G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
-
-  g_object_class_install_properties (object_class, LAST_PROP, properties);
 }
 
 static void


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