[gtk/wip/chergert/quartz4u] start on some resizing of surfaces



commit b65ecaa1700403f0a9f9c92d0df85f6dd4c968c2
Author: Christian Hergert <chergert redhat com>
Date:   Wed Apr 29 14:30:34 2020 -0700

    start on some resizing of surfaces

 gdk/macos/gdkmacossurface-private.h | 48 +++++++++++++++-----------
 gdk/macos/gdkmacossurface.c         | 67 ++++++++++++++++++++++++++++++++++---
 gdk/macos/gdkmacostoplevelsurface.c | 28 +++++++++++++++-
 3 files changed, 118 insertions(+), 25 deletions(-)
---
diff --git a/gdk/macos/gdkmacossurface-private.h b/gdk/macos/gdkmacossurface-private.h
index 15f9f39719..adc4f4bd4b 100644
--- a/gdk/macos/gdkmacossurface-private.h
+++ b/gdk/macos/gdkmacossurface-private.h
@@ -22,6 +22,7 @@
 
 #include <AppKit/AppKit.h>
 
+#include "gdkinternals.h"
 #include "gdksurfaceprivate.h"
 
 #include "gdkmacosdisplay.h"
@@ -43,26 +44,33 @@ struct _GdkMacosSurfaceClass
   GdkSurfaceClass parent_class;
 };
 
-GdkMacosSurface   *_gdk_macos_surface_new            (GdkMacosDisplay *display,
-                                                      GdkSurfaceType   surface_type,
-                                                      GdkSurface      *parent,
-                                                      int              x,
-                                                      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,
-                                                      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);
+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,
+                                                          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);
+void               _gdk_macos_surface_set_geometry_hints (GdkMacosSurface    *self,
+                                                          const GdkGeometry  *geometry,
+                                                          GdkSurfaceHints     geom_mask);
+void               _gdk_macos_surface_resize             (GdkMacosSurface    *self,
+                                                          int                 width,
+                                                          int                 height,
+                                                          int                 scale);
 
 G_END_DECLS
 
diff --git a/gdk/macos/gdkmacossurface.c b/gdk/macos/gdkmacossurface.c
index dbc6c0a9f1..26b05a34ea 100644
--- a/gdk/macos/gdkmacossurface.c
+++ b/gdk/macos/gdkmacossurface.c
@@ -20,13 +20,16 @@
 #include "config.h"
 
 #include <AppKit/AppKit.h>
+#include <float.h>
 #include <gdk/gdk.h>
 
 #import "GdkMacosWindow.h"
 
 #include "gdkframeclockidleprivate.h"
+#include "gdkinternals.h"
 #include "gdksurfaceprivate.h"
 
+#include "gdkmacosdisplay-private.h"
 #include "gdkmacosdragsurface-private.h"
 #include "gdkmacospopupsurface-private.h"
 #include "gdkmacossurface-private.h"
@@ -39,10 +42,12 @@ typedef struct
 
   char *title;
 
-  gint shadow_top;
-  gint shadow_right;
-  gint shadow_bottom;
-  gint shadow_left;
+  int shadow_top;
+  int shadow_right;
+  int shadow_bottom;
+  int shadow_left;
+
+  int scale;
 
   guint modal_hint : 1;
 } GdkMacosSurfacePrivate;
@@ -287,3 +292,57 @@ _gdk_macos_surface_get_native (GdkMacosSurface *self)
 
   return (NSWindow *)priv->window;
 }
+
+void
+_gdk_macos_surface_set_geometry_hints (GdkMacosSurface   *self,
+                                       const GdkGeometry *geometry,
+                                       GdkSurfaceHints    geom_mask)
+{
+  GdkMacosSurfacePrivate *priv = gdk_macos_surface_get_instance_private (self);
+  NSSize max_size;
+  NSSize min_size;
+
+  g_return_if_fail (GDK_IS_MACOS_SURFACE (self));
+  g_return_if_fail (geometry != NULL);
+  g_return_if_fail (priv->window != NULL);
+
+  if (geom_mask & GDK_HINT_MAX_SIZE)
+    max_size = NSMakeSize (geometry->max_width, geometry->max_height);
+  else
+    max_size = NSMakeSize (FLT_MAX, FLT_MAX);
+
+  if (geom_mask & GDK_HINT_MIN_SIZE)
+    min_size = NSMakeSize (geometry->min_width, geometry->min_height);
+  else
+    min_size = NSMakeSize (0, 0);
+
+  [priv->window setMaxSize:max_size];
+  [priv->window setMinSize:min_size];
+}
+
+void
+_gdk_macos_surface_resize (GdkMacosSurface *self,
+                           int              width,
+                           int              height,
+                           int              scale)
+{
+  GdkMacosSurfacePrivate *priv = gdk_macos_surface_get_instance_private (self);
+  GdkSurface *surface = (GdkSurface *)self;
+  GdkDisplay *display;
+  NSRect content_rect;
+  NSRect frame_rect;
+  int gx;
+  int gy;
+
+  g_return_if_fail (GDK_IS_MACOS_SURFACE (surface));
+
+  display = gdk_surface_get_display (surface);
+  _gdk_macos_display_to_display_coords (GDK_MACOS_DISPLAY (display),
+                                        surface->x,
+                                        surface->y + surface->height,
+                                        &gx,
+                                        &gy);
+  content_rect = NSMakeRect (gx, gy, width, height);
+  frame_rect = [priv->window frameRectForContentRect:content_rect];
+  [priv->window setFrame:frame_rect display:YES];
+}
diff --git a/gdk/macos/gdkmacostoplevelsurface.c b/gdk/macos/gdkmacostoplevelsurface.c
index 6bb7148fc2..90a70405a6 100644
--- a/gdk/macos/gdkmacostoplevelsurface.c
+++ b/gdk/macos/gdkmacostoplevelsurface.c
@@ -21,6 +21,7 @@
 
 #import "GdkMacosWindow.h"
 
+#include "gdkinternals.h"
 #include "gdktoplevelprivate.h"
 
 #include "gdkmacosdisplay-private.h"
@@ -101,19 +102,44 @@ _gdk_macos_toplevel_surface_present (GdkToplevel       *toplevel,
 {
   GdkMacosToplevelSurface *self = (GdkMacosToplevelSurface *)toplevel;
   NSWindow *window = _gdk_macos_surface_get_native (GDK_MACOS_SURFACE (self));
+  GdkGeometry geometry;
+  GdkSurfaceHints mask;
 
-  [window makeKeyAndOrderFront:window];
+  g_assert (GDK_IS_MACOS_TOPLEVEL_SURFACE (self));
+  g_assert (window != NULL);
 
+  if (gdk_toplevel_layout_get_resizable (layout))
+    {
+      geometry.min_width = gdk_toplevel_layout_get_min_width (layout);
+      geometry.min_height = gdk_toplevel_layout_get_min_height (layout);
+      mask = GDK_HINT_MIN_SIZE;
+    }
+  else
+    {
+      geometry.max_width = geometry.min_width = width;
+      geometry.max_height = geometry.min_height = height;
+      mask = GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE;
+    }
+
+  _gdk_macos_surface_set_geometry_hints (GDK_MACOS_SURFACE (self), &geometry, mask);
+  gdk_surface_constrain_size (&geometry, mask, width, height, &width, &height);
+  _gdk_macos_surface_resize (GDK_MACOS_SURFACE (self), width, height, -1);
+
+  /* Maximized state */
   if (gdk_toplevel_layout_get_maximized (layout))
     _gdk_macos_toplevel_surface_maximize (self);
   else
     _gdk_macos_toplevel_surface_unmaximize (self);
 
+  /* Fullscreen state */
   if (gdk_toplevel_layout_get_fullscreen (layout))
     _gdk_macos_toplevel_surface_fullscreen (self);
   else
     _gdk_macos_toplevel_surface_unfullscreen (self);
 
+  /* Now present the window */
+  [window makeKeyAndOrderFront:window];
+
   return TRUE;
 }
 


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