diff --git a/ChangeLog b/ChangeLog index 6e8fa4c37e..bcf505c1c3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2007-06-20 Richard Hult + + * gdk/quartz/gdkwindow-quartz.c (gdk_window_new): + * gdk/quartz/GdkQuartzWindow.c (windowDidResize): Don't create or + update the tracking rect in the window, move it to the view where + it belongs. + + * gdk/quartz/GdkQuartzView.c (updateTrackingRect) + (viewDidMoveToWindow, viewWillMoveToWindow) + (setFrame, setBounds): Create and update the tracking rect here. + 2007-06-19 Mathias Hasselmann * gdk/gdkinternals.h: Restore G_BEGIN_DECLS at the diff --git a/gdk/quartz/GdkQuartzView.c b/gdk/quartz/GdkQuartzView.c index 500c0b53be..aefcc14074 100644 --- a/gdk/quartz/GdkQuartzView.c +++ b/gdk/quartz/GdkQuartzView.c @@ -110,4 +110,56 @@ GDK_QUARTZ_RELEASE_POOL; } +/* For information on seting up tracking rects properly, see here: + * http://developer.apple.com/documentation/Cocoa/Conceptual/EventOverview/EventOverview.pdf + */ +-(void)updateTrackingRect +{ + GdkWindowObject *private = GDK_WINDOW_OBJECT (gdk_window); + GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl); + + if (trackingRect) + { + [self removeTrackingRect:trackingRect]; + trackingRect = nil; + } + + if (!impl->toplevel) + return; + + trackingRect = [self addTrackingRect:[self bounds] + owner:self + userData:nil + assumeInside:NO]; +} + +-(void)viewDidMoveToWindow +{ + if (![self window]) /* We are destroyed already */ + return; + + [self updateTrackingRect]; +} + +-(void)viewWillMoveToWindow:(NSWindow *)newWindow +{ + if ([self window] && trackingRect) + { + [self removeTrackingRect:trackingRect]; + trackingRect = nil; + } +} + +-(void)setFrame:(NSRect)frame +{ + [super setFrame:frame]; + [self updateTrackingRect]; +} + +-(void)setBounds:(NSRect)bounds +{ + [super setBounds:bounds]; + [self updateTrackingRect]; +} + @end diff --git a/gdk/quartz/GdkQuartzView.h b/gdk/quartz/GdkQuartzView.h index 28f6a93774..1da55e3773 100644 --- a/gdk/quartz/GdkQuartzView.h +++ b/gdk/quartz/GdkQuartzView.h @@ -23,6 +23,7 @@ @interface GdkQuartzView : NSView { GdkWindow *gdk_window; + NSTrackingRectTag trackingRect; } -(void)setGdkWindow:(GdkWindow *)window; diff --git a/gdk/quartz/GdkQuartzWindow.c b/gdk/quartz/GdkQuartzWindow.c index cd18e7f9be..97c01e79e8 100644 --- a/gdk/quartz/GdkQuartzWindow.c +++ b/gdk/quartz/GdkQuartzWindow.c @@ -136,7 +136,6 @@ impl->height = content_rect.size.height; /* Synthesize a configure event */ - event = gdk_event_new (GDK_CONFIGURE); event->configure.window = g_object_ref (window); event->configure.x = private->x; @@ -145,13 +144,6 @@ event->configure.height = impl->height; _gdk_event_queue_append (gdk_display_get_default (), event); - - /* Update tracking rectangle */ - [[self contentView] removeTrackingRect:impl->tracking_rect]; - impl->tracking_rect = [impl->view addTrackingRect:NSMakeRect(0, 0, impl->width, impl->height) - owner:impl->view - userData:nil - assumeInside:NO]; } -(id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag @@ -161,12 +153,7 @@ backing:backingType defer:flag]; - - /* A possible modification here would be to only accept mouse moved events - * if any of the child GdkWindows are interested in mouse moved events. - */ [self setAcceptsMouseMovedEvents:YES]; - [self setDelegate:self]; [self setReleasedWhenClosed:YES]; diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c index f538e2100f..a4e62fa929 100644 --- a/gdk/quartz/gdkwindow-quartz.c +++ b/gdk/quartz/gdkwindow-quartz.c @@ -643,16 +643,17 @@ gdk_window_new (GdkWindow *parent, const char *title; int style_mask; - switch (attributes->window_type) { - case GDK_WINDOW_TEMP: - style_mask = NSBorderlessWindowMask; - break; - default: - style_mask = (NSTitledWindowMask | - NSClosableWindowMask | - NSMiniaturizableWindowMask | - NSResizableWindowMask); - } + switch (attributes->window_type) + { + case GDK_WINDOW_TEMP: + style_mask = NSBorderlessWindowMask; + break; + default: + style_mask = (NSTitledWindowMask | + NSClosableWindowMask | + NSMiniaturizableWindowMask | + NSResizableWindowMask); + } impl->toplevel = [[GdkQuartzWindow alloc] initWithContentRect:content_rect styleMask:style_mask @@ -665,7 +666,7 @@ gdk_window_new (GdkWindow *parent, title = get_default_title (); gdk_window_set_title (window, title); - + if (draw_impl->colormap == gdk_screen_get_rgba_colormap (_gdk_screen)) { [impl->toplevel setOpaque:NO]; @@ -675,14 +676,9 @@ gdk_window_new (GdkWindow *parent, impl->view = [[GdkQuartzView alloc] initWithFrame:content_rect]; [impl->view setGdkWindow:window]; [impl->toplevel setContentView:impl->view]; - - /* Add a tracking rect */ - impl->tracking_rect = [impl->view addTrackingRect:NSMakeRect(0, 0, impl->width, impl->height) - owner:impl->view - userData:nil - assumeInside:NO]; } break; + case GDK_WINDOW_CHILD: { GdkWindowImplQuartz *parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (parent)->impl); @@ -701,6 +697,7 @@ gdk_window_new (GdkWindow *parent, } } break; + default: g_assert_not_reached (); }