X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=unix%2Fgtkask.c;h=c2b582e9c9afe29e29a2d0befaf5c6dd3453ecca;hb=095072fa46b2d7b8beafaddb2f873d2f500a1e10;hp=c247a925b8fb8886ffd3e080c1cc47d971a3b16e;hpb=976e7782695070a0e20163e13b692e2d1150f401;p=PuTTY.git diff --git a/unix/gtkask.c b/unix/gtkask.c index c247a925..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 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); @@ -499,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) {