]> Pileus Git - ~andy/gtk/commitdiff
Ungrab keyboard if virtual window is hidden or destroyed
authorAlexander Larsson <alexl@redhat.com>
Fri, 23 Jan 2009 14:39:04 +0000 (15:39 +0100)
committerAlexander Larsson <alex@localhost.localdomain>
Thu, 2 Apr 2009 08:15:26 +0000 (10:15 +0200)
gdk/gdkinternals.h
gdk/gdkwindow.c

index a878e059622995651d1557c97c0ec410ba460581..e70f82c42c8797279806215956493d6cc9a8ed2c 100644 (file)
@@ -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);
index 39c1b4511f36b85c84474e910febb20cbe4c1843..b203d94cd9c6aec25dc3799294ee5bf4553edf63 100644 (file)
@@ -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;
     }