Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37817648
en ru br
Репозитории ALT
S:3.7.0-alt0.6
4.1: 2.2.9-alt1.1
4.0: 2.2.9-alt1.1
3.0: 1.0.4-alt1
www.altlinux.org/Changes

Группа :: Сети/Почта
Пакет: sylpheed

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: sylpheed-2.2.4-alt-passphrase-grab.patch
Скачать


--- sylpheed/src/passphrase.c.alt-passphrase-grab	2006-01-27 11:34:26 +0300
+++ sylpheed/src/passphrase.c	2006-05-28 15:38:21 +0400
@@ -63,8 +63,12 @@ static gboolean grab_all = FALSE;
 static gboolean pass_ack;
 static gchar *last_pass = NULL;
 
+static gboolean passphrase_grab_input(GtkWidget *window);
+static void passphrase_ungrab_input(void);
 static void passphrase_ok_cb(GtkWidget *widget, gpointer data);
 static void passphrase_cancel_cb(GtkWidget *widget, gpointer data);
+static void passphrase_map_event(GtkWidget *widget, GdkEvent *event,
+                                 gpointer data);
 static gint passphrase_deleted(GtkWidget *widget, GdkEventAny *event,
 			       gpointer data);
 static gboolean passphrase_key_pressed(GtkWidget *widget, GdkEventKey *event,
@@ -85,6 +89,7 @@ static gchar*
 passphrase_mbox(const gchar *uid_hint, const gchar *pass_hint, gint prev_bad)
 {
     gchar *the_passphrase = NULL;
+    gboolean did_grab = FALSE;
     GtkWidget *vbox;
     GtkWidget *confirm_box;
     GtkWidget *window;
@@ -98,6 +103,8 @@ passphrase_mbox(const gchar *uid_hint, c
     gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
     gtk_window_set_modal(GTK_WINDOW(window), TRUE);
     gtk_window_set_policy(GTK_WINDOW(window), FALSE, FALSE, FALSE);
+    g_signal_connect(G_OBJECT(window), "map_event",
+                     G_CALLBACK(passphrase_map_event), &did_grab);
     g_signal_connect(G_OBJECT(window), "delete_event",
                      G_CALLBACK(passphrase_deleted), NULL);
     g_signal_connect(G_OBJECT(window), "key_press_event",
@@ -139,46 +146,16 @@ passphrase_mbox(const gchar *uid_hint, c
     
     gtk_widget_show_all(window);
 
-    if (grab_all) {
-        /* make sure that window is viewable
-	 * FIXME: this is still not enough */
-        gtk_widget_show_now(window);
-	gdk_flush();
-#ifdef GDK_WINDOWING_X11
-	gdk_x11_display_grab(gdk_display_get_default());
-#endif /* GDK_WINDOWING_X11 */
-        if (gdk_pointer_grab(window->window, TRUE, 0,
-                             window->window, NULL, GDK_CURRENT_TIME)) {
-#ifdef GDK_WINDOWING_X11
-            gdk_x11_display_ungrab(gdk_display_get_default());
-#endif /* GDK_WINDOWING_X11 */
-            g_warning("OOPS: Could not grab mouse\n");
-            gtk_widget_destroy(window);
-            return NULL;
-        }
-        if (gdk_keyboard_grab(window->window, FALSE, GDK_CURRENT_TIME)) {
-            gdk_display_pointer_ungrab(gdk_display_get_default(),
-			 	       GDK_CURRENT_TIME);
-#ifdef GDK_WINDOWING_X11
-            gdk_x11_display_ungrab(gdk_display_get_default());
-#endif /* GDK_WINDOWING_X11 */
-            g_warning("OOPS: Could not grab keyboard\n");
-            gtk_widget_destroy(window);
-            return NULL;
-        }
-    }
+    /*
+     * Grabbing input here does not work, because the X window is not yet
+     * visible.  It will be done in the "map_event" signal handler for the
+     * window.
+     */
 
     gtk_main();
 
-    if (grab_all) {
-        gdk_display_keyboard_ungrab(gdk_display_get_default(),
-				    GDK_CURRENT_TIME);
-        gdk_display_pointer_ungrab(gdk_display_get_default(), GDK_CURRENT_TIME);
-#ifdef GDK_WINDOWING_X11
-        gdk_x11_display_ungrab(gdk_display_get_default());
-#endif /* GDK_WINDOWING_X11 */
-        gdk_flush();
-    }
+    if (did_grab)
+        passphrase_ungrab_input();
 
     manage_window_focus_out(window, NULL, NULL);
 
@@ -194,6 +171,44 @@ passphrase_mbox(const gchar *uid_hint, c
     return the_passphrase;
 }
 
+static gboolean
+passphrase_grab_input(GtkWidget *window)
+{
+#ifdef GDK_WINDOWING_X11
+    gdk_x11_display_grab(gdk_display_get_default());
+#endif /* GDK_WINDOWING_X11 */
+    if (gdk_pointer_grab(window->window, TRUE, 0,
+                         window->window, NULL, GDK_CURRENT_TIME)) {
+#ifdef GDK_WINDOWING_X11
+        gdk_x11_display_ungrab(gdk_display_get_default());
+#endif /* GDK_WINDOWING_X11 */
+        g_warning("OOPS: Could not grab mouse\n");
+        return FALSE;
+    }
+    if (gdk_keyboard_grab(window->window, FALSE, GDK_CURRENT_TIME)) {
+        gdk_display_pointer_ungrab(gdk_display_get_default(),
+                                   GDK_CURRENT_TIME);
+#ifdef GDK_WINDOWING_X11
+        gdk_x11_display_ungrab(gdk_display_get_default());
+#endif /* GDK_WINDOWING_X11 */
+        g_warning("OOPS: Could not grab keyboard\n");
+        return FALSE;
+    }
+    return TRUE;
+}
+
+static void
+passphrase_ungrab_input(void)
+{
+    gdk_display_keyboard_ungrab(gdk_display_get_default(),
+                                GDK_CURRENT_TIME);
+    gdk_display_pointer_ungrab(gdk_display_get_default(), GDK_CURRENT_TIME);
+#ifdef GDK_WINDOWING_X11
+    gdk_x11_display_ungrab(gdk_display_get_default());
+#endif /* GDK_WINDOWING_X11 */
+    gdk_flush();
+}
+
 
 static void 
 passphrase_ok_cb(GtkWidget *widget, gpointer data)
@@ -210,6 +225,19 @@ passphrase_cancel_cb(GtkWidget *widget, 
 }
 
 
+static void
+passphrase_map_event(GtkWidget *widget, GdkEvent *event, gpointer data)
+{
+    gboolean *did_grab = data;
+
+    if (grab_all) {
+        if (passphrase_grab_input(widget))
+            *did_grab = TRUE;
+        else
+            passphrase_cancel_cb(NULL, NULL);
+    }
+}
+
 static gint
 passphrase_deleted(GtkWidget *widget, GdkEventAny *event, gpointer data)
 {
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin