]> asedeno.scripts.mit.edu Git - PuTTY.git/blobdiff - unix/gtkask.c
Note the interaction of jump lists and -cleanup.
[PuTTY.git] / unix / gtkask.c
index 74dc4d437e9fbe17d4f57c6439327feb5e89bb4c..c2b582e9c9afe29e29a2d0befaf5c6dd3453ecca 100644 (file)
@@ -43,7 +43,9 @@ struct askpass_ctx {
 #endif
     char *passphrase;
     int passlen, passsize;
-#if GTK_CHECK_VERSION(3,0,0)
+#if GTK_CHECK_VERSION(3,20,0)
+    GdkSeat *seat;                     /* for gdk_seat_grab */
+#elif GTK_CHECK_VERSION(3,0,0)
     GdkDevice *keyboard;               /* for gdk_device_grab */
 #endif
 };
@@ -218,9 +220,25 @@ static int try_grab_keyboard(struct askpass_ctx *ctx)
 {
     int ret;
 
-#if GTK_CHECK_VERSION(3,0,0)
+#if GTK_CHECK_VERSION(3,20,0)
+    /*
+     * Grabbing the keyboard in GTK 3.20 requires the new notion of
+     * GdkSeat.
+     */
+    GdkSeat *seat;
+
+    seat = gdk_display_get_default_seat
+        (gtk_widget_get_display(ctx->dialog));
+    if (!seat)
+        return FALSE;
+
+    ctx->seat = seat;
+    ret = gdk_seat_grab(seat, gtk_widget_get_window(ctx->dialog),
+                        GDK_SEAT_CAPABILITY_KEYBOARD,
+                        TRUE, NULL, NULL, NULL, NULL);
+#elif GTK_CHECK_VERSION(3,0,0)
     /*
-     * Grabbing the keyboard is quite complicated in GTK 3.
+     * And it has to be done differently again prior to GTK 3.20.
      */
     GdkDeviceManager *dm;
     GdkDevice *pointer, *keyboard;
@@ -304,6 +322,7 @@ static const char *gtk_askpass_setup(struct askpass_ctx *ctx,
     gtk_window_set_position(GTK_WINDOW(ctx->dialog), GTK_WIN_POS_CENTER);
     ctx->promptlabel = gtk_label_new(prompt_text);
     align_label_left(GTK_LABEL(ctx->promptlabel));
+    gtk_widget_show(ctx->promptlabel);
     gtk_label_set_line_wrap(GTK_LABEL(ctx->promptlabel), TRUE);
 #if GTK_CHECK_VERSION(3,0,0)
     gtk_label_set_width_chars(GTK_LABEL(ctx->promptlabel), 48);
@@ -356,6 +375,12 @@ static const char *gtk_askpass_setup(struct askpass_ctx *ctx,
                          G_CALLBACK(expose_area),
                          &ctx->drawingareas[i]);
 #endif
+
+#if GTK_CHECK_VERSION(3,0,0)
+        g_object_set(G_OBJECT(ctx->drawingareas[i].area),
+                     "margin-bottom", 8, (const char *)NULL);
+#endif
+
         gtk_widget_show(ctx->drawingareas[i].area);
     }
     ctx->active_area = rand() % N_DRAWING_AREAS;
@@ -388,7 +413,7 @@ static const char *gtk_askpass_setup(struct askpass_ctx *ctx,
 
     /*
      * And now that we've got the keyboard grab, connect up our
-     * keyboard handlers, and display the prompt.
+     * keyboard handlers.
      */
 #if GTK_CHECK_VERSION(2,0,0)
     g_signal_connect(G_OBJECT(ctx->imc), "commit",
@@ -402,14 +427,15 @@ static const char *gtk_askpass_setup(struct askpass_ctx *ctx,
     gtk_im_context_set_client_window(ctx->imc,
                                      gtk_widget_get_window(ctx->dialog));
 #endif
-    gtk_widget_show(ctx->promptlabel);
 
     return NULL;
 }
 
 static void gtk_askpass_cleanup(struct askpass_ctx *ctx)
 {
-#if GTK_CHECK_VERSION(3,0,0)
+#if GTK_CHECK_VERSION(3,20,0)
+    gdk_seat_ungrab(ctx->seat);
+#elif GTK_CHECK_VERSION(3,0,0)
     gdk_device_ungrab(ctx->keyboard, GDK_CURRENT_TIME);
 #else
     gdk_keyboard_ungrab(GDK_CURRENT_TIME);