Replace quartz specific keyboard grab code with common code

This commit is contained in:
Richard Hult 2009-02-02 14:22:37 +01:00 committed by Alexander Larsson
parent f06d432ebe
commit a180f7588f
3 changed files with 16 additions and 44 deletions

View File

@ -39,10 +39,6 @@ static GdkWindow *current_mouse_window;
/* This is the window corresponding to the key window */ /* This is the window corresponding to the key window */
static GdkWindow *current_keyboard_window; static GdkWindow *current_keyboard_window;
/* This is the keyboard grab window */
GdkWindow * _gdk_quartz_keyboard_grab_window;
static gboolean keyboard_grab_owner_events;
/* This is the event mask and button state from the last event */ /* This is the event mask and button state from the last event */
static GdkEventMask current_event_mask; static GdkEventMask current_event_mask;
static int current_button_state; static int current_button_state;
@ -129,44 +125,26 @@ gdk_event_get_graphics_expose (GdkWindow *window)
return NULL; return NULL;
} }
static void
generate_grab_broken_event (GdkWindow *window,
gboolean keyboard,
GdkWindow *grab_window)
{
if (!GDK_WINDOW_DESTROYED (window))
{
GdkEvent *event = gdk_event_new (GDK_GRAB_BROKEN);
event->grab_broken.window = window;
event->grab_broken.send_event = 0;
event->grab_broken.keyboard = keyboard;
event->grab_broken.implicit = FALSE;
event->grab_broken.grab_window = grab_window;
append_event (event);
}
}
GdkGrabStatus GdkGrabStatus
gdk_keyboard_grab (GdkWindow *window, gdk_keyboard_grab (GdkWindow *window,
gint owner_events, gint owner_events,
guint32 time) guint32 time)
{ {
GdkDisplay *display;
GdkWindow *toplevel;
g_return_val_if_fail (window != NULL, 0); g_return_val_if_fail (window != NULL, 0);
g_return_val_if_fail (GDK_IS_WINDOW (window), 0); g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
if (_gdk_quartz_keyboard_grab_window) display = gdk_drawable_get_display (window);
{ toplevel = gdk_window_get_toplevel (window);
if (_gdk_quartz_keyboard_grab_window != window)
generate_grab_broken_event (_gdk_quartz_keyboard_grab_window,
TRUE, window);
g_object_unref (_gdk_quartz_keyboard_grab_window);
}
_gdk_quartz_keyboard_grab_window = g_object_ref (window); _gdk_display_set_has_keyboard_grab (display,
keyboard_grab_owner_events = owner_events; window,
toplevel,
owner_events,
0,
time);
return GDK_GRAB_SUCCESS; return GDK_GRAB_SUCCESS;
} }
@ -175,9 +153,7 @@ void
gdk_display_keyboard_ungrab (GdkDisplay *display, gdk_display_keyboard_ungrab (GdkDisplay *display,
guint32 time) guint32 time)
{ {
if (_gdk_quartz_keyboard_grab_window) _gdk_display_unset_has_keyboard_grab (display, FALSE);
g_object_unref (_gdk_quartz_keyboard_grab_window);
_gdk_quartz_keyboard_grab_window = NULL;
} }
void void
@ -862,9 +838,8 @@ find_window_for_ns_event (NSEvent *nsevent,
case NSKeyUp: case NSKeyUp:
case NSFlagsChanged: case NSFlagsChanged:
{ {
/* FIXME: Use common code here instead. */ if (_gdk_display->keyboard_grab.window && !_gdk_display->keyboard_grab.owner_events)
if (_gdk_quartz_keyboard_grab_window && !keyboard_grab_owner_events) return gdk_window_get_toplevel (_gdk_display->keyboard_grab.window);
return _gdk_quartz_keyboard_grab_window;
return toplevel; return toplevel;
} }

View File

@ -164,9 +164,6 @@ void _gdk_quartz_events_send_map_event (GdkWindow *window);
GdkEventMask _gdk_quartz_events_get_current_event_mask (void); GdkEventMask _gdk_quartz_events_get_current_event_mask (void);
void _gdk_quartz_events_trigger_crossing_events(gboolean defer_to_mainloop); void _gdk_quartz_events_trigger_crossing_events(gboolean defer_to_mainloop);
extern GdkWindow *_gdk_quartz_keyboard_grab_window;
extern GdkWindow *_gdk_quartz_pointer_grab_window;
/* Event loop */ /* Event loop */
gboolean _gdk_quartz_event_loop_check_pending (void); gboolean _gdk_quartz_event_loop_check_pending (void);
NSEvent * _gdk_quartz_event_loop_get_pending (void); NSEvent * _gdk_quartz_event_loop_get_pending (void);

View File

@ -956,7 +956,7 @@ _gdk_quartz_window_destroy (GdkWindow *window,
if (window == _gdk_display->pointer_grab.window) if (window == _gdk_display->pointer_grab.window)
gdk_pointer_ungrab (0); gdk_pointer_ungrab (0);
if (window == _gdk_quartz_keyboard_grab_window) if (window == _gdk_display->keyboard_grab.window)
gdk_keyboard_ungrab (0); gdk_keyboard_ungrab (0);
_gdk_quartz_drawable_finish (GDK_DRAWABLE (impl)); _gdk_quartz_drawable_finish (GDK_DRAWABLE (impl));
@ -1125,7 +1125,7 @@ gdk_window_quartz_hide (GdkWindow *window)
if (window == _gdk_display->pointer_grab.window) if (window == _gdk_display->pointer_grab.window)
gdk_pointer_ungrab (0); gdk_pointer_ungrab (0);
if (window == _gdk_quartz_keyboard_grab_window) if (window == _gdk_display->keyboard_grab.window)
gdk_keyboard_ungrab (0); gdk_keyboard_ungrab (0);
} }