#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>
#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"
#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;
static GtkWidget *create_description (const gchar *desc);
void
-gpgmegtk_set_passphrase_grab (gint yes)
+gpgmegtk_set_passphrase_grab(gint yes)
{
grab_all = yes;
}
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;
}
}
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();
}