[gtk/wip/chergert/quartz4u] start on some resizing of surfaces
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/chergert/quartz4u] start on some resizing of surfaces
- Date: Wed, 29 Apr 2020 21:31:19 +0000 (UTC)
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]