[gtk/wip/chergert/quartz4u] start on some toplevel API for macos surface



commit 8da252870a4e1f277bd8a6ddd6242f81c3d8dc13
Author: Christian Hergert <chergert redhat com>
Date:   Tue Apr 28 17:13:10 2020 -0700

    start on some toplevel API for macos surface

 gdk/macos/.gdkmacostoplevelsurface.c.swp | Bin 0 -> 24576 bytes
 gdk/macos/gdkmacosdisplay-private.h      |  14 +++-
 gdk/macos/gdkmacosdisplay.c              |  66 +++++++++++++++++-
 gdk/macos/gdkmacostoplevelsurface.c      | 114 +++++++++++++++++++++++++++++--
 4 files changed, 187 insertions(+), 7 deletions(-)
---
diff --git a/gdk/macos/.gdkmacostoplevelsurface.c.swp b/gdk/macos/.gdkmacostoplevelsurface.c.swp
new file mode 100644
index 0000000000..3c172289b8
Binary files /dev/null and b/gdk/macos/.gdkmacostoplevelsurface.c.swp differ
diff --git a/gdk/macos/gdkmacosdisplay-private.h b/gdk/macos/gdkmacosdisplay-private.h
index 6d6ac06332..f203925764 100644
--- a/gdk/macos/gdkmacosdisplay-private.h
+++ b/gdk/macos/gdkmacosdisplay-private.h
@@ -20,12 +20,22 @@
 #ifndef __GDK_MACOS_DISPLAY_PRIVATE_H__
 #define __GDK_MACOS_DISPLAY_PRIVATE_H__
 
+#include <AppKit/AppKit.h>
+
 #include "gdkmacosdisplay.h"
 
 G_BEGIN_DECLS
 
-GdkDisplay *_gdk_macos_display_open   (const gchar     *display_name);
-int         _gdk_macos_display_get_fd (GdkMacosDisplay *self);
+GdkDisplay *_gdk_macos_display_open                         (const gchar     *display_name);
+int         _gdk_macos_display_get_fd                       (GdkMacosDisplay *self);
+void        _gdk_macos_display_to_display_coords            (GdkMacosDisplay *self,
+                                                             int              x,
+                                                             int              y,
+                                                             int             *out_x,
+                                                             int             *out_y);
+NSScreen   *_gdk_macos_display_get_screen_at_display_coords (GdkMacosDisplay *self,
+                                                             int              x,
+                                                             int              y);
 
 G_END_DECLS
 
diff --git a/gdk/macos/gdkmacosdisplay.c b/gdk/macos/gdkmacosdisplay.c
index b60a08b5f6..0c09155a7d 100644
--- a/gdk/macos/gdkmacosdisplay.c
+++ b/gdk/macos/gdkmacosdisplay.c
@@ -70,9 +70,14 @@ struct _GdkMacosDisplay
 {
   GdkDisplay           parent_instance;
 
-  gchar               *name;
+  char                *name;
   GPtrArray           *monitors;
   GdkMacosKeymap      *keymap;
+
+  int                  width;
+  int                  height;
+  int                  min_x;
+  int                  min_y;
 };
 
 struct _GdkMacosDisplayClass
@@ -178,6 +183,8 @@ gdk_macos_display_load_monitors (GdkMacosDisplay *self)
   GDK_BEGIN_MACOS_ALLOC_POOL;
 
   NSArray *screens;
+  int max_x = 0;
+  int max_y = 0;
 
   g_assert (GDK_IS_MACOS_DISPLAY (self));
 
@@ -187,6 +194,13 @@ gdk_macos_display_load_monitors (GdkMacosDisplay *self)
     {
       CGDirectDisplayID screen_id;
       GdkMacosMonitor *monitor;
+      NSRect geom;
+
+      geom = [obj frame];
+      self->min_x = MIN (self->min_x, geom.origin.x);
+      self->min_y = MIN (self->min_y, geom.origin.y);
+      max_x = MAX (max_x, geom.origin.x + geom.size.width);
+      max_y = MAX (max_y, geom.origin.y + geom.size.height);
 
       screen_id = [[[obj deviceDescription] objectForKey:@"NSScreenNumber"] unsignedIntValue];
       monitor = _gdk_macos_monitor_new (self, screen_id);
@@ -196,6 +210,9 @@ gdk_macos_display_load_monitors (GdkMacosDisplay *self)
       g_object_unref (monitor);
     }
 
+  self->width = max_x - self->min_x;
+  self->height = max_y - self->min_y;
+
   GDK_END_MACOS_ALLOC_POOL;
 }
 
@@ -406,3 +423,50 @@ _gdk_macos_display_open (const gchar *display_name)
 
   return GDK_DISPLAY (self);
 }
+
+void
+_gdk_macos_display_to_display_coords (GdkMacosDisplay *self,
+                                      int              x,
+                                      int              y,
+                                      int             *out_x,
+                                      int             *out_y)
+{
+  g_return_if_fail (GDK_IS_MACOS_DISPLAY (self));
+
+  if (out_y)
+    *out_y = self->height - y + self->min_y;
+
+  if (out_x)
+    *out_x = x + self->min_x;
+}
+
+NSScreen *
+_gdk_macos_display_get_screen_at_display_coords (GdkMacosDisplay *self,
+                                                 int              x,
+                                                 int              y)
+{
+  GDK_BEGIN_MACOS_ALLOC_POOL;
+
+  NSArray *screens;
+  NSScreen *screen = NULL;
+
+  g_return_val_if_fail (GDK_IS_MACOS_DISPLAY (self), NULL);
+
+  screens = [NSScreen screens];
+
+  for (id obj in screens)
+    {
+      NSRect geom = [obj frame];
+
+      if (x >= geom.origin.x && x <= geom.origin.x + geom.size.width &&
+          y >= geom.origin.y && y <= geom.origin.y + geom.size.height)
+        {
+          screen = obj;
+          break;
+        }
+    }
+
+  GDK_END_MACOS_ALLOC_POOL;
+
+  return screen;
+}
diff --git a/gdk/macos/gdkmacostoplevelsurface.c b/gdk/macos/gdkmacostoplevelsurface.c
index e69e315202..7c3857fbb2 100644
--- a/gdk/macos/gdkmacostoplevelsurface.c
+++ b/gdk/macos/gdkmacostoplevelsurface.c
@@ -23,6 +23,7 @@
 
 #include "gdktoplevelprivate.h"
 
+#include "gdkmacosdisplay-private.h"
 #include "gdkmacostoplevelsurface-private.h"
 #include "gdkmacosutils-private.h"
 
@@ -31,7 +32,7 @@ struct _GdkMacosToplevelSurface
   GdkMacosSurface  parent_instance;
 
   GdkMacosSurface *transient_for;
-  NSWindow        *window;
+  GdkMacosWindow  *window;
 
   guint            decorated : 1;
 };
@@ -41,18 +42,62 @@ struct _GdkMacosToplevelSurfaceClass
   GdkMacosSurfaceClass parent_instance;
 };
 
+static gboolean
+_gdk_macos_toplevel_surface_present (GdkToplevel       *toplevel,
+                                     int                width,
+                                     int                height,
+                                     GdkToplevelLayout *layout)
+{
+  GdkMacosToplevelSurface *self = (GdkMacosToplevelSurface *)toplevel;
+
+  g_assert (GDK_IS_MACOS_TOPLEVEL_SURFACE (self));
+
+  [self->window makeKeyAndOrderFront:self->window];
+
+  return TRUE;
+}
+
+static gboolean
+_gdk_macos_toplevel_surface_minimize (GdkToplevel *toplevel)
+{
+  GdkMacosToplevelSurface *self = (GdkMacosToplevelSurface *)toplevel;
+
+  g_assert (GDK_IS_MACOS_TOPLEVEL_SURFACE (self));
+
+  [self->window miniaturize:self->window];
+
+  return TRUE;
+}
+
+static void
+_gdk_macos_toplevel_surface_focus (GdkToplevel *toplevel,
+                                   guint32      timestamp)
+{
+  GdkMacosToplevelSurface *self = (GdkMacosToplevelSurface *)toplevel;
+
+  g_assert (GDK_IS_MACOS_TOPLEVEL_SURFACE (self));
+
+  [self->window makeKeyAndOrderFront:self->window];
+}
+
 static void
 toplevel_iface_init (GdkToplevelInterface *iface)
 {
+  iface->present = _gdk_macos_toplevel_surface_present;
+  iface->minimize = _gdk_macos_toplevel_surface_minimize;
+  iface->focus = _gdk_macos_toplevel_surface_focus;
 }
 
+G_DEFINE_TYPE_WITH_CODE (GdkMacosToplevelSurface, _gdk_macos_toplevel_surface, GDK_TYPE_MACOS_SURFACE,
+                         G_IMPLEMENT_INTERFACE (GDK_TYPE_TOPLEVEL, toplevel_iface_init))
+
 enum {
   PROP_0,
+  PROP_NATIVE,
   LAST_PROP
 };
 
-G_DEFINE_TYPE_WITH_CODE (GdkMacosToplevelSurface, _gdk_macos_toplevel_surface, GDK_TYPE_MACOS_SURFACE,
-                         G_IMPLEMENT_INTERFACE (GDK_TYPE_TOPLEVEL, toplevel_iface_init))
+static GParamSpec *properties [LAST_PROP];
 
 static CGDirectDisplayID
 _gdk_macos_toplevel_surface_get_screen_id (GdkMacosSurface *base)
@@ -116,6 +161,15 @@ _gdk_macos_toplevel_surface_destroy (GdkSurface *surface,
   GDK_SURFACE_CLASS (_gdk_macos_toplevel_surface_parent_class)->destroy (surface, foreign_destroy);
 }
 
+static void
+_gdk_macos_toplevel_surface_constructed (GObject *object)
+{
+  //GdkMacosToplevelSurface *self = (GdkMacosToplevelSurface *)object;
+
+  G_OBJECT_CLASS (_gdk_macos_toplevel_surface_parent_class)->constructed (object);
+
+}
+
 static void
 _gdk_macos_toplevel_surface_get_property (GObject    *object,
                                           guint       prop_id,
@@ -128,6 +182,10 @@ _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;
@@ -185,6 +243,10 @@ _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);
@@ -234,6 +296,7 @@ _gdk_macos_toplevel_surface_class_init (GdkMacosToplevelSurfaceClass *klass)
   GdkSurfaceClass *surface_class = GDK_SURFACE_CLASS (klass);
   GdkMacosSurfaceClass *base_class = GDK_MACOS_SURFACE_CLASS (klass);
 
+  object_class->constructed = _gdk_macos_toplevel_surface_constructed;
   object_class->get_property = _gdk_macos_toplevel_surface_get_property;
   object_class->set_property = _gdk_macos_toplevel_surface_set_property;
 
@@ -242,6 +305,14 @@ _gdk_macos_toplevel_surface_class_init (GdkMacosToplevelSurfaceClass *klass)
   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
@@ -259,12 +330,47 @@ _gdk_macos_toplevel_surface_new (GdkMacosDisplay *display,
                                  int              width,
                                  int              height)
 {
+  GDK_BEGIN_MACOS_ALLOC_POOL;
+
+  GdkMacosWindow *window;
+  GdkMacosSurface *self;
+  NSScreen *screen;
+  NSUInteger style_mask;
+  NSRect content_rect;
+  NSRect screen_rect;
+  int nx;
+  int ny;
+
   g_return_val_if_fail (GDK_IS_MACOS_DISPLAY (display), NULL);
   g_return_val_if_fail (!frame_clock || GDK_IS_FRAME_CLOCK (frame_clock), NULL);
   g_return_val_if_fail (!parent || GDK_IS_MACOS_SURFACE (parent), NULL);
 
-  return g_object_new (GDK_TYPE_MACOS_TOPLEVEL_SURFACE,
+  style_mask = (NSWindowStyleMaskTitled |
+                NSWindowStyleMaskClosable |
+                NSWindowStyleMaskMiniaturizable |
+                NSWindowStyleMaskResizable);
+
+  _gdk_macos_display_to_display_coords (display, x, y, &nx, &ny);
+
+  screen = _gdk_macos_display_get_screen_at_display_coords (display, nx, ny);
+  screen_rect = [screen frame];
+  nx -= screen_rect.origin.x;
+  ny -= screen_rect.origin.y;
+  content_rect = NSMakeRect (nx, ny - height, width, height);
+
+  window = [[GdkMacosWindow alloc] initWithContentRect:content_rect
+                                             styleMask:style_mask
+                                               backing:NSBackingStoreBuffered
+                                                 defer:NO
+                                                screen:screen];
+
+  self = g_object_new (GDK_TYPE_MACOS_TOPLEVEL_SURFACE,
                        "display", display,
                        "frame-clock", frame_clock,
+                       "native", window,
                        NULL);
+
+  GDK_END_MACOS_ALLOC_POOL;
+
+  return g_steal_pointer (&self);
 }


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