That way, it doesn't need a specific init function.
Also chain up last, so that the generic initialization code in
GdkSurface::constructed can access a fully initialized macos surface.
#define GDK_IS_MACOS_DRAG_SURFACE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_MACOS_DRAG_SURFACE))
GType _gdk_macos_drag_surface_get_type (void);
-GdkMacosSurface *_gdk_macos_drag_surface_new (GdkMacosDisplay *display,
- int x,
- int y,
- int width,
- int height);
+GdkMacosSurface *_gdk_macos_drag_surface_new (GdkMacosDisplay *display);
G_END_DECLS
G_IMPLEMENT_INTERFACE (GDK_TYPE_DRAG_SURFACE, drag_surface_iface_init))
static void
-_gdk_macos_drag_surface_class_init (GdkMacosDragSurfaceClass *klass)
-{
-}
-
-static void
-_gdk_macos_drag_surface_init (GdkMacosDragSurface *self)
-{
-}
-
-GdkMacosSurface *
-_gdk_macos_drag_surface_new (GdkMacosDisplay *display,
- int x,
- int y,
- int width,
- int height)
+_gdk_macos_drag_surface_constructed (GObject *object)
{
GDK_BEGIN_MACOS_ALLOC_POOL;
- GdkFrameClock *frame_clock;
GdkMacosWindow *window;
- GdkMacosSurface *self;
+ GdkMacosSurface *self = GDK_MACOS_SURFACE (object);
+ GdkDisplay *display = gdk_surface_get_display (GDK_SURFACE (self));
NSScreen *screen;
NSUInteger style_mask;
NSRect content_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);
-
style_mask = NSWindowStyleMaskBorderless;
- _gdk_macos_display_to_display_coords (display, x, y, &nx, &ny);
+ _gdk_macos_display_to_display_coords (display, 0, 0, &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);
+ content_rect = NSMakeRect (nx, ny - 1, 1, 1);
window = [[GdkMacosWindow alloc] initWithContentRect:content_rect
styleMask:style_mask
[window setBackgroundColor:[NSColor clearColor]];
[window setDecorated:NO];
+ _gdk_macos_surface_set_native (self, window);
+
+ GDK_END_MACOS_ALLOC_POOL;
+
+ G_OBJECT_CLASS (_gdk_macos_drag_surface_parent_class)->constructed (object);
+}
+
+static void
+_gdk_macos_drag_surface_class_init (GdkMacosDragSurfaceClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->constructed = _gdk_macos_drag_surface_constructed;
+}
+
+static void
+_gdk_macos_drag_surface_init (GdkMacosDragSurface *self)
+{
+}
+
+GdkMacosSurface *
+_gdk_macos_drag_surface_new (GdkMacosDisplay *display)
+{
+ GdkFrameClock *frame_clock;
+
+ g_return_val_if_fail (GDK_IS_MACOS_DISPLAY (display), NULL);
+
frame_clock = _gdk_frame_clock_idle_new ();
self = g_object_new (GDK_TYPE_MACOS_DRAG_SURFACE,
"display", display,
"frame-clock", frame_clock,
- "native", window,
NULL);
g_object_unref (frame_clock);
- GDK_END_MACOS_ALLOC_POOL;
-
return g_steal_pointer (&self);
}
}
static void
-_gdk_macos_popup_surface_class_init (GdkMacosPopupSurfaceClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- GdkSurfaceClass *surface_class = GDK_SURFACE_CLASS (klass);
-
- object_class->finalize = _gdk_macos_popup_surface_finalize;
- object_class->get_property = _gdk_macos_popup_surface_get_property;
- object_class->set_property = _gdk_macos_popup_surface_set_property;
-
- surface_class->hide = _gdk_macos_popup_surface_hide;
-
- gdk_popup_install_properties (object_class, LAST_PROP);
-}
-
-static void
-_gdk_macos_popup_surface_init (GdkMacosPopupSurface *self)
-{
-}
-
-GdkMacosSurface *
-_gdk_macos_popup_surface_new (GdkMacosDisplay *display,
- GdkSurface *parent,
- GdkFrameClock *frame_clock)
+_gdk_macos_popup_surface_constructed (GObject *object)
{
GDK_BEGIN_MACOS_ALLOC_POOL;
GdkMacosWindow *window;
- GdkMacosSurface *self;
+ GdkMacosPopupSurface *self = GDK_MACOS_POPUP_SURFACE (object);
+ GdkDisplay *display = gdk_surface_get_display (GDK_SURFACE (self));
NSScreen *screen;
NSUInteger style_mask;
NSRect content_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);
-
style_mask = NSWindowStyleMaskBorderless;
_gdk_macos_display_to_display_coords (display, 0, 0, &nx, &ny);
[window setExcludedFromWindowsMenu:YES];
[window setLevel:NSPopUpMenuWindowLevel];
- self = g_object_new (GDK_TYPE_MACOS_POPUP_SURFACE,
- "display", display,
- "frame-clock", frame_clock,
- "native", window,
- "parent", parent,
- NULL);
+ _gdk_macos_surface_set_native (GDK_MACOS_SURFACE (self), window);
GDK_END_MACOS_ALLOC_POOL;
- return g_steal_pointer (&self);
+ G_OBJECT_CLASS (_gdk_macos_popup_surface_parent_class)->constructed (object);
+}
+
+static void
+_gdk_macos_popup_surface_class_init (GdkMacosPopupSurfaceClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GdkSurfaceClass *surface_class = GDK_SURFACE_CLASS (klass);
+
+ object_class->constructed = _gdk_macos_popup_surface_constructed;
+ object_class->finalize = _gdk_macos_popup_surface_finalize;
+ object_class->get_property = _gdk_macos_popup_surface_get_property;
+ object_class->set_property = _gdk_macos_popup_surface_set_property;
+
+ surface_class->hide = _gdk_macos_popup_surface_hide;
+
+ gdk_popup_install_properties (object_class, LAST_PROP);
+}
+
+static void
+_gdk_macos_popup_surface_init (GdkMacosPopupSurface *self)
+{
}
void
GdkSurfaceType surface_type,
GdkSurface *parent);
NSWindow *_gdk_macos_surface_get_native (GdkMacosSurface *self);
+void _gdk_macos_surface_set_native (GdkMacosSurface *self,
+ GdkMacosWindow *window);
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,
#include "gdkmacosglcontext-private.h"
#include "gdkmacosmonitor-private.h"
#include "gdkmacospopupsurface-private.h"
-#include "gdkmacostoplevelsurface-private.h"
#include "gdkmacosutils-private.h"
G_DEFINE_ABSTRACT_TYPE (GdkMacosSurface, gdk_macos_surface, GDK_TYPE_SURFACE)
GdkMacosSurface *drag_surface;
GdkMacosDrag *drag;
GdkCursor *cursor;
- double px;
- double py;
- int sx;
- int sy;
g_assert (GDK_IS_MACOS_SURFACE (self));
g_assert (GDK_IS_MACOS_TOPLEVEL_SURFACE (self) ||
g_assert (GDK_IS_MACOS_DEVICE (device));
g_assert (GDK_IS_CONTENT_PROVIDER (content));
- gdk_macos_device_query_state (device, surface, NULL, &px, &py, NULL);
- _gdk_macos_surface_get_root_coords (GDK_MACOS_SURFACE (surface), &sx, &sy);
- drag_surface = _gdk_macos_drag_surface_new (GDK_MACOS_DISPLAY (surface->display),
- sx, sy, 1, 1);
+ drag_surface = _gdk_macos_drag_surface_new (GDK_MACOS_DISPLAY (surface->display));
drag = g_object_new (GDK_TYPE_MACOS_DRAG,
"drag-surface", drag_surface,
"surface", surface,
}
}
-static void
-gdk_macos_surface_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GdkMacosSurface *self = GDK_MACOS_SURFACE (object);
-
- switch (prop_id)
- {
- case PROP_NATIVE:
- self->window = g_value_get_pointer (value);
- [self->window setGdkSurface:self];
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- }
-}
-
static void
gdk_macos_surface_class_init (GdkMacosSurfaceClass *klass)
{
object_class->constructed = gdk_macos_surface_constructed;
object_class->get_property = gdk_macos_surface_get_property;
- object_class->set_property = gdk_macos_surface_set_property;
surface_class->destroy = gdk_macos_surface_destroy;
surface_class->drag_begin = gdk_macos_surface_drag_begin;
*/
properties [PROP_NATIVE] =
g_param_spec_pointer ("native", NULL, NULL,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, LAST_PROP, properties);
}
switch (surface_type)
{
case GDK_SURFACE_TOPLEVEL:
- ret = _gdk_macos_toplevel_surface_new (display, frame_clock);
+ ret = g_object_new (GDK_TYPE_MACOS_TOPLEVEL_SURFACE,
+ "display", display,
+ "frame-clock", frame_clock,
+ NULL);
break;
case GDK_SURFACE_POPUP:
- ret = _gdk_macos_popup_surface_new (display, parent, frame_clock);
+ ret = g_object_new (GDK_TYPE_MACOS_POPUP_SURFACE,
+ "display", display,
+ "frame-clock", frame_clock,
+ "parent", parent,
+ NULL);
+
break;
case GDK_SURFACE_DRAG:
return (NSWindow *)self->window;
}
+void
+_gdk_macos_surface_set_native (GdkMacosSurface *self,
+ GdkMacosWindow *window)
+{
+ g_assert (self->window == NULL);
+
+ self->window = window;
+ [self->window setGdkSurface:self];
+}
+
/**
* gdk_macos_surface_get_native_window: (attributes org.gtk.Method.get_property=native)
* @self: a #GdkMacosSurface
};
GType _gdk_macos_toplevel_surface_get_type (void);
-GdkMacosSurface *_gdk_macos_toplevel_surface_new (GdkMacosDisplay *display,
- GdkFrameClock *frame_clock);
void _gdk_macos_toplevel_surface_attach_to_parent (GdkMacosToplevelSurface *self);
void _gdk_macos_toplevel_surface_detach_from_parent (GdkMacosToplevelSurface *self);
}
static void
-_gdk_macos_toplevel_surface_class_init (GdkMacosToplevelSurfaceClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- GdkSurfaceClass *surface_class = GDK_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;
- surface_class->hide = _gdk_macos_toplevel_surface_hide;
- surface_class->compute_size = _gdk_macos_toplevel_surface_compute_size;
- surface_class->request_layout = _gdk_macos_toplevel_surface_request_layout;
-
- gdk_toplevel_install_properties (object_class, LAST_PROP);
-}
-
-static void
-_gdk_macos_toplevel_surface_init (GdkMacosToplevelSurface *self)
-{
- self->decorated = TRUE;
-}
-
-GdkMacosSurface *
-_gdk_macos_toplevel_surface_new (GdkMacosDisplay *display,
- GdkFrameClock *frame_clock)
+_gdk_macos_toplevel_surface_constructed (GObject *object)
{
GDK_BEGIN_MACOS_ALLOC_POOL;
GdkMacosWindow *window;
- GdkMacosSurface *self;
+ GdkMacosToplevelSurface *self = GDK_MACOS_TOPLEVEL_SURFACE (object);
+ GdkDisplay *display = gdk_surface_get_display (GDK_SURFACE (self));
NSUInteger style_mask;
NSRect content_rect;
NSRect visible_frame;
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);
-
style_mask = (NSWindowStyleMaskTitled |
NSWindowStyleMaskClosable |
NSWindowStyleMaskMiniaturizable |
/* Allow NSWindow to go fullscreen */
[window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];
- self = g_object_new (GDK_TYPE_MACOS_TOPLEVEL_SURFACE,
- "display", display,
- "frame-clock", frame_clock,
- "native", window,
- NULL);
+ _gdk_macos_surface_set_native (GDK_MACOS_SURFACE (self), window);
GDK_END_MACOS_ALLOC_POOL;
- return g_steal_pointer (&self);
+ G_OBJECT_CLASS (_gdk_macos_toplevel_surface_parent_class)->constructed (object);
+}
+
+static void
+_gdk_macos_toplevel_surface_class_init (GdkMacosToplevelSurfaceClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GdkSurfaceClass *surface_class = GDK_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;
+
+ surface_class->destroy = _gdk_macos_toplevel_surface_destroy;
+ surface_class->hide = _gdk_macos_toplevel_surface_hide;
+ surface_class->compute_size = _gdk_macos_toplevel_surface_compute_size;
+ surface_class->request_layout = _gdk_macos_toplevel_surface_request_layout;
+
+ gdk_toplevel_install_properties (object_class, LAST_PROP);
+}
+
+static void
+_gdk_macos_toplevel_surface_init (GdkMacosToplevelSurface *self)
+{
+ self->decorated = TRUE;
}
void