diff -Nur -x '*.orig' -x '*~' ssh-askpass-fullscreen-0.3/gtk2-ssh-askpass.c ssh-askpass-fullscreen-0.3.new/gtk2-ssh-askpass.c
--- ssh-askpass-fullscreen-0.3/gtk2-ssh-askpass.c	2009-09-27 02:59:10.000000000 +0200
+++ ssh-askpass-fullscreen-0.3.new/gtk2-ssh-askpass.c	2009-09-27 02:59:37.000000000 +0200
@@ -33,6 +33,9 @@
  *
  */
 
+#define GRAB_TRIES      16
+#define GRAB_WAIT       250 /* milliseconds */   
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -117,6 +120,30 @@
 
 GtkWidget *window, *label, *entry;
 gint result;
+gint grab_server, grab_pointer;
+
+static void
+report_failed_grab (const char *what)
+{
+	GtkWidget *err;
+
+	err = gtk_message_dialog_new(NULL, 0,
+				     GTK_MESSAGE_ERROR,
+				     GTK_BUTTONS_CLOSE,
+				     "Could not grab %s. "
+				     "A malicious client may be eavesdropping "
+				     "on your session.", what);
+	gtk_window_set_position(GTK_WINDOW(err), GTK_WIN_POS_CENTER);
+	gtk_label_set_line_wrap(GTK_LABEL((GTK_MESSAGE_DIALOG(err))->label),
+				TRUE);
+
+	gtk_dialog_run(GTK_DIALOG(err));
+
+	gtk_widget_destroy(err);
+}
+
+
+
 
 static GdkPixbuf *
 create_tile_pixbuf (GdkPixbuf    *dest_pixbuf,
@@ -187,12 +214,19 @@
 
 void
 enter_callback(GtkWidget *widget,
-			   GtkWidget *entryw)
+               GtkWidget *entryw)
 {
   const gchar *passphrase;
   passphrase = gtk_entry_get_text(GTK_ENTRY(entryw));
+
+  if (grab_server) 
+	  XUngrabServer(GDK_DISPLAY()); 
+  if (grab_pointer) 
+	  gdk_pointer_ungrab(GDK_CURRENT_TIME); 
+  gdk_keyboard_ungrab(GDK_CURRENT_TIME);
+  gdk_flush();
   
-  if (result == 0) 
+  if (result == 0) /* result is always == 0, what this check is for? */
 	puts(passphrase);
 		
   memset((void*)passphrase, '\0', strlen(passphrase)); 
@@ -205,34 +239,39 @@
 passphrase_dialog(char *message)
 {
 	gchar **messages;
-	gint grab_server, grab_pointer;
+
 	GtkWidget *frame, *align, *vbox, *hbox;
 	GdkPixbuf *tmp_pixbuf, *pixbuf, *tile_pixbuf;
 	GdkPixmap *pixmap;
 	GdkRectangle rect;
 	GdkColor color;
 	gchar *str;
+        GdkGrabStatus status;
+        int kbd_grab_tries = 0;
+	int mouse_grab_tries = 0;
+        const char *failed;
+        
  	grab_server = (getenv("GNOME_SSH_ASKPASS_GRAB_SERVER") != NULL); 
  	grab_pointer = (getenv("GNOME_SSH_ASKPASS_GRAB_POINTER") != NULL); 
 
 	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 
 	gtk_window_set_default_size(GTK_WINDOW(window),
-								gdk_screen_width(),
-								gdk_screen_height());
+                                    gdk_screen_width(),
+                                    gdk_screen_height());
 
 	gtk_widget_set_app_paintable(GTK_WIDGET(window), TRUE);
 	gtk_widget_realize(GTK_WIDGET(window));
 
 	tmp_pixbuf = gdk_pixbuf_get_from_drawable(NULL,
-											  gdk_get_default_root_window(),
-											  gdk_colormap_get_system(),
-											  0,
-											  0,
-											  0,
-											  0,
-											  gdk_screen_width(),
-											  gdk_screen_height());
+                                                  gdk_get_default_root_window(),
+                                                  gdk_colormap_get_system(),
+                                                  0,
+                                                  0,
+                                                  0,
+                                                  0,
+                                                  gdk_screen_width(),
+                                                  gdk_screen_height());
 
 	pixbuf = gdk_pixbuf_new_from_xpm_data(ocean_stripes);
 	
@@ -246,46 +285,46 @@
 	color.green = 0;
 
  	tile_pixbuf = create_tile_pixbuf(NULL,
- 									 pixbuf,
- 									 &rect,
- 									 155,
- 									 &color);
-
+                                         pixbuf,
+                                         &rect,
+                                         155,
+                                         &color);
+        
 	g_object_unref(pixbuf);
 	
 	gdk_pixbuf_composite(tile_pixbuf,
-						 tmp_pixbuf,
-						 0,
-						 0,
-						 gdk_screen_width(),
-						 gdk_screen_height(),
-						 0,
-						 0,
-						 1,
-						 1,
-						 GDK_INTERP_NEAREST,
-						 200);
+                             tmp_pixbuf,
+                             0,
+                             0,
+                             gdk_screen_width(),
+                             gdk_screen_height(),
+                             0,
+                             0,
+                             1,
+                             1,
+                             GDK_INTERP_NEAREST,
+                             200);
 
 	g_object_unref(tile_pixbuf);
 
 	pixmap = gdk_pixmap_new(GTK_WIDGET(window)->window,
-							gdk_screen_width(),
-							gdk_screen_height(),
-							-1);
+                                gdk_screen_width(),
+                                gdk_screen_height(),
+                                -1);
 
 	gdk_pixbuf_render_to_drawable_alpha(tmp_pixbuf,
-										pixmap,
-										0,
-										0,
-										0,
-										0,
-										gdk_screen_width(),
-										gdk_screen_height(),
-										GDK_PIXBUF_ALPHA_BILEVEL,
-										0,
-										GDK_RGB_DITHER_NONE,
-										0,
-										0);
+                                            pixmap,
+                                            0,
+                                            0,
+                                            0,
+                                            0,
+                                            gdk_screen_width(),
+                                            gdk_screen_height(),
+                                            GDK_PIXBUF_ALPHA_BILEVEL,
+                                            0,
+                                            GDK_RGB_DITHER_NONE,
+                                            0,
+                                            0);
 
 	g_object_unref(tmp_pixbuf);
 	
@@ -336,21 +375,38 @@
 	gtk_window_fullscreen(GTK_WINDOW(window));
 #endif
 
-	gtk_widget_show(GTK_WIDGET(window));
-					 
- 	if (grab_server) 
- 		XGrabServer(GDK_DISPLAY()); 
- 	if (grab_pointer && gdk_pointer_grab(window->window, TRUE, 0,  
-										 NULL, NULL, GDK_CURRENT_TIME)) 
-	  goto nograb; 
-	
- 	if (gdk_keyboard_grab(window->window, FALSE, GDK_CURRENT_TIME)) 
-	  goto nograbkb; 
+        gtk_widget_show(GTK_WIDGET(window));
+        
+        /* Grab focus */
+	if (grab_pointer) {
+		for(;;) {
+			status = gdk_pointer_grab(window->window, TRUE,
+                                                  0, NULL, NULL, GDK_CURRENT_TIME);
+			if (status == GDK_GRAB_SUCCESS)
+				break;
+			usleep(GRAB_WAIT * 1000);
+			if (++mouse_grab_tries > GRAB_TRIES) {
+				failed = "mouse";
+				goto nograb;
+			}
+		}
+	}
 
- 	if (grab_server) 
-	  XUngrabServer(GDK_DISPLAY()); 
- 	if (grab_pointer) 
-	  gdk_pointer_ungrab(GDK_CURRENT_TIME); 
+	for(;;) {
+		status = gdk_keyboard_grab(gtk_widget_get_window(window), FALSE,
+                                           GDK_CURRENT_TIME);
+		if (status == GDK_GRAB_SUCCESS)
+			break;
+		usleep(GRAB_WAIT * 1000);
+		if (++kbd_grab_tries > GRAB_TRIES) {
+			failed = "keyboard";
+			goto nograbkb;
+		}
+	}
+	if (grab_server) {
+		gdk_x11_grab_server();
+	}
+        
 
 			
 	return;
@@ -361,9 +417,14 @@
  nograb: 
  	if (grab_server) 
 	  XUngrabServer(GDK_DISPLAY()); 
-	
+
+        report_failed_grab(failed);
+
+        gtk_main_quit();
 }
 
+
+
 int
 main(int argc, char **argv)
 {
