X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=unix%2Fgtkask.c;h=c2b582e9c9afe29e29a2d0befaf5c6dd3453ecca;hb=095072fa46b2d7b8beafaddb2f873d2f500a1e10;hp=8d984a3528e8194840fd6428ab62fbe941af01fa;hpb=dc11417aeeec0735071cf98347af6f9616ba6a2e;p=PuTTY.git diff --git a/unix/gtkask.c b/unix/gtkask.c index 8d984a35..c2b582e9 100644 --- a/unix/gtkask.c +++ b/unix/gtkask.c @@ -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 is quite complicated in GTK 3. + * 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) + /* + * And it has to be done differently again prior to GTK 3.20. */ GdkDeviceManager *dm; GdkDevice *pointer, *keyboard; @@ -303,7 +321,12 @@ static const char *gtk_askpass_setup(struct askpass_ctx *ctx, gtk_window_set_title(GTK_WINDOW(ctx->dialog), window_title); 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); +#endif our_dialog_add_to_content_area(GTK_WINDOW(ctx->dialog), ctx->promptlabel, TRUE, TRUE, 0); #if GTK_CHECK_VERSION(2,0,0) @@ -352,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; @@ -384,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", @@ -398,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); @@ -495,7 +525,7 @@ int main(int argc, char **argv) ret = dupprintf("usage: %s ", argv[0]); } else { srand(time(NULL)); - ret = gtk_askpass_main(argv[1], &success); + ret = gtk_askpass_main(NULL, "Enter passphrase", argv[1], &success); } if (!success) {