From 3c7e6438bb2420c8fd31ba164c400b66ae474f5d Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Fri, 5 Oct 2012 12:10:15 +0200 Subject: [PATCH 25/68] quartz: Add a dummy NSView serving as layer view By doing this, the GdkQuartzView does not have to be marked as layer backed, such that the disadvantages that come with that (not being able to copy pixels and large redraw areas) no longer apply. --- gdk/quartz/GdkQuartzView.c | 6 ++++++ gdk/quartz/gdkquartz.h | 1 + gdk/quartz/gdkwindow-quartz.c | 16 ++++++++++++++++ gdk/quartz/gdkwindow-quartz.h | 1 + 4 files changed, 24 insertions(+) diff --git a/gdk/quartz/GdkQuartzView.c b/gdk/quartz/GdkQuartzView.c index 7f0ec40..c6ccf06 100644 --- a/gdk/quartz/GdkQuartzView.c +++ b/gdk/quartz/GdkQuartzView.c @@ -632,6 +632,8 @@ [[self window] invalidateShadow]; needsInvalidateShadow = NO; } + + [[self layer] removeAllAnimations]; } -(void)setNeedsInvalidateShadow: (BOOL)invalidate @@ -690,7 +692,11 @@ -(void)setFrame: (NSRect)frame { + GdkWindowObject *private = GDK_WINDOW_OBJECT (gdk_window); + GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl); + [super setFrame: frame]; + [impl->layer_view setFrame: frame]; if ([self window]) [self updateTrackingRect]; diff --git a/gdk/quartz/gdkquartz.h b/gdk/quartz/gdkquartz.h index 3c42983..8b0085c 100644 --- a/gdk/quartz/gdkquartz.h +++ b/gdk/quartz/gdkquartz.h @@ -54,6 +54,7 @@ typedef enum NSWindow *gdk_quartz_window_get_nswindow (GdkWindow *window); NSView *gdk_quartz_window_get_nsview (GdkWindow *window); +NSView *gdk_quartz_window_get_layer_view (GdkWindow *window); NSImage *gdk_quartz_pixbuf_to_ns_image_libgtk_only (GdkPixbuf *pixbuf); id gdk_quartz_drag_context_get_dragging_info_libgtk_only (GdkDragContext *context); NSEvent *gdk_quartz_event_get_nsevent (GdkEvent *event); diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c index 318a171..500776d 100644 --- a/gdk/quartz/gdkwindow-quartz.c +++ b/gdk/quartz/gdkwindow-quartz.c @@ -68,6 +68,17 @@ gdk_quartz_window_get_nsview (GdkWindow *window) return ((GdkWindowImplQuartz *)private->impl)->view; } +NSView * +gdk_quartz_window_get_layer_view (GdkWindow *window) +{ + GdkWindowObject *private = (GdkWindowObject *)window; + + if (GDK_WINDOW_DESTROYED (window)) + return NULL; + + return ((GdkWindowImplQuartz *)private->impl)->layer_view; +} + NSWindow * gdk_quartz_window_get_nswindow (GdkWindow *window) { @@ -1024,6 +1035,11 @@ _gdk_window_impl_new (GdkWindow *window, [impl->view setGdkWindow:window]; [impl->toplevel setContentView:impl->view]; [impl->view release]; + + impl->layer_view = [[NSView alloc] initWithFrame:content_rect]; + [impl->view addSubview:impl->layer_view]; + [impl->layer_view setWantsLayer:YES]; + [impl->layer_view release]; } break; diff --git a/gdk/quartz/gdkwindow-quartz.h b/gdk/quartz/gdkwindow-quartz.h index 4a0e27a..f35238b 100644 --- a/gdk/quartz/gdkwindow-quartz.h +++ b/gdk/quartz/gdkwindow-quartz.h @@ -47,6 +47,7 @@ struct _GdkWindowImplQuartz NSWindow *toplevel; NSTrackingRectTag tracking_rect; GdkQuartzView *view; + NSView *layer_view; GdkWindowTypeHint type_hint; -- 1.7.10.2 (Apple Git-33)