[gtk+/client-side-windows: 157/284] First cut at getting events working



commit 89f1cb51780f1f250225371650b697296b56f5b7
Author: Richard Hult <richard imendio com>
Date:   Wed Jan 21 19:09:34 2009 +0100

    First cut at getting events working
---
 gdk/quartz/gdkevents-quartz.c |   82 +++++++++++++++++++++++-----------------
 1 files changed, 47 insertions(+), 35 deletions(-)

diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c
index a0dc2e2..91932b8 100644
--- a/gdk/quartz/gdkevents-quartz.c
+++ b/gdk/quartz/gdkevents-quartz.c
@@ -919,8 +919,21 @@ find_window_for_ns_event (NSEvent *nsevent,
                           gint    *x, 
                           gint    *y)
 {
+  GdkWindow *toplevel;
+  GdkWindowObject *private;
+  GdkWindowImplQuartz *impl;
+  NSPoint point;
   NSEventType event_type;
 
+  toplevel = [(GdkQuartzView *)[[nsevent window] contentView] gdkWindow];
+  private = GDK_WINDOW_OBJECT (toplevel);
+  impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+
+  point = [nsevent locationInWindow];
+
+  *x = point.x;
+  *y = private->height - point.y;
+
   event_type = [nsevent type];
 
   switch (event_type)
@@ -953,7 +966,7 @@ find_window_for_ns_event (NSEvent *nsevent,
 	 * This means we first try the owner, then the grab window,
 	 * then give up.
 	 */
-	if (_gdk_quartz_pointer_grab_window)
+	if (0 && _gdk_quartz_pointer_grab_window) /* FIXME: Implement grabs? */
 	  {
 	    if (pointer_grab_owner_events)
 	      {
@@ -1003,40 +1016,32 @@ find_window_for_ns_event (NSEvent *nsevent,
 	else 
 	  {
 	    /* The non-grabbed case. */
-            mouse_window = find_mouse_window_for_ns_event (nsevent, x, y);
-	    event_mask = get_event_mask_from_ns_event (nsevent);
-	    real_window = find_window_interested_in_event_mask (mouse_window, event_mask, TRUE);
-	    
-	    /* We have to translate the coordinates if the actual
-	     * window is different from the mouse window.
-	     */
-	    if (mouse_window && real_window && mouse_window != real_window)
-	      get_ancestor_coordinates_from_child (mouse_window,
-						   *x, *y,
-						   real_window,
-						   x, y);
-
-	    return real_window;
+
+            /* Leave events above the window (e.g. possibly on the titlebar)
+             * to cocoa.
+             */
+            if (*y < 0)
+              return NULL;
+
+            /* FIXME: Also need to leave resize events to cocoa somehow? */
+
+            return toplevel;
 	  }
       }
       break;
       
     case NSMouseEntered:
     case NSMouseExited:
-      /* Already handled in synthesize_crossing_events_for_ns_event. */
-      break;
+      return toplevel;
 
     case NSKeyDown:
     case NSKeyUp:
     case NSFlagsChanged:
       {
-	GdkEventMask event_mask;
-
 	if (_gdk_quartz_keyboard_grab_window && !keyboard_grab_owner_events)
 	  return _gdk_quartz_keyboard_grab_window;
 
-	event_mask = get_event_mask_from_ns_event (nsevent);
-	return find_window_interested_in_event_mask (current_keyboard_window, event_mask, TRUE);
+        return toplevel;
       }
       break;
 
@@ -1332,7 +1337,11 @@ synthesize_crossing_event (GdkWindow *window,
 
   private = GDK_WINDOW_OBJECT (window);
 
-  /* FIXME: Do we need to handle grabs here? */
+  /* FIXME: had this before csw:
+     _gdk_quartz_events_update_mouse_window (window);
+     if (window && !_gdk_quartz_pointer_grab_window)
+       _gdk_quartz_events_update_cursor (window);
+  */
 
   switch ([nsevent type])
     {
@@ -1414,11 +1423,12 @@ gdk_event_translate (GdkEvent *event,
     }
 
   /* Handle our generated "fake" crossing events. */
-  if ([nsevent type] == NSApplicationDefined && 
+  if ([nsevent type] == NSApplicationDefined &&
       [nsevent subtype] == GDK_QUARTZ_EVENT_SUBTYPE_FAKE_CROSSING)
     {
+      /* FIXME: This needs to actually fill in the event we have... */
       _gdk_quartz_events_trigger_crossing_events (FALSE);
-      return TRUE;
+      return FALSE; /* ...and return TRUE instead. */
     }
 
   /* Keep track of button state, since we don't get that information
@@ -1440,8 +1450,6 @@ gdk_event_translate (GdkEvent *event,
       break;
     }
 
-  nswindow = [nsevent window];
-
   if (_gdk_default_filters)
     {
       /* Apply global filters */
@@ -1455,6 +1463,8 @@ gdk_event_translate (GdkEvent *event,
         }
     }
 
+  nswindow = [nsevent window];
+
   /* Ignore events for no window or ones not created by GDK. */
   if (!nswindow || ![[nswindow contentView] isKindOfClass:[GdkQuartzView class]])
     return FALSE;
@@ -1498,15 +1508,16 @@ gdk_event_translate (GdkEvent *event,
 	}
     }
 
-  /* We need the appliction to be activated on clicks so that popups
-   * like context menus get events routed properly. This is handled
-   * automatically for left mouse button presses but not other
-   * buttons, so we do it here.
+  /* We only activate the application on click if it's not already active,
+   * this matches most use cases of native apps (no click-through).
    */
-  if ([nsevent type] == NSRightMouseDown || [nsevent type] == NSOtherMouseDown)
+  if (([nsevent type] == NSRightMouseDown ||
+       [nsevent type] == NSOtherMouseDown ||
+       [nsevent type] == NSLeftMouseDown) && ![NSApp isActive])
     {
-      if (![NSApp isActive])
-        [NSApp activateIgnoringOtherApps:YES];
+      [NSApp activateIgnoringOtherApps:YES];
+      return_val = FALSE;
+      goto done;
     }
 
   current_event_mask = get_event_mask_from_ns_event (nsevent);
@@ -1525,7 +1536,7 @@ gdk_event_translate (GdkEvent *event,
 	 * in its mask, like X.
 	 */
 	event_mask = (GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
-	if (!_gdk_quartz_pointer_grab_window &&
+	if (0 && !_gdk_quartz_pointer_grab_window && /* FIXME: add back for grabs? */
 	    (GDK_WINDOW_OBJECT (window)->event_mask & event_mask) == event_mask)
 	  {
 	    pointer_grab_internal (window, FALSE,
@@ -1543,7 +1554,7 @@ gdk_event_translate (GdkEvent *event,
       fill_button_event (window, event, nsevent, x, y);
       
       /* Ungrab implicit grab */
-      if (_gdk_quartz_pointer_grab_window && pointer_grab_implicit)
+      if (0 && _gdk_quartz_pointer_grab_window && pointer_grab_implicit) /* FIXME: add back? */
 	pointer_ungrab_internal (TRUE);
       break;
 
@@ -1603,6 +1614,7 @@ gdk_event_translate (GdkEvent *event,
 
     default:
       /* Ignore everything elsee. */
+      return_val = FALSE;
       break;
     }
 



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