macos: use input_region to specify tracking areas
authorChristian Hergert <christian@hergert.me>
Sat, 5 Feb 2022 01:24:13 +0000 (17:24 -0800)
committerChristian Hergert <christian@hergert.me>
Wed, 16 Feb 2022 11:07:51 +0000 (03:07 -0800)
We want our tracking area to be limited to the input region so that we
don't pass along events outside of them for the window. This improves the
chances we click-out of a popover with a large shadow.

This still doesn't let us pass-through clicks for large shadows on top-
level windows though.

gdk/macos/GdkMacosBaseView.c
gdk/macos/GdkMacosBaseView.h
gdk/macos/gdkmacossurface.c

index ddce1241a32ef7cacc3f7c8224cdbfd0eca6108d..a86d9712b24d2f93049b450e47b19264b5f464eb 100644 (file)
@@ -45,7 +45,6 @@
 
       options = (NSTrackingMouseEnteredAndExited |
                  NSTrackingMouseMoved |
-                 NSTrackingInVisibleRect |
                  NSTrackingActiveAlways);
       trackingArea = [[NSTrackingArea alloc] initWithRect:rect
                                                   options:options
   return self;
 }
 
+-(void)setInputArea:(const cairo_rectangle_int_t *)area
+{
+  NSRect rect = NSMakeRect (area->x, area->y, area->width, area->height);
+  NSTrackingAreaOptions options;
+
+  [self removeTrackingArea:trackingArea];
+
+  options = (NSTrackingMouseEnteredAndExited |
+             NSTrackingMouseMoved |
+             NSTrackingActiveAlways);
+  trackingArea = [[NSTrackingArea alloc] initWithRect:rect
+                                              options:options
+                                                owner:(id)self
+                                             userInfo:nil];
+  [self addTrackingArea:trackingArea];
+}
+
 -(void)setOpaqueRegion:(cairo_region_t *)region
 {
-  /* Do nothing */
+  /* Handled in Subclass */
 }
 
 -(BOOL)acceptsFirstMouse
index 7fcfc7e43be197a7aa8d730ca69afa682295dde3..2eb6f72721bd63cdb82e1c44f2572082a6e31d5b 100644 (file)
@@ -42,5 +42,6 @@
 -(void)setNeedsInvalidateShadow: (BOOL)invalidate;
 -(NSTrackingArea *)trackingArea;
 -(void)setOpaqueRegion:(cairo_region_t *)region;
+-(void)setInputArea:(const cairo_rectangle_int_t *)area;
 
 @end
index b28fb27083b1af0d46b15716cf148a47aad08b2f..a2c7bb485def42bfa9c00e4b2c5996d9b8496f23 100644 (file)
@@ -94,6 +94,17 @@ static void
 gdk_macos_surface_set_input_region (GdkSurface     *surface,
                                     cairo_region_t *region)
 {
+  GdkMacosSurface *self = (GdkMacosSurface *)surface;
+  cairo_rectangle_int_t rect;
+
+  g_assert (GDK_IS_MACOS_SURFACE (self));
+
+  if (self->window == NULL)
+    return;
+
+  cairo_region_get_extents (region, &rect);
+
+  [(GdkMacosBaseView *)[self->window contentView] setInputArea:&rect];
 }
 
 static void