From cf53a34db4113a851b1cad4f72aa5fc4d12b62a7 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Tue, 29 Nov 2022 10:17:05 -0800 Subject: [PATCH 1/4] [quartz] Fix some compile warnings. --- gdk/quartz/GdkQuartzView.c | 8 +++----- gdk/quartz/gdkevents-quartz.c | 10 +--------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/gdk/quartz/GdkQuartzView.c b/gdk/quartz/GdkQuartzView.c index af28e37bea..f82c72a7b0 100644 --- a/gdk/quartz/GdkQuartzView.c +++ b/gdk/quartz/GdkQuartzView.c @@ -515,14 +515,12 @@ copy_rectangle_argb32 (cairo_surface_t *dest, cairo_surface_t *source, -(void)createBackingStoreWithWidth: (CGFloat) width andHeight: (CGFloat) height { - CVReturn rv; - g_return_if_fail (width && height); CVPixelBufferRelease (pixels); - rv = CVPixelBufferCreate (NULL, width, height, - kCVPixelFormatType_32BGRA, - cfpb_props, &pixels); + CVPixelBufferCreate (NULL, width, height, + kCVPixelFormatType_32BGRA, + cfpb_props, &pixels); } diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c index f94fd978a0..73ab40054f 100644 --- a/gdk/quartz/gdkevents-quartz.c +++ b/gdk/quartz/gdkevents-quartz.c @@ -388,7 +388,7 @@ get_window_point_from_screen_point (GdkWindow *window, NSPoint point; GdkQuartzNSWindow *nswindow; - nswindow = gdk_quartz_window_get_nswindow (window); + nswindow = (GdkQuartzNSWindow*)gdk_quartz_window_get_nswindow (window); point = [nswindow convertPointFromScreen:screen_point]; *x = point.x; *y = window->height - point.y; @@ -793,12 +793,7 @@ find_toplevel_for_mouse_event (NSEvent *nsevent, if (toplevel_under_pointer && WINDOW_IS_TOPLEVEL (toplevel_under_pointer)) { - GdkWindowImplQuartz *toplevel_impl; - toplevel = toplevel_under_pointer; - - toplevel_impl = GDK_WINDOW_IMPL_QUARTZ (toplevel->impl); - *x = x_tmp; *y = y_tmp; } @@ -1140,9 +1135,6 @@ fill_scroll_event (GdkWindow *window, GdkScrollDirection direction) { GdkSeat *seat = gdk_display_get_default_seat (_gdk_display); - NSPoint point; - - point = [nsevent locationInWindow]; event->any.type = GDK_SCROLL; event->scroll.window = window; From 307945fbe498c42a71b62f83dcb722ba4c25690e Mon Sep 17 00:00:00 2001 From: John Ralls Date: Tue, 29 Nov 2022 10:12:18 -0800 Subject: [PATCH 2/4] [quartz]Use new (since 10.5) NSTrackingArea instead of older tracking rect. --- gdk/quartz/GdkQuartzView.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/gdk/quartz/GdkQuartzView.c b/gdk/quartz/GdkQuartzView.c index f82c72a7b0..931d64c71b 100644 --- a/gdk/quartz/GdkQuartzView.c +++ b/gdk/quartz/GdkQuartzView.c @@ -266,6 +266,9 @@ if (trackingRect) { [self removeTrackingRect: trackingRect]; +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 10500 + [(NSTrackingArea*)trackingRect release]; +#endif trackingRect = 0; } @@ -472,13 +475,19 @@ copy_rectangle_argb32 (cairo_surface_t *dest, cairo_surface_t *source, { GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (gdk_window->impl); NSRect rect; - +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 10500 + NSTrackingArea *trackingArea; +#endif + if (!impl || !impl->toplevel) return; if (trackingRect) { [self removeTrackingRect: trackingRect]; +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 10500 + [(NSTrackingArea*)trackingRect release]; +#endif trackingRect = 0; } @@ -490,10 +499,19 @@ copy_rectangle_argb32 (cairo_surface_t *dest, cairo_surface_t *source, */ rect = [self bounds]; +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 10500 + trackingArea = [[NSTrackingArea alloc] initWithRect: rect + options: NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingCursorUpdate | NSTrackingActiveInActiveApp | NSTrackingInVisibleRect | NSTrackingEnabledDuringMouseDrag + owner: self + userInfo: nil]; + [self addTrackingArea: trackingArea]; + trackingRect = (NSInteger)[trackingArea retain]; +#else trackingRect = [self addTrackingRect: rect owner: self userData: nil assumeInside: NO]; +#endif } -(void)viewDidMoveToWindow @@ -509,6 +527,9 @@ copy_rectangle_argb32 (cairo_surface_t *dest, cairo_surface_t *source, if (newWindow == nil && trackingRect) { [self removeTrackingRect: trackingRect]; +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 10500 + [(NSTrackingArea*)trackingRect release]; +#endif trackingRect = 0; } } From ce99b56f257a22d334667994568c0dd558795468 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Tue, 29 Nov 2022 11:44:27 -0800 Subject: [PATCH 3/4] [quartz] Update known and latest macOS version to macOS 13 Ventura. --- gdk/quartz/gdkquartz.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gdk/quartz/gdkquartz.h b/gdk/quartz/gdkquartz.h index 2d53dcbce6..60139c5de3 100644 --- a/gdk/quartz/gdkquartz.h +++ b/gdk/quartz/gdkquartz.h @@ -43,7 +43,8 @@ typedef enum GDK_OSX_CATALINA = 15, GDK_OSX_BIGSUR = 16, GDK_OSX_MONTEREY = 17, - GDK_OSX_CURRENT = 17, + GDK_OSX_VENTURA = 18, + GDK_OSX_CURRENT = 18, GDK_OSX_NEW = 99 } GdkOSXVersion; From 7e1a3ffa37abb6d29b2f5216db68c0f362631b05 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Sat, 19 Nov 2022 16:25:28 -0800 Subject: [PATCH 4/4] [quartz] Work around macOS 13 not sending trackingArea events. Fixes #5305 --- gdk/quartz/gdkevents-quartz.c | 41 +++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c index 73ab40054f..60e9eaf131 100644 --- a/gdk/quartz/gdkevents-quartz.c +++ b/gdk/quartz/gdkevents-quartz.c @@ -850,10 +850,43 @@ find_window_for_ns_event (NSEvent *nsevent, /* Only handle our own entered/exited events, not the ones for the * titlebar buttons. */ - if ([view trackingRect] == [nsevent trackingNumber]) - return toplevel; - else - return NULL; + if ([view trackingRect] == nsevent.trackingNumber) + return toplevel; + + /* MacOS 13 isn't sending the trackingArea events so we have to + * rely on the cursorRect events that we discarded in earlier + * macOS versions. These trigger 4 pixels out from the window's + * frame so we obtain that rect and adjust it for hit testing. + */ + if (!nsevent.trackingArea && gdk_quartz_osx_version >= GDK_OSX_VENTURA) + { + static const int border_width = 4; + NSRect frame = nsevent.window.frame; + gboolean inside, at_edge; + + frame.origin.x -= border_width; + frame.origin.y -= border_width; + frame.size.width += 2 * border_width; + frame.size.height += 2 * border_width; + inside = + screen_point.x >= frame.origin.x && + screen_point.x <= frame.origin.x + frame.size.width && + screen_point.y >= frame.origin.y && + screen_point.y <= frame.origin.y + frame.size.height; + at_edge = + screen_point.x >= frame.origin.x - 1 && + screen_point.x <= frame.origin.x + frame.size.width + 1 && + screen_point.y >= frame.origin.y - 1 && + screen_point.y <= frame.origin.y + frame.size.height + 1; + + if ((event_type == GDK_QUARTZ_MOUSE_ENTERED && inside) || + at_edge) + return toplevel; + else + return NULL; + } + + return NULL; case GDK_QUARTZ_KEY_DOWN: case GDK_QUARTZ_KEY_UP: