GdkWindow *_gdk_quartz_pointer_grab_window;
static gboolean pointer_grab_owner_events;
static GdkEventMask pointer_grab_event_mask;
-static gboolean pointer_grab_implicit;
/* This is the keyboard grab window */
GdkWindow * _gdk_quartz_keyboard_grab_window;
static void
generate_grab_broken_event (GdkWindow *window,
gboolean keyboard,
- gboolean implicit,
GdkWindow *grab_window)
{
if (!GDK_WINDOW_DESTROYED (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.implicit = FALSE;
event->grab_broken.grab_window = grab_window;
append_event (event);
{
if (_gdk_quartz_keyboard_grab_window != window)
generate_grab_broken_event (_gdk_quartz_keyboard_grab_window,
- TRUE, FALSE, window);
+ TRUE, window);
g_object_unref (_gdk_quartz_keyboard_grab_window);
}
}
static void
-pointer_ungrab_internal (gboolean only_if_implicit)
+pointer_ungrab_internal (void)
{
if (!_gdk_quartz_pointer_grab_window)
return;
- if (only_if_implicit && !pointer_grab_implicit)
- return;
-
g_object_unref (_gdk_quartz_pointer_grab_window);
_gdk_quartz_pointer_grab_window = NULL;
pointer_grab_owner_events = FALSE;
pointer_grab_event_mask = 0;
- pointer_grab_implicit = FALSE;
/* FIXME: Send crossing events */
}
gdk_display_pointer_ungrab (GdkDisplay *display,
guint32 time)
{
- pointer_ungrab_internal (FALSE);
+ pointer_ungrab_internal ();
}
static GdkGrabStatus
gboolean owner_events,
GdkEventMask event_mask,
GdkWindow *confine_to,
- GdkCursor *cursor,
- gboolean implicit)
+ GdkCursor *cursor)
{
/* FIXME: Send crossing events */
_gdk_quartz_pointer_grab_window = g_object_ref (window);
pointer_grab_owner_events = owner_events;
pointer_grab_event_mask = event_mask;
- pointer_grab_implicit = implicit;
return GDK_GRAB_SUCCESS;
}
GdkCursor *cursor,
guint32 time)
{
+ GdkWindow *toplevel;
+
g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
g_return_val_if_fail (confine_to == NULL || GDK_IS_WINDOW (confine_to), 0);
+ toplevel = gdk_window_get_toplevel (window);
+
+ /* TODO: What do we do for offscreens and their children? We need to proxy the grab somehow */
+ if (!GDK_IS_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl))
+ return GDK_GRAB_SUCCESS;
+
if (_gdk_quartz_pointer_grab_window)
{
if (_gdk_quartz_pointer_grab_window != window)
generate_grab_broken_event (_gdk_quartz_pointer_grab_window,
- FALSE, pointer_grab_implicit, window);
+ FALSE,
+ window);
- pointer_ungrab_internal (FALSE);
+ pointer_ungrab_internal ();
}
return pointer_grab_internal (window, owner_events, event_mask,
- confine_to, cursor, FALSE);
+ confine_to, cursor);
}
/* This is used to break any grabs in the case where we have to due to
if (_gdk_quartz_keyboard_grab_window)
{
generate_grab_broken_event (_gdk_quartz_keyboard_grab_window,
- TRUE, FALSE,
+ TRUE,
NULL);
g_object_unref (_gdk_quartz_keyboard_grab_window);
_gdk_quartz_keyboard_grab_window = NULL;
if (_gdk_quartz_pointer_grab_window)
{
generate_grab_broken_event (_gdk_quartz_pointer_grab_window,
- FALSE, pointer_grab_implicit,
+ FALSE,
NULL);
- pointer_ungrab_internal (FALSE);
+ pointer_ungrab_internal ();
}
}