gtk2: Be more persistent trying to grab the keyboard.
authorJustus Winter <justus@g10code.com>
Mon, 1 Aug 2016 15:49:50 +0000 (17:49 +0200)
committerJustus Winter <justus@g10code.com>
Mon, 1 Aug 2016 15:49:50 +0000 (17:49 +0200)
We seem to get the 'visibility-notify' event before X is willing to
let us grab the keyboard, insisting that the target window is not
viewable (sic).

* gtk+-2/pinentry-gtk-2.c (grab_keyboard): Retry grabbing the
keyboard.

GnuPG-bug-id: 2375
Signed-off-by: Justus Winter <justus@g10code.com>
gtk+-2/pinentry-gtk-2.c

index 3fff176..0e6b8ff 100644 (file)
@@ -165,13 +165,17 @@ static int
 grab_keyboard (GtkWidget *win, GdkEvent *event, gpointer data)
 {
   GdkGrabStatus err;
+  int tries = 0, max_tries = 4096;
   (void)data;
 
   if (! pinentry->grab)
     return FALSE;
 
-  err = gdk_keyboard_grab (gtk_widget_get_window (win),
-                           FALSE, gdk_event_get_time (event));
+  do
+    err = gdk_keyboard_grab (gtk_widget_get_window (win),
+                             FALSE, gdk_event_get_time (event));
+  while (tries++ < max_tries && err == GDK_GRAB_NOT_VIEWABLE);
+
   if (err)
     {
       g_critical ("could not grab keyboard: %s (%d)",
@@ -180,6 +184,9 @@ grab_keyboard (GtkWidget *win, GdkEvent *event, gpointer data)
       gtk_main_quit ();
     }
 
+  if (tries > 1)
+    g_warning ("it took %d tries to grab the keyboard", tries);
+
   return FALSE;
 }