[gtk/wip/chergert/quartz4u] start on some toplevel API for macos surface
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/chergert/quartz4u] start on some toplevel API for macos surface
- Date: Wed, 29 Apr 2020 00:13:51 +0000 (UTC)
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]