]> andersk Git - gssapi-openssh.git/blobdiff - openssh/contrib/gnome-ssh-askpass2.c
Import of OpenSSH 3.7.1p1
[gssapi-openssh.git] / openssh / contrib / gnome-ssh-askpass2.c
index 89a412aa8137416c79fd2175fa0763a1c170988e..9e8eaf920144f5bce4854f46f9e0568e29008dd1 100644 (file)
  * you don't trust your X server. We grab the keyboard always.
  */
 
+#define GRAB_TRIES     16
+#define GRAB_WAIT      250 /* milliseconds */
+
 /*
  * Compile with:
  *
- * cc `pkg-config --cflags gtk+-2.0` \
+ * cc -Wall `pkg-config --cflags gtk+-2.0` \
  *    gnome-ssh-askpass2.c -o gnome-ssh-askpass \
  *    `pkg-config --libs gtk+-2.0`
  *
@@ -48,6 +51,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <unistd.h>
 #include <X11/Xlib.h>
 #include <gtk/gtk.h>
 #include <gdk/gdkx.h>
@@ -84,13 +88,13 @@ passphrase_dialog(char *message)
 {
        const char *failed;
        char *passphrase, *local;
-       char **messages;
-       int result, i, grab_server, grab_pointer;
-       GtkWidget *dialog, *entry, *label;
+       int result, grab_tries, grab_server, grab_pointer;
+       GtkWidget *dialog, *entry;
        GdkGrabStatus status;
 
        grab_server = (getenv("GNOME_SSH_ASKPASS_GRAB_SERVER") != NULL);
        grab_pointer = (getenv("GNOME_SSH_ASKPASS_GRAB_POINTER") != NULL);
+       grab_tries = 0;
 
        dialog = gtk_message_dialog_new(NULL, 0,
                                        GTK_MESSAGE_QUESTION,
@@ -117,23 +121,35 @@ passphrase_dialog(char *message)
 
        /* Grab focus */
        gtk_widget_show_now(dialog);
-       if (grab_server) {
-               gdk_x11_grab_server();
-       }
        if (grab_pointer) {
-               status =  gdk_pointer_grab((GTK_WIDGET(dialog))->window, TRUE,
-                                          0, NULL, NULL, GDK_CURRENT_TIME);
-               if (status != GDK_GRAB_SUCCESS) {
-                       failed = "mouse";
-                       goto nograb;
+               for(;;) {
+                       status = gdk_pointer_grab(
+                          (GTK_WIDGET(dialog))->window, TRUE, 0, NULL, 
+                          NULL, GDK_CURRENT_TIME);
+                       if (status == GDK_GRAB_SUCCESS)
+                               break;
+                       usleep(GRAB_WAIT * 1000);
+                       if (++grab_tries > GRAB_TRIES) {
+                               failed = "mouse";
+                               goto nograb;
+                       }
                }
        }
-       status = gdk_keyboard_grab((GTK_WIDGET(dialog))->window, FALSE,
-                                  GDK_CURRENT_TIME);
-       if (status != GDK_GRAB_SUCCESS) {
-               failed = "keyboard";
-               goto nograbkb;
+       for(;;) {
+               status = gdk_keyboard_grab((GTK_WIDGET(dialog))->window,
+                  FALSE, GDK_CURRENT_TIME);
+               if (status == GDK_GRAB_SUCCESS)
+                       break;
+               usleep(GRAB_WAIT * 1000);
+               if (++grab_tries > GRAB_TRIES) {
+                       failed = "keyboard";
+                       goto nograbkb;
+               }
        }
+       if (grab_server) {
+               gdk_x11_grab_server();
+       }
+
        result = gtk_dialog_run(GTK_DIALOG(dialog));
 
        /* Ungrab */
This page took 0.154532 seconds and 4 git commands to generate.