Append the event to the queue instead of using gdk_event_put.
2006-07-20 Richard Hult <richard@imendio.com> * gdk/quartz/gdkevents-quartz.c: (generate_grab_broken_event): Append the event to the queue instead of using gdk_event_put. (_gdk_quartz_get_mouse_window, find_current_keyboard_window): Handle grabs. (get_event_mask_from_ns_event, create_focus_event) (convert_window_coordinates_to_root, find_window_for_event) (gdk_event_translate): Improve readability (style changes). (gdk_flush, gdk_display_sync, gdk_display_flush) (gdk_event_send_client_message_for_display), (gdk_screen_broadcast_client_message): Remove FIXMEs. (gdk_screen_get_setting): Reindent. Also move find_child_window_by_point to gdkwindow-quartz.c. * gdk/quartz/gdkwindow-quartz.c: (find_child_window_by_point_helper), (_gdk_quartz_find_child_window_by_point): Move here from gdkevents-quartz.c (_gdk_windowing_window_get_pointer): Handle destroyed windows and imlement the return value. (_gdk_windowing_window_at_pointer): Implement.
This commit is contained in:
		
				
					committed by
					
						
						Richard Hult
					
				
			
			
				
	
			
			
			
						parent
						
							456b9fbc95
						
					
				
				
					commit
					cb5f9e62e9
				
			
							
								
								
									
										23
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								ChangeLog
									
									
									
									
									
								
							@ -1,3 +1,26 @@
 | 
			
		||||
2006-07-20  Richard Hult  <richard@imendio.com>
 | 
			
		||||
 | 
			
		||||
	* gdk/quartz/gdkevents-quartz.c: (generate_grab_broken_event):
 | 
			
		||||
	Append the event to the queue instead of using gdk_event_put.
 | 
			
		||||
	(_gdk_quartz_get_mouse_window, find_current_keyboard_window):
 | 
			
		||||
	Handle grabs.
 | 
			
		||||
	(get_event_mask_from_ns_event, create_focus_event)
 | 
			
		||||
	(convert_window_coordinates_to_root, find_window_for_event)
 | 
			
		||||
	(gdk_event_translate): Improve readability (style changes).
 | 
			
		||||
	(gdk_flush, gdk_display_sync, gdk_display_flush)
 | 
			
		||||
	(gdk_event_send_client_message_for_display),
 | 
			
		||||
	(gdk_screen_broadcast_client_message): Remove FIXMEs.	
 | 
			
		||||
	(gdk_screen_get_setting): Reindent.
 | 
			
		||||
	Also move find_child_window_by_point to gdkwindow-quartz.c.
 | 
			
		||||
	
 | 
			
		||||
	* gdk/quartz/gdkwindow-quartz.c:
 | 
			
		||||
	(find_child_window_by_point_helper),
 | 
			
		||||
	(_gdk_quartz_find_child_window_by_point): Move here from 
 | 
			
		||||
	gdkevents-quartz.c
 | 
			
		||||
	(_gdk_windowing_window_get_pointer): Handle destroyed windows and
 | 
			
		||||
	imlement the return value.
 | 
			
		||||
	(_gdk_windowing_window_at_pointer): Implement.
 | 
			
		||||
 | 
			
		||||
2006-07-19  Richard Hult  <richard@imendio.com>
 | 
			
		||||
 | 
			
		||||
	* gtk/gtkdnd-quartz.c (register_types): Reindent.
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,26 @@
 | 
			
		||||
2006-07-20  Richard Hult  <richard@imendio.com>
 | 
			
		||||
 | 
			
		||||
	* gdk/quartz/gdkevents-quartz.c: (generate_grab_broken_event):
 | 
			
		||||
	Append the event to the queue instead of using gdk_event_put.
 | 
			
		||||
	(_gdk_quartz_get_mouse_window, find_current_keyboard_window):
 | 
			
		||||
	Handle grabs.
 | 
			
		||||
	(get_event_mask_from_ns_event, create_focus_event)
 | 
			
		||||
	(convert_window_coordinates_to_root, find_window_for_event)
 | 
			
		||||
	(gdk_event_translate): Improve readability (style changes).
 | 
			
		||||
	(gdk_flush, gdk_display_sync, gdk_display_flush)
 | 
			
		||||
	(gdk_event_send_client_message_for_display),
 | 
			
		||||
	(gdk_screen_broadcast_client_message): Remove FIXMEs.	
 | 
			
		||||
	(gdk_screen_get_setting): Reindent.
 | 
			
		||||
	Also move find_child_window_by_point to gdkwindow-quartz.c.
 | 
			
		||||
	
 | 
			
		||||
	* gdk/quartz/gdkwindow-quartz.c:
 | 
			
		||||
	(find_child_window_by_point_helper),
 | 
			
		||||
	(_gdk_quartz_find_child_window_by_point): Move here from 
 | 
			
		||||
	gdkevents-quartz.c
 | 
			
		||||
	(_gdk_windowing_window_get_pointer): Handle destroyed windows and
 | 
			
		||||
	imlement the return value.
 | 
			
		||||
	(_gdk_windowing_window_at_pointer): Implement.
 | 
			
		||||
 | 
			
		||||
2006-07-19  Richard Hult  <richard@imendio.com>
 | 
			
		||||
 | 
			
		||||
	* gtk/gtkdnd-quartz.c (register_types): Reindent.
 | 
			
		||||
 | 
			
		||||
@ -52,6 +52,8 @@ static gboolean pointer_grab_implicit;
 | 
			
		||||
GdkWindow *_gdk_quartz_keyboard_grab_window;
 | 
			
		||||
static gboolean keyboard_grab_owner_events;
 | 
			
		||||
 | 
			
		||||
static void append_event (GdkEvent *event);
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
gdk_event_prepare (GSource *source,
 | 
			
		||||
		   gint    *timeout)
 | 
			
		||||
@ -345,20 +347,18 @@ generate_grab_broken_event (GdkWindow *window,
 | 
			
		||||
{
 | 
			
		||||
  if (!GDK_WINDOW_DESTROYED (window))
 | 
			
		||||
    {
 | 
			
		||||
      GdkEvent event;
 | 
			
		||||
      GdkEvent *event = gdk_event_new (GDK_GRAB_BROKEN);
 | 
			
		||||
 | 
			
		||||
      event.type = GDK_GRAB_BROKEN;
 | 
			
		||||
      event.grab_broken.window = window;
 | 
			
		||||
      event.grab_broken.send_event = 0;
 | 
			
		||||
      event.grab_broken.keyboard = keyboard;
 | 
			
		||||
      event.grab_broken.implicit = implicit;
 | 
			
		||||
      event.grab_broken.grab_window = grab_window;
 | 
			
		||||
      event->grab_broken.window = window;
 | 
			
		||||
      event->grab_broken.send_event = 0;
 | 
			
		||||
      event->grab_broken.keyboard = keyboard;
 | 
			
		||||
      event->grab_broken.implicit = implicit;
 | 
			
		||||
      event->grab_broken.grab_window = grab_window;
 | 
			
		||||
      
 | 
			
		||||
      gdk_event_put (&event);
 | 
			
		||||
      append_event (event);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GdkGrabStatus
 | 
			
		||||
gdk_keyboard_grab (GdkWindow  *window,
 | 
			
		||||
		   gint        owner_events,
 | 
			
		||||
@ -422,7 +422,6 @@ pointer_ungrab_internal (gboolean implicit)
 | 
			
		||||
  /* FIXME: Send crossing events */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
gdk_display_pointer_is_grabbed (GdkDisplay *display)
 | 
			
		||||
{
 | 
			
		||||
@ -564,69 +563,17 @@ apply_filters (GdkWindow  *window,
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static GdkWindow *
 | 
			
		||||
find_child_window_by_point_helper (GdkWindow *window, int x, int y, int x_offset, int y_offset, int *x_ret, int *y_ret)
 | 
			
		||||
{
 | 
			
		||||
  GList *children;
 | 
			
		||||
 | 
			
		||||
  for (children = GDK_WINDOW_OBJECT (window)->children;
 | 
			
		||||
       children; children = children->next)
 | 
			
		||||
    {
 | 
			
		||||
      GdkWindowObject *private = GDK_WINDOW_OBJECT (children->data);
 | 
			
		||||
      GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
 | 
			
		||||
      int temp_x, temp_y;
 | 
			
		||||
 | 
			
		||||
      if (!GDK_WINDOW_IS_MAPPED (private))
 | 
			
		||||
	continue;
 | 
			
		||||
 | 
			
		||||
      temp_x = x_offset + private->x;
 | 
			
		||||
      temp_y = y_offset + private->y;
 | 
			
		||||
 | 
			
		||||
      /* FIXME: Are there off by one errors here? */
 | 
			
		||||
      if (x >= temp_x && y >= temp_y &&
 | 
			
		||||
	  x < temp_x + impl->width && y < temp_y + impl->height) 
 | 
			
		||||
	{
 | 
			
		||||
	  *x_ret = x - x_offset - private->x;
 | 
			
		||||
	  *y_ret = y - y_offset - private->y;
 | 
			
		||||
	  
 | 
			
		||||
	  /* Look for child windows */
 | 
			
		||||
	  return find_child_window_by_point_helper (GDK_WINDOW (children->data), x, y, temp_x, temp_y, x_ret, y_ret);
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
  
 | 
			
		||||
  return window;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Given a toplevel window and coordinates, returns the window
 | 
			
		||||
 * in which the point is.
 | 
			
		||||
 */
 | 
			
		||||
static GdkWindow *
 | 
			
		||||
find_child_window_by_point (GdkWindow *toplevel, int x, int y, int *x_ret, int *y_ret)
 | 
			
		||||
{
 | 
			
		||||
  GdkWindowObject *private = (GdkWindowObject *)toplevel;
 | 
			
		||||
  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
 | 
			
		||||
 | 
			
		||||
  /* If the point is in the title bar, ignore it */
 | 
			
		||||
  if (y > impl->height)
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
  /* FIXME: Check this for off-by-one errors */
 | 
			
		||||
  /* First flip the y coordinate */
 | 
			
		||||
  y = impl->height - y;
 | 
			
		||||
 | 
			
		||||
  return find_child_window_by_point_helper (toplevel, x, y, 0, 0, x_ret, y_ret);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Returns the current keyboard window */
 | 
			
		||||
static GdkWindow *
 | 
			
		||||
find_current_keyboard_window (void)
 | 
			
		||||
{
 | 
			
		||||
  /* FIXME: Handle keyboard grabs */
 | 
			
		||||
  if (_gdk_quartz_keyboard_grab_window && keyboard_grab_owner_events)
 | 
			
		||||
    return _gdk_quartz_keyboard_grab_window;
 | 
			
		||||
  
 | 
			
		||||
  return current_keyboard_window;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* this function checks if the passed in window is interested in the
 | 
			
		||||
/* This function checks if the passed in window is interested in the
 | 
			
		||||
 * event mask. If so, it's returned. If not, the event can be propagated
 | 
			
		||||
 * to its parent.
 | 
			
		||||
 */
 | 
			
		||||
@ -679,9 +626,7 @@ convert_mouse_button_number (int button)
 | 
			
		||||
static GdkEventMask
 | 
			
		||||
get_event_mask_from_ns_event (NSEvent *nsevent)
 | 
			
		||||
{
 | 
			
		||||
  NSEventType event_type = [nsevent type];
 | 
			
		||||
 | 
			
		||||
  switch (event_type)
 | 
			
		||||
  switch ([nsevent type])
 | 
			
		||||
    {
 | 
			
		||||
    case NSLeftMouseDown:
 | 
			
		||||
    case NSRightMouseDown:
 | 
			
		||||
@ -707,8 +652,12 @@ get_event_mask_from_ns_event (NSEvent *nsevent)
 | 
			
		||||
	     GDK_BUTTON_MOTION_MASK|GDK_BUTTON3_MOTION_MASK;
 | 
			
		||||
    case NSOtherMouseDragged:
 | 
			
		||||
      {
 | 
			
		||||
	GdkEventMask mask = GDK_POINTER_MOTION_MASK|GDK_POINTER_MOTION_HINT_MASK|
 | 
			
		||||
	                    GDK_BUTTON_MOTION_MASK;
 | 
			
		||||
	GdkEventMask mask;
 | 
			
		||||
 | 
			
		||||
	mask = (GDK_POINTER_MOTION_MASK |
 | 
			
		||||
		GDK_POINTER_MOTION_HINT_MASK |
 | 
			
		||||
		GDK_BUTTON_MOTION_MASK);
 | 
			
		||||
 | 
			
		||||
	if (convert_mouse_button_number ([nsevent buttonNumber]) == 2)
 | 
			
		||||
	  mask |= GDK_BUTTON2_MOTION_MASK;
 | 
			
		||||
 | 
			
		||||
@ -718,13 +667,16 @@ get_event_mask_from_ns_event (NSEvent *nsevent)
 | 
			
		||||
    case NSKeyUp:
 | 
			
		||||
    case NSFlagsChanged:
 | 
			
		||||
      {
 | 
			
		||||
        GdkEventType type = _gdk_quartz_key_event_type (nsevent);
 | 
			
		||||
        switch (type)
 | 
			
		||||
        switch (_gdk_quartz_key_event_type (nsevent))
 | 
			
		||||
	  {
 | 
			
		||||
            case GDK_KEY_PRESS:   return GDK_KEY_PRESS_MASK;
 | 
			
		||||
            case GDK_KEY_RELEASE: return GDK_KEY_RELEASE_MASK;
 | 
			
		||||
            case GDK_NOTHING:     return 0;
 | 
			
		||||
            default: g_assert_not_reached ();
 | 
			
		||||
	  case GDK_KEY_PRESS:
 | 
			
		||||
	    return GDK_KEY_PRESS_MASK;
 | 
			
		||||
	  case GDK_KEY_RELEASE:
 | 
			
		||||
	    return GDK_KEY_RELEASE_MASK;
 | 
			
		||||
	  case GDK_NOTHING:
 | 
			
		||||
	    return 0;
 | 
			
		||||
	  default:
 | 
			
		||||
	    g_assert_not_reached ();
 | 
			
		||||
	  }
 | 
			
		||||
      }
 | 
			
		||||
    default:
 | 
			
		||||
@ -742,7 +694,6 @@ create_focus_event (GdkWindow *window,
 | 
			
		||||
 | 
			
		||||
  event = gdk_event_new (GDK_FOCUS_CHANGE);
 | 
			
		||||
  event->focus_change.window = window;
 | 
			
		||||
  /* FIXME: send event */
 | 
			
		||||
  event->focus_change.in = in;
 | 
			
		||||
 | 
			
		||||
  return event;
 | 
			
		||||
@ -821,8 +772,11 @@ get_keyboard_modifiers_from_nsevent (NSEvent *nsevent)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
convert_window_coordinates_to_root (GdkWindow *window, gdouble x, gdouble y,
 | 
			
		||||
				    gdouble *x_root, gdouble *y_root)
 | 
			
		||||
convert_window_coordinates_to_root (GdkWindow *window,
 | 
			
		||||
				    gdouble    x,
 | 
			
		||||
				    gdouble    y,
 | 
			
		||||
				    gdouble   *x_root,
 | 
			
		||||
				    gdouble   *y_root)
 | 
			
		||||
{
 | 
			
		||||
  gint ox, oy;
 | 
			
		||||
 | 
			
		||||
@ -1017,7 +971,6 @@ synthesize_crossing_events (GdkWindow      *window,
 | 
			
		||||
  _gdk_quartz_update_mouse_window (window);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void 
 | 
			
		||||
_gdk_quartz_send_map_events (GdkWindow *window)
 | 
			
		||||
{
 | 
			
		||||
@ -1044,7 +997,9 @@ _gdk_quartz_send_map_events (GdkWindow *window)
 | 
			
		||||
GdkWindow *
 | 
			
		||||
_gdk_quartz_get_mouse_window (void)
 | 
			
		||||
{
 | 
			
		||||
  /* FIXME: What about grabs? */
 | 
			
		||||
  if (_gdk_quartz_pointer_grab_window)
 | 
			
		||||
    return _gdk_quartz_pointer_grab_window;
 | 
			
		||||
  
 | 
			
		||||
  return current_mouse_window;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1106,7 +1061,7 @@ find_window_for_event (NSEvent *nsevent, gint *x, gint *y)
 | 
			
		||||
      NSPoint point = [nsevent locationInWindow];
 | 
			
		||||
      GdkWindow *mouse_window;
 | 
			
		||||
 | 
			
		||||
      mouse_window = find_child_window_by_point (toplevel, point.x, point.y, x, y);
 | 
			
		||||
      mouse_window = _gdk_quartz_find_child_window_by_point (toplevel, point.x, point.y, x, y);
 | 
			
		||||
 | 
			
		||||
      if (!mouse_window)
 | 
			
		||||
	mouse_window = _gdk_root;
 | 
			
		||||
@ -1152,8 +1107,11 @@ find_window_for_event (NSEvent *nsevent, gint *x, gint *y)
 | 
			
		||||
	    if (pointer_grab_event_mask & get_event_mask_from_ns_event (nsevent))
 | 
			
		||||
	      {
 | 
			
		||||
		int tempx, tempy;
 | 
			
		||||
		GdkWindowObject *w = GDK_WINDOW_OBJECT (_gdk_quartz_pointer_grab_window);
 | 
			
		||||
		GdkWindowObject *grab_toplevel = GDK_WINDOW_OBJECT (gdk_window_get_toplevel (_gdk_quartz_pointer_grab_window));
 | 
			
		||||
		GdkWindowObject *w;
 | 
			
		||||
		GdkWindowObject *grab_toplevel;
 | 
			
		||||
 | 
			
		||||
		w = GDK_WINDOW_OBJECT (_gdk_quartz_pointer_grab_window);
 | 
			
		||||
		grab_toplevel = GDK_WINDOW_OBJECT (gdk_window_get_toplevel (_gdk_quartz_pointer_grab_window));
 | 
			
		||||
 | 
			
		||||
		tempx = point.x;
 | 
			
		||||
		tempy = GDK_WINDOW_IMPL_QUARTZ (grab_toplevel->impl)->height -
 | 
			
		||||
@ -1184,7 +1142,7 @@ find_window_for_event (NSEvent *nsevent, gint *x, gint *y)
 | 
			
		||||
	  }
 | 
			
		||||
        else
 | 
			
		||||
	  {
 | 
			
		||||
	    mouse_window = find_child_window_by_point (toplevel, point.x, point.y, x, y);
 | 
			
		||||
	    mouse_window = _gdk_quartz_find_child_window_by_point (toplevel, point.x, point.y, x, y);
 | 
			
		||||
	  }
 | 
			
		||||
 | 
			
		||||
	event_mask = get_event_mask_from_ns_event (nsevent);
 | 
			
		||||
@ -1202,7 +1160,7 @@ find_window_for_event (NSEvent *nsevent, gint *x, gint *y)
 | 
			
		||||
 | 
			
		||||
	toplevel = [(GdkQuartzView *)[nswindow contentView] gdkWindow];
 | 
			
		||||
 | 
			
		||||
	mouse_window = find_child_window_by_point (toplevel, point.x, point.y, x, y);
 | 
			
		||||
	mouse_window = _gdk_quartz_find_child_window_by_point (toplevel, point.x, point.y, x, y);
 | 
			
		||||
	
 | 
			
		||||
	synthesize_crossing_events (mouse_window, GDK_CROSSING_NORMAL, nsevent, *x, *y);
 | 
			
		||||
 | 
			
		||||
@ -1453,7 +1411,6 @@ gdk_event_translate (NSEvent *nsevent)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  window = find_window_for_event (nsevent, &x, &y);
 | 
			
		||||
 | 
			
		||||
  if (!window)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
@ -1548,15 +1505,17 @@ gdk_event_translate (NSEvent *nsevent)
 | 
			
		||||
    case NSKeyUp:
 | 
			
		||||
    case NSFlagsChanged:
 | 
			
		||||
      {
 | 
			
		||||
        GdkEventType type = _gdk_quartz_key_event_type (nsevent);
 | 
			
		||||
        GdkEventType type;
 | 
			
		||||
 | 
			
		||||
        type = _gdk_quartz_key_event_type (nsevent);
 | 
			
		||||
        if (type == GDK_NOTHING)
 | 
			
		||||
          return FALSE;
 | 
			
		||||
        
 | 
			
		||||
        event = create_key_event (window, nsevent, type);
 | 
			
		||||
        append_event (event);
 | 
			
		||||
        return TRUE;
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      NSLog(@"Untranslated: %@", nsevent);
 | 
			
		||||
    }
 | 
			
		||||
@ -1580,19 +1539,19 @@ _gdk_events_queue (GdkDisplay *display)
 | 
			
		||||
void
 | 
			
		||||
gdk_flush (void)
 | 
			
		||||
{
 | 
			
		||||
  gdk_display_flush (NULL);
 | 
			
		||||
  /* Not supported. */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
gdk_display_sync (GdkDisplay *display)
 | 
			
		||||
{
 | 
			
		||||
  /* FIXME: Implement */
 | 
			
		||||
  /* Not supported. */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
gdk_display_flush (GdkDisplay *display)
 | 
			
		||||
{
 | 
			
		||||
  /* FIXME: Implement */
 | 
			
		||||
  /* Not supported. */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
@ -1600,6 +1559,7 @@ gdk_event_send_client_message_for_display (GdkDisplay      *display,
 | 
			
		||||
					   GdkEvent        *event,
 | 
			
		||||
					   GdkNativeWindow  winid)
 | 
			
		||||
{
 | 
			
		||||
  /* Not supported. */
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1607,6 +1567,7 @@ void
 | 
			
		||||
gdk_screen_broadcast_client_message (GdkScreen *screen,
 | 
			
		||||
				     GdkEvent  *event)
 | 
			
		||||
{
 | 
			
		||||
  /* Not supported. */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
 | 
			
		||||
@ -103,14 +103,18 @@ void _gdk_quartz_set_context_stroke_color_from_pixel (CGContextRef context, GdkC
 | 
			
		||||
 | 
			
		||||
void _gdk_quartz_update_context_from_gc (CGContextRef context, GdkGC *gc);
 | 
			
		||||
 | 
			
		||||
void _gdk_quartz_update_focus_window (GdkWindow *new_window,
 | 
			
		||||
				      gboolean   got_focus);
 | 
			
		||||
 | 
			
		||||
gint        _gdk_quartz_get_inverted_screen_y      (gint y);
 | 
			
		||||
 | 
			
		||||
GdkWindow * _gdk_quartz_find_child_window_by_point (GdkWindow *toplevel,
 | 
			
		||||
						    int        x,
 | 
			
		||||
						    int        y,
 | 
			
		||||
						    int       *x_ret,
 | 
			
		||||
						    int       *y_ret);
 | 
			
		||||
 | 
			
		||||
void        _gdk_quartz_update_focus_window (GdkWindow *new_window,
 | 
			
		||||
					     gboolean   got_focus);
 | 
			
		||||
GdkWindow *_gdk_quartz_get_mouse_window     (void);
 | 
			
		||||
void       _gdk_quartz_update_mouse_window  (GdkWindow *window);
 | 
			
		||||
 | 
			
		||||
void       _gdk_quartz_update_cursor        (GdkWindow *window);
 | 
			
		||||
 | 
			
		||||
GdkImage *_gdk_quartz_copy_to_image (GdkDrawable *drawable,
 | 
			
		||||
 | 
			
		||||
@ -290,6 +290,72 @@ _gdk_quartz_get_inverted_screen_y (gint y)
 | 
			
		||||
  return rect.size.height - y;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static GdkWindow *
 | 
			
		||||
find_child_window_by_point_helper (GdkWindow *window,
 | 
			
		||||
				   int        x,
 | 
			
		||||
				   int        y,
 | 
			
		||||
				   int        x_offset,
 | 
			
		||||
				   int        y_offset,
 | 
			
		||||
				   int       *x_ret,
 | 
			
		||||
				   int       *y_ret)
 | 
			
		||||
{
 | 
			
		||||
  GList *l;
 | 
			
		||||
 | 
			
		||||
  for (l = GDK_WINDOW_OBJECT (window)->children; l; l = l->next)
 | 
			
		||||
    {
 | 
			
		||||
      GdkWindowObject *private = GDK_WINDOW_OBJECT (l->data);
 | 
			
		||||
      GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
 | 
			
		||||
      int temp_x, temp_y;
 | 
			
		||||
 | 
			
		||||
      if (!GDK_WINDOW_IS_MAPPED (private))
 | 
			
		||||
	continue;
 | 
			
		||||
 | 
			
		||||
      temp_x = x_offset + private->x;
 | 
			
		||||
      temp_y = y_offset + private->y;
 | 
			
		||||
      
 | 
			
		||||
      /* FIXME: Are there off by one errors here? */
 | 
			
		||||
      if (x >= temp_x && y >= temp_y &&
 | 
			
		||||
	  x < temp_x + impl->width && y < temp_y + impl->height) 
 | 
			
		||||
	{
 | 
			
		||||
	  *x_ret = x - x_offset - private->x;
 | 
			
		||||
	  *y_ret = y - y_offset - private->y;
 | 
			
		||||
	  
 | 
			
		||||
	  /* Look for child windows */
 | 
			
		||||
	  return find_child_window_by_point_helper (GDK_WINDOW (l->data),
 | 
			
		||||
						    x, y,
 | 
			
		||||
						    temp_x, temp_y,
 | 
			
		||||
						    x_ret, y_ret);
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return window;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Given a toplevel window and coordinates, returns the window
 | 
			
		||||
 * in which the point is. Note that x and y should be non-flipped
 | 
			
		||||
 * (and relative the toplevel), while the returned positions are
 | 
			
		||||
 * flipped.
 | 
			
		||||
 */
 | 
			
		||||
GdkWindow *
 | 
			
		||||
_gdk_quartz_find_child_window_by_point (GdkWindow *toplevel,
 | 
			
		||||
					int        x,
 | 
			
		||||
					int        y,
 | 
			
		||||
					int       *x_ret,
 | 
			
		||||
					int       *y_ret)
 | 
			
		||||
{
 | 
			
		||||
  GdkWindowObject *private = (GdkWindowObject *)toplevel;
 | 
			
		||||
  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
 | 
			
		||||
 | 
			
		||||
  /* If the point is in the title bar, ignore it */
 | 
			
		||||
  if (y > impl->height)
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
  /* First flip the y coordinate */
 | 
			
		||||
  y = impl->height - y;
 | 
			
		||||
 | 
			
		||||
  return find_child_window_by_point_helper (toplevel, x, y, 0, 0, x_ret, y_ret);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GdkWindow *
 | 
			
		||||
gdk_window_new (GdkWindow     *parent,
 | 
			
		||||
		GdkWindowAttr *attributes,
 | 
			
		||||
@ -435,7 +501,10 @@ gdk_window_new (GdkWindow     *parent,
 | 
			
		||||
	  style_mask = NSBorderlessWindowMask;
 | 
			
		||||
	  break;
 | 
			
		||||
	default:
 | 
			
		||||
	  style_mask = NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask;
 | 
			
		||||
	  style_mask = (NSTitledWindowMask |
 | 
			
		||||
			NSClosableWindowMask |
 | 
			
		||||
			NSMiniaturizableWindowMask |
 | 
			
		||||
			NSResizableWindowMask);
 | 
			
		||||
	} 
 | 
			
		||||
 | 
			
		||||
	impl->toplevel = [[GdkQuartzWindow alloc] initWithContentRect:content_rect 
 | 
			
		||||
@ -451,7 +520,6 @@ gdk_window_new (GdkWindow     *parent,
 | 
			
		||||
 | 
			
		||||
	gdk_window_set_title (window, title);
 | 
			
		||||
	  
 | 
			
		||||
	  
 | 
			
		||||
	if (draw_impl->colormap == gdk_screen_get_rgba_colormap (_gdk_screen))
 | 
			
		||||
	  {
 | 
			
		||||
	    [impl->toplevel setOpaque:NO];
 | 
			
		||||
@ -961,6 +1029,7 @@ _gdk_windowing_get_pointer (GdkDisplay       *display,
 | 
			
		||||
  _gdk_windowing_window_get_pointer (_gdk_display, _gdk_root, x, y, mask);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Returns coordinates relative to the upper left corner of window. */
 | 
			
		||||
GdkWindow *
 | 
			
		||||
_gdk_windowing_window_get_pointer (GdkDisplay      *display,
 | 
			
		||||
				   GdkWindow       *window,
 | 
			
		||||
@ -968,11 +1037,23 @@ _gdk_windowing_window_get_pointer (GdkDisplay      *display,
 | 
			
		||||
				   gint            *y,
 | 
			
		||||
				   GdkModifierType *mask)
 | 
			
		||||
{
 | 
			
		||||
  GdkWindow *toplevel = gdk_window_get_toplevel (window);
 | 
			
		||||
  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl);
 | 
			
		||||
  GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
 | 
			
		||||
  GdkWindow *toplevel;
 | 
			
		||||
  GdkWindowImplQuartz *impl;
 | 
			
		||||
  GdkWindowObject *private;
 | 
			
		||||
  NSPoint point;
 | 
			
		||||
  int x_tmp, y_tmp;
 | 
			
		||||
  gint x_tmp, y_tmp;
 | 
			
		||||
 | 
			
		||||
  if (GDK_WINDOW_DESTROYED (window))
 | 
			
		||||
    {
 | 
			
		||||
      *x = 0;
 | 
			
		||||
      *y = 0;
 | 
			
		||||
      *mask = 0;
 | 
			
		||||
      return NULL;
 | 
			
		||||
    }
 | 
			
		||||
  
 | 
			
		||||
  toplevel = gdk_window_get_toplevel (window);
 | 
			
		||||
  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl);
 | 
			
		||||
  private = GDK_WINDOW_OBJECT (window);
 | 
			
		||||
 | 
			
		||||
  /* Must flip the y coordinate. */
 | 
			
		||||
  if (window == _gdk_root)
 | 
			
		||||
@ -996,14 +1077,14 @@ _gdk_windowing_window_get_pointer (GdkDisplay      *display,
 | 
			
		||||
      private = private->parent;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* FIXME: Implement mask. */
 | 
			
		||||
  *x = x_tmp;
 | 
			
		||||
  *y = y_tmp;
 | 
			
		||||
 | 
			
		||||
  /* FIXME: Implement mask. */
 | 
			
		||||
  *mask = 0;
 | 
			
		||||
 | 
			
		||||
  /* FIXME: Implement return value */
 | 
			
		||||
  return NULL;
 | 
			
		||||
  return _gdk_quartz_find_child_window_by_point (window,
 | 
			
		||||
						 point.x, point.y,
 | 
			
		||||
						 &x_tmp, &y_tmp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
@ -1020,8 +1101,12 @@ _gdk_windowing_window_at_pointer (GdkDisplay *display,
 | 
			
		||||
				  gint       *win_x,
 | 
			
		||||
				  gint       *win_y)
 | 
			
		||||
{
 | 
			
		||||
  /* FIXME: Implement */
 | 
			
		||||
  return NULL;
 | 
			
		||||
  GdkModifierType mask;
 | 
			
		||||
 | 
			
		||||
  return _gdk_windowing_window_get_pointer (display,
 | 
			
		||||
					    _gdk_root,
 | 
			
		||||
					    win_x, win_y,
 | 
			
		||||
					    &mask);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GdkEventMask  
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user