[gtk/wip/chergert/quartz4u] find monitor for the surface
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/chergert/quartz4u] find monitor for the surface
- Date: Tue, 28 Apr 2020 00:17:04 +0000 (UTC)
commit 7fd3cb502bb266a7b6f3312deed0995a1f056aa4
Author: Christian Hergert <chergert redhat com>
Date: Mon Apr 27 17:16:11 2020 -0700
find monitor for the surface
gdk/macos/gdkmacosdisplay.c | 24 ++++++++++++++++++++
gdk/macos/gdkmacosmonitor-private.h | 5 +++--
gdk/macos/gdkmacosmonitor.c | 18 +++++++++++++--
gdk/macos/gdkmacossurface-private.h | 45 ++++++++++++++++++++++---------------
gdk/macos/gdkmacossurface.c | 8 +++++++
gdk/macos/gdkmacostoplevelsurface.c | 17 ++++++++++++++
6 files changed, 95 insertions(+), 22 deletions(-)
---
diff --git a/gdk/macos/gdkmacosdisplay.c b/gdk/macos/gdkmacosdisplay.c
index 660f34ed66..b60a08b5f6 100644
--- a/gdk/macos/gdkmacosdisplay.c
+++ b/gdk/macos/gdkmacosdisplay.c
@@ -123,6 +123,29 @@ gdk_macos_display_get_primary_monitor (GdkDisplay *display)
return g_ptr_array_index (self->monitors, 0);
}
+static GdkMonitor *
+gdk_macos_display_get_monitor_at_surface (GdkDisplay *display,
+ GdkSurface *surface)
+{
+ GdkMacosDisplay *self = (GdkMacosDisplay *)display;
+ CGDirectDisplayID screen_id;
+
+ g_assert (GDK_IS_MACOS_DISPLAY (self));
+ g_assert (GDK_IS_MACOS_SURFACE (surface));
+
+ screen_id = _gdk_macos_surface_get_screen_id (GDK_MACOS_SURFACE (surface));
+
+ for (guint i = 0; i < self->monitors->len; i++)
+ {
+ GdkMacosMonitor *monitor = g_ptr_array_index (self->monitors, i);
+
+ if (screen_id == _gdk_macos_monitor_get_screen_id (monitor))
+ return GDK_MONITOR (monitor);
+ }
+
+ return gdk_macos_display_get_primary_monitor (display);
+}
+
static void
gdk_macos_display_add_monitor (GdkMacosDisplay *self,
GdkMacosMonitor *monitor)
@@ -331,6 +354,7 @@ gdk_macos_display_class_init (GdkMacosDisplayClass *klass)
display_class->flush = gdk_macos_display_flush;
display_class->get_keymap = gdk_macos_display_get_keymap;
display_class->get_monitor = gdk_macos_display_get_monitor;
+ display_class->get_monitor_at_surface = gdk_macos_display_get_monitor_at_surface;
display_class->get_next_serial = gdk_macos_display_get_next_serial;
display_class->get_n_monitors = gdk_macos_display_get_n_monitors;
display_class->get_name = gdk_macos_display_get_name;
diff --git a/gdk/macos/gdkmacosmonitor-private.h b/gdk/macos/gdkmacosmonitor-private.h
index 7eb24819f4..8e65e73c3d 100644
--- a/gdk/macos/gdkmacosmonitor-private.h
+++ b/gdk/macos/gdkmacosmonitor-private.h
@@ -29,8 +29,9 @@
G_BEGIN_DECLS
-GdkMacosMonitor *_gdk_macos_monitor_new (GdkMacosDisplay *display,
- CGDirectDisplayID monitor_id);
+GdkMacosMonitor *_gdk_macos_monitor_new (GdkMacosDisplay *display,
+ CGDirectDisplayID screen_id);
+CGDirectDisplayID _gdk_macos_monitor_get_screen_id (GdkMacosMonitor *self);
G_END_DECLS
diff --git a/gdk/macos/gdkmacosmonitor.c b/gdk/macos/gdkmacosmonitor.c
index 652c400696..3b98691695 100644
--- a/gdk/macos/gdkmacosmonitor.c
+++ b/gdk/macos/gdkmacosmonitor.c
@@ -25,7 +25,8 @@
struct _GdkMacosMonitor
{
- GdkMonitor parent_instance;
+ GdkMonitor parent_instance;
+ CGDirectDisplayID screen_id;
};
struct _GdkMacosMonitorClass
@@ -60,9 +61,22 @@ GdkMacosMonitor *
_gdk_macos_monitor_new (GdkMacosDisplay *display,
CGDirectDisplayID screen_id)
{
+ GdkMacosMonitor *self;
+
g_return_val_if_fail (GDK_IS_MACOS_DISPLAY (display), NULL);
- return g_object_new (GDK_TYPE_MACOS_MONITOR,
+ self = g_object_new (GDK_TYPE_MACOS_MONITOR,
"display", display,
NULL);
+ self->screen_id = screen_id;
+
+ return g_steal_pointer (&self);
+}
+
+CGDirectDisplayID
+_gdk_macos_monitor_get_screen_id (GdkMacosMonitor *self)
+{
+ g_return_val_if_fail (GDK_IS_MACOS_MONITOR (self), 0);
+
+ return self->screen_id;
}
diff --git a/gdk/macos/gdkmacossurface-private.h b/gdk/macos/gdkmacossurface-private.h
index 01b5a6bdfb..22d8a7f6f1 100644
--- a/gdk/macos/gdkmacossurface-private.h
+++ b/gdk/macos/gdkmacossurface-private.h
@@ -20,6 +20,8 @@
#ifndef __GDK_MACOS_SURFACE_PRIVATE_H__
#define __GDK_MACOS_SURFACE_PRIVATE_H__
+#include <AppKit/AppKit.h>
+
#include "gdksurfaceprivate.h"
#include "gdkmacosdisplay.h"
@@ -27,6 +29,10 @@
G_BEGIN_DECLS
+#define GDK_MACOS_SURFACE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_MACOS_SURFACE,
GdkMacosSurfaceClass))
+#define GDK_IS_MACOS_SURFACE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_MACOS_SURFACE))
+#define GDK_MACOS_SURFACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_MACOS_SURFACE,
GdkMacosSurfaceClass))
+
struct _GdkMacosSurface
{
GdkSurface parent_instance;
@@ -35,26 +41,29 @@ struct _GdkMacosSurface
struct _GdkMacosSurfaceClass
{
GdkSurfaceClass parent_class;
+
+ CGDirectDisplayID (*get_screen_id) (GdkMacosSurface *self);
};
-GdkMacosSurface *_gdk_macos_surface_new (GdkMacosDisplay *display,
- GdkSurfaceType surface_type,
- GdkSurface *parent,
- int x,
- int y,
- int width,
- int height);
-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);
+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);
G_END_DECLS
diff --git a/gdk/macos/gdkmacossurface.c b/gdk/macos/gdkmacossurface.c
index d7bdaf8d9a..ddf0ce3520 100644
--- a/gdk/macos/gdkmacossurface.c
+++ b/gdk/macos/gdkmacossurface.c
@@ -171,3 +171,11 @@ _gdk_macos_surface_set_modal_hint (GdkMacosSurface *self,
priv->modal_hint = !!modal_hint;
}
+
+CGDirectDisplayID
+_gdk_macos_surface_get_screen_id (GdkMacosSurface *self)
+{
+ g_return_val_if_fail (GDK_IS_MACOS_SURFACE (self), 0);
+
+ return GDK_MACOS_SURFACE_GET_CLASS (self)->get_screen_id (self);
+}
diff --git a/gdk/macos/gdkmacostoplevelsurface.c b/gdk/macos/gdkmacostoplevelsurface.c
index f2c691fd7b..479cf38112 100644
--- a/gdk/macos/gdkmacostoplevelsurface.c
+++ b/gdk/macos/gdkmacostoplevelsurface.c
@@ -53,6 +53,20 @@ enum {
G_DEFINE_TYPE_WITH_CODE (GdkMacosToplevelSurface, _gdk_macos_toplevel_surface, GDK_TYPE_MACOS_SURFACE,
G_IMPLEMENT_INTERFACE (GDK_TYPE_TOPLEVEL, toplevel_iface_init))
+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)
@@ -217,12 +231,15 @@ _gdk_macos_toplevel_surface_class_init (GdkMacosToplevelSurfaceClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GdkSurfaceClass *surface_class = GDK_SURFACE_CLASS (klass);
+ GdkMacosSurfaceClass *base_class = GDK_MACOS_SURFACE_CLASS (klass);
object_class->get_property = _gdk_macos_toplevel_surface_get_property;
object_class->set_property = _gdk_macos_toplevel_surface_set_property;
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);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]