2005-05-26 [colin] 1.9.11cvs13
[claws.git] / src / plugins / pgpmime / passphrase.c
index bb7931d8bea5698c23e39fb2225036f57a1f05c0..5ac4f2eca4ea98cce529a9e651fbdb6d6f67806a 100644 (file)
 
 #if USE_GPGME
 
-#include <string.h>
-#include <sys/types.h>
-#include <sys/mman.h>
 #include <glib.h>
 #include <glib/gi18n.h>
+#include <gdk/gdktypes.h>
 #include <gdk/gdkkeysyms.h>
+#include <gdk/gdkdisplay.h>
+#ifdef GDK_WINDOWING_X11
+#  include <gdk/gdkx.h>
+#endif /* GDK_WINDOWING_X11 */
 #include <gtk/gtkmain.h>
 #include <gtk/gtkwidget.h>
 #include <gtk/gtkwindow.h>
@@ -39,9 +41,9 @@
 #include <gtk/gtkbutton.h>
 #include <gtk/gtkfilesel.h>
 #include <gtk/gtksignal.h>
-#ifdef GDK_WINDOWING_X11
-#include <gdk/gdkx.h>  /* GDK_DISPLAY() */
-#endif /* GDK_WINDOWING_X11 */
+#include <string.h>
+#include <sys/types.h>
+#include <sys/mman.h>
 
 #include "passphrase.h"
 #include "prefs_common.h"
@@ -49,7 +51,7 @@
 #include "utils.h"
 #include "prefs_gpg.h"
 
-static int grab_all = 0;
+static gboolean grab_all = FALSE;
 
 static gboolean pass_ack;
 static gchar *last_pass = NULL;
@@ -66,7 +68,7 @@ static gchar* passphrase_mbox (const gchar *desc);
 static GtkWidget *create_description (const gchar *desc);
 
 void
-gpgmegtk_set_passphrase_grab (gint yes)
+gpgmegtk_set_passphrase_grab(gint yes)
 {
     grab_all = yes;
 }
@@ -124,40 +126,38 @@ passphrase_mbox (const gchar *desc)
     g_signal_connect(G_OBJECT(cancel_button), "clicked",
                     G_CALLBACK(passphrase_cancel_cb), NULL);
 
-    if (grab_all)
-        g_object_set (G_OBJECT(window), "type", GTK_WINDOW_POPUP, NULL);
     gtk_window_set_position (GTK_WINDOW(window), GTK_WIN_POS_CENTER);
     if (grab_all)   
         gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
     
     gtk_widget_show_all(window);
 
-    /* don't use XIM on entering passphrase */
-    gtkut_editable_disable_im(GTK_EDITABLE(pass_entry));
-
     if (grab_all) {
-#ifdef GDK_WINDOWING_X11
-        XGrabServer(GDK_DISPLAY());
-#endif /* GDK_WINDOWING_X11 */
-        if ( grab_result = gdk_pointer_grab ( window->window, TRUE, 0,
-                                NULL, NULL, GDK_CURRENT_TIME)) {
-#ifdef GDK_WINDOWING_X11
-            XUngrabServer ( GDK_DISPLAY() );
-#endif /* GDK_WINDOWING_X11 */
-            g_warning ("OOPS: Could not grab mouse (grab status %d)\n",
-                       grab_result);
-            gtk_widget_destroy (window);
-            return NULL;
+       int err, cnt = 0;
+try_again:
+       /* make sure that window is viewable */
+        gtk_widget_show_now(window);
+       gdk_flush();
+       while(gtk_events_pending())
+               gtk_main_iteration();
+        if (err = gdk_pointer_grab(window->window, TRUE, 0,
+                             window->window, NULL, GDK_CURRENT_TIME)) {
+           if (err == GDK_GRAB_NOT_VIEWABLE && cnt < 10) {
+               /* HACK! */
+               cnt++;
+               g_warning("trying to grab mouse again\n");
+               goto try_again;
+           } else {
+               g_warning("OOPS: Could not grab mouse (%d)\n", err);
+               gtk_widget_destroy(window);
+               return NULL;
+           }
         }
-        if ( grab_result = gdk_keyboard_grab( window->window, FALSE, 
-                                               GDK_CURRENT_TIME )) {
-            gdk_pointer_ungrab (GDK_CURRENT_TIME);
-#ifdef GDK_WINDOWING_X11
-            XUngrabServer ( GDK_DISPLAY() );
-#endif /* GDK_WINDOWING_X11 */
-            g_warning ("OOPS: Could not grab keyboard (grab status %d)\n",
-                       grab_result);
-            gtk_widget_destroy (window);
+        if (gdk_keyboard_grab(window->window, FALSE, GDK_CURRENT_TIME)) {
+            gdk_display_pointer_ungrab(gdk_display_get_default(),
+                                      GDK_CURRENT_TIME);
+            g_warning("OOPS: Could not grab keyboard\n");
+            gtk_widget_destroy(window);
             return NULL;
         }
     }
@@ -165,11 +165,9 @@ passphrase_mbox (const gchar *desc)
     gtk_main();
 
     if (grab_all) {
-#ifdef GDK_WINDOWING_X11
-        XUngrabServer (GDK_DISPLAY());
-#endif /* GDK_WINDOWING_X11 */
-        gdk_pointer_ungrab (GDK_CURRENT_TIME);
-        gdk_keyboard_ungrab (GDK_CURRENT_TIME);
+        gdk_display_keyboard_ungrab(gdk_display_get_default(),
+                                   GDK_CURRENT_TIME);
+        gdk_display_pointer_ungrab(gdk_display_get_default(), GDK_CURRENT_TIME);
         gdk_flush();
     }