From cf54a2c68e93aacb418fa70b3ba326d694c14b8d Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Fri, 23 Jan 2009 15:39:04 +0100 Subject: [PATCH] Ungrab keyboard if virtual window is hidden or destroyed --- gdk/gdkinternals.h | 2 ++ gdk/gdkwindow.c | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h index a878e05962..e70f82c42c 100644 --- a/gdk/gdkinternals.h +++ b/gdk/gdkinternals.h @@ -484,6 +484,8 @@ void _gdk_display_set_has_keyboard_grab (GdkDisplay *display, gboolean owner_events, unsigned long serial, guint32 time); +void _gdk_display_unset_has_keyboard_grab (GdkDisplay *display, + gboolean implicit); void _gdk_window_invalidate_for_expose (GdkWindow *window, const GdkRegion *region); diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 39c1b4511f..b203d94cd9 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -5725,6 +5725,19 @@ gdk_window_hide (GdkWindow *window) } } + if (display->keyboard_grab.window != NULL) + { + if (is_parent_of (window, display->keyboard_grab.window)) + { + /* Call this ourselves, even though gdk_display_keyboard_ungrab + does so too, since we want to pass implicit == TRUE so the + broken grab event is generated */ + _gdk_display_unset_has_keyboard_grab (display, + TRUE); + gdk_display_keyboard_ungrab (display, GDK_CURRENT_TIME); + } + } + private->state = GDK_WINDOW_STATE_WITHDRAWN; }