[gtk/wip/chergert/quartz4u] macos: use tracking areas instead of tracking rect



commit a9a4f2377c9afed56bbb6af74429f129c1f3f7c7
Author: Christian Hergert <chergert redhat com>
Date:   Thu May 7 16:23:52 2020 -0700

    macos: use tracking areas instead of tracking rect
    
    trackingRect is the pre 10.5 way of doing things, and we can easily drop
    that from anything new we're writing.

 gdk/macos/GdkMacosBaseView.c | 71 +++++++++++++-------------------------------
 gdk/macos/GdkMacosBaseView.h |  5 ++--
 gdk/macos/GdkMacosWindow.c   | 17 +++++------
 3 files changed, 29 insertions(+), 64 deletions(-)
---
diff --git a/gdk/macos/GdkMacosBaseView.c b/gdk/macos/GdkMacosBaseView.c
index af8a8f8f96..730923ed3f 100644
--- a/gdk/macos/GdkMacosBaseView.c
+++ b/gdk/macos/GdkMacosBaseView.c
@@ -49,14 +49,32 @@
 {
   if ((self = [super initWithFrame: frameRect]))
     {
+      NSRect rect = NSMakeRect (0, 0, 0, 0);
+      NSTrackingAreaOptions options;
+
       markedRange = NSMakeRange (NSNotFound, 0);
       selectedRange = NSMakeRange (0, 0);
       [self setValue: @(YES) forKey: @"postsFrameChangedNotifications"];
+
+      options = (NSTrackingMouseEnteredAndExited |
+                 NSTrackingMouseMoved |
+                 NSTrackingInVisibleRect |
+                 NSTrackingActiveAlways);
+      trackingArea = [[NSTrackingArea alloc] initWithRect:rect
+                                                  options:options
+                                                    owner:(id)self
+                                                 userInfo:nil];
+      [self addTrackingArea:trackingArea];
     }
 
   return self;
 }
 
+-(BOOL)acceptsFirstMouse
+{
+  return YES;
+}
+
 -(BOOL)acceptsFirstResponder
 {
   GDK_NOTE (EVENTS, g_message ("acceptsFirstResponder"));
@@ -80,58 +98,9 @@
   needsInvalidateShadow = invalidate;
 }
 
-/* For information on setting up tracking rects properly, see here:
- * http://developer.apple.com/documentation/Cocoa/Conceptual/EventOverview/EventOverview.pdf
- */
--(void)updateTrackingRect
+-(NSTrackingArea *)trackingArea
 {
-  NSRect rect;
-
-  if (trackingRect)
-    {
-      [self removeTrackingRect: trackingRect];
-      trackingRect = 0;
-    }
-
-  /* Note, if we want to set assumeInside we can use:
-   * NSPointInRect ([[self window] convertScreenToBase:[NSEvent mouseLocation]], rect)
-   */
-
-  rect = [self bounds];
-  trackingRect = [self addTrackingRect: rect
-                                             owner: self
-                                          userData: nil
-                                      assumeInside: NO];
-}
-
--(NSTrackingRectTag)trackingRect
-{
-  return trackingRect;
-}
-
--(void)viewDidMoveToWindow
-{
-  if (![self window]) /* We are destroyed already */
-    return;
-
-  [self updateTrackingRect];
-}
-
--(void)viewWillMoveToWindow: (NSWindow *)newWindow
-{
-  if (newWindow == nil && trackingRect)
-    {
-      [self removeTrackingRect: trackingRect];
-      trackingRect = 0;
-    }
-}
-
--(void)setFrame: (NSRect)frame
-{
-  [super setFrame: frame];
-
-  if ([self window])
-    [self updateTrackingRect];
+  return trackingArea;
 }
 
 -(GdkMacosSurface *)getGdkSurface
diff --git a/gdk/macos/GdkMacosBaseView.h b/gdk/macos/GdkMacosBaseView.h
index 3e07d2ae6a..4617135a85 100644
--- a/gdk/macos/GdkMacosBaseView.h
+++ b/gdk/macos/GdkMacosBaseView.h
@@ -29,7 +29,7 @@
 
 @interface GdkMacosBaseView : NSView
 {
-  NSTrackingRectTag trackingRect;
+  NSTrackingArea *trackingArea;
   BOOL needsInvalidateShadow;
   NSRange markedRange;
   NSRange selectedRange;
@@ -38,7 +38,6 @@
 -(GdkMacosSurface *)getGdkSurface;
 -(GdkMacosDisplay *)getGdkDisplay;
 -(void)setNeedsInvalidateShadow: (BOOL)invalidate;
--(void)updateTrackingRect;
--(NSTrackingRectTag)trackingRect;
+-(NSTrackingArea *)trackingArea;
 
 @end
diff --git a/gdk/macos/GdkMacosWindow.c b/gdk/macos/GdkMacosWindow.c
index c1b93c615b..da120193d6 100644
--- a/gdk/macos/GdkMacosWindow.c
+++ b/gdk/macos/GdkMacosWindow.c
@@ -131,10 +131,11 @@
 
 -(void)sendEvent:(NSEvent *)event
 {
-  switch ((int)[event type])
-    {
-    case NSEventTypeLeftMouseUp:
+  NSEventType event_type = [event type];
+
+  switch ((int)event_type)
     {
+    case NSEventTypeLeftMouseUp: {
       GdkDisplay *display = gdk_surface_get_display (GDK_SURFACE (gdkSurface));
       double time = ((double)[event timestamp]) * 1000.0;
 
@@ -186,7 +187,7 @@
                                      windowNumber: [self windowNumber]
                                           context: NULL
                                       eventNumber: 0
-                                   trackingNumber: [view trackingRect]
+                                   trackingNumber: (NSInteger)[view trackingArea]
                                          userData: nil];
 
           [NSApp postEvent:event atStart:NO];
@@ -241,16 +242,14 @@
 
   [[self contentView] setFrame:NSMakeRect (0, 0, surface->width, surface->height)];
 
+  _gdk_surface_update_size (surface);
+
   /* Synthesize a configure event */
   event = gdk_configure_event_new (surface,
                                    content_rect.size.width,
                                    content_rect.size.height);
   _gdk_event_queue_append (display, event);
 
-  surface->width = content_rect.size.width;
-  surface->height = content_rect.size.height;
-  _gdk_surface_update_size (surface);
-
   [self checkSendEnterNotify];
 }
 
@@ -301,8 +300,6 @@
   inShowOrHide = NO;
 
   [self checkSendEnterNotify];
-
-  [(GdkMacosBaseView *)[self contentView] updateTrackingRect];
 }
 
 -(void)hide


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]