+2007-07-13 Richard Hult <richard@imendio.com>
+
+ * gdk/quartz/gdkprivate-quartz.h:
+ * gdk/quartz/gdkevents-quartz.c: (gdk_window_is_ancestor): Move
+ from here...
+ * gdk/quartz/gdkwindow-quartz.c: (_gdk_quartz_window_is_ancestor):
+ ...to here.
+ (_gdk_windowing_window_destroy): Update the mouse window if the
+ destroyed window is an ancestor of the current one, not only if
+ they are the same.
+ (gdk_window_hide): Update the mouse window here too.
+
2007-07-13 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkcolor-quartz.c: (gdk_colors_alloc),
}
}
-static gboolean
-gdk_window_is_ancestor (GdkWindow *ancestor,
- GdkWindow *window)
-{
- if (ancestor == NULL || window == NULL)
- return FALSE;
-
- return (gdk_window_get_parent (window) == ancestor ||
- gdk_window_is_ancestor (ancestor, gdk_window_get_parent (window)));
-}
-
static void
convert_window_coordinates_to_root (GdkWindow *window,
gdouble x,
if (window == current_mouse_window)
return;
- if (gdk_window_is_ancestor (current_mouse_window, window))
+ if (_gdk_quartz_window_is_ancestor (current_mouse_window, window))
{
/* Pointer has moved to an inferior window. */
synthesize_leave_event (current_mouse_window, nsevent, mode, GDK_NOTIFY_INFERIOR);
synthesize_enter_event (window, nsevent, mode, GDK_NOTIFY_ANCESTOR);
}
- else if (gdk_window_is_ancestor (window, current_mouse_window))
+ else if (_gdk_quartz_window_is_ancestor (window, current_mouse_window))
{
/* Pointer has moved to an ancestor window. */
synthesize_leave_event (current_mouse_window, nsevent, mode, GDK_NOTIFY_ANCESTOR);
common_ancestor = gdk_window_get_parent (tem);
tem = common_ancestor;
} while (common_ancestor &&
- !gdk_window_is_ancestor (common_ancestor, window));
+ !_gdk_quartz_window_is_ancestor (common_ancestor, window));
if (common_ancestor)
{
synthesize_leave_event (current_mouse_window, nsevent, mode, GDK_NOTIFY_NONLINEAR);
/* Get current mouse window */
GdkWindow *
-_gdk_quartz_events_get_mouse_window (void)
+_gdk_quartz_events_get_mouse_window (gboolean consider_grabs)
{
+ if (!consider_grabs)
+ return current_mouse_window;
+
if (_gdk_quartz_pointer_grab_window && !pointer_grab_owner_events)
return _gdk_quartz_pointer_grab_window;
gfloat *alpha);
/* Window */
+gboolean _gdk_quartz_window_is_ancestor (GdkWindow *ancestor,
+ GdkWindow *window);
gint _gdk_quartz_window_get_inverted_screen_y (gint y);
GdkWindow *_gdk_quartz_window_find_child (GdkWindow *window,
gint x,
void _gdk_quartz_window_did_resign_main (GdkWindow *window);
/* Events */
-void _gdk_quartz_events_update_focus_window (GdkWindow *new_window,
- gboolean got_focus);
-GdkWindow * _gdk_quartz_events_get_mouse_window (void);
+void _gdk_quartz_events_update_focus_window (GdkWindow *new_window,
+ gboolean got_focus);
+GdkWindow * _gdk_quartz_events_get_mouse_window (gboolean consider_grabs);
void _gdk_quartz_events_update_mouse_window (GdkWindow *window);
void _gdk_quartz_events_update_cursor (GdkWindow *window);
void _gdk_quartz_events_send_map_events (GdkWindow *window);
return title;
}
+gboolean
+_gdk_quartz_window_is_ancestor (GdkWindow *ancestor,
+ GdkWindow *window)
+{
+ if (ancestor == NULL || window == NULL)
+ return FALSE;
+
+ return (gdk_window_get_parent (window) == ancestor ||
+ _gdk_quartz_window_is_ancestor (ancestor,
+ gdk_window_get_parent (window)));
+}
+
/* FIXME: It would be nice to have one function that takes an NSPoint
* and flips the coords for any window.
*/
if (!recursing && !foreign_destroy)
{
GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
+ GdkWindow *mouse_window;
- if (window == _gdk_quartz_events_get_mouse_window ())
- _gdk_quartz_events_update_mouse_window (_gdk_root);
+ mouse_window = _gdk_quartz_events_get_mouse_window (FALSE);
+ if (window == mouse_window ||
+ _gdk_quartz_window_is_ancestor (window, mouse_window))
+ _gdk_quartz_events_update_mouse_window (_gdk_root);
GDK_QUARTZ_ALLOC_POOL;
{
GdkWindowObject *private = (GdkWindowObject *)window;
GdkWindowImplQuartz *impl;
+ GdkWindow *mouse_window;
g_return_if_fail (GDK_IS_WINDOW (window));
if (GDK_WINDOW_DESTROYED (window))
return;
+ mouse_window = _gdk_quartz_events_get_mouse_window (FALSE);
+ if (window == mouse_window ||
+ _gdk_quartz_window_is_ancestor (window, mouse_window))
+ _gdk_quartz_events_update_mouse_window (_gdk_root);
+
if (GDK_WINDOW_IS_MAPPED (window))
gdk_synthesize_window_state (window,
0,
if (GDK_WINDOW_DESTROYED (window))
return;
+ GDK_QUARTZ_ALLOC_POOL;
+
if (!cursor)
nscursor = NULL;
else
impl->nscursor = nscursor;
- _gdk_quartz_events_update_cursor (_gdk_quartz_events_get_mouse_window ());
+ GDK_QUARTZ_RELEASE_POOL;
+
+ _gdk_quartz_events_update_cursor (_gdk_quartz_events_get_mouse_window (TRUE));
}
void