X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/3d9449a111194530856126f3dc89543d83fa0440..7374c7790ee32f36855e4257eb15d2fe43e277ea:/unix/gtkdlg.c diff --git a/unix/gtkdlg.c b/unix/gtkdlg.c index 2ef18313..19546d9c 100644 --- a/unix/gtkdlg.c +++ b/unix/gtkdlg.c @@ -549,7 +549,35 @@ void dlg_listbox_select(union control *ctrl, void *dlg, int index) if (uc->optmenu) { gtk_option_menu_set_history(GTK_OPTION_MENU(uc->optmenu), index); } else { + int nitems; + GList *items; + gdouble newtop, newbot; + gtk_list_select_item(GTK_LIST(uc->list), index); + + /* + * Scroll the list box if necessary to ensure the newly + * selected item is visible. + */ + items = gtk_container_children(GTK_CONTAINER(uc->list)); + nitems = g_list_length(items); + if (nitems > 0) { + int modified = FALSE; + g_list_free(items); + newtop = uc->adj->lower + + (uc->adj->upper - uc->adj->lower) * index / nitems; + newbot = uc->adj->lower + + (uc->adj->upper - uc->adj->lower) * (index+1) / nitems; + if (uc->adj->value > newtop) { + modified = TRUE; + uc->adj->value = newtop; + } else if (uc->adj->value < newbot - uc->adj->page_size) { + modified = TRUE; + uc->adj->value = newbot - uc->adj->page_size; + } + if (modified) + gtk_adjustment_value_changed(uc->adj); + } } } @@ -564,6 +592,17 @@ void dlg_text_set(union control *ctrl, void *dlg, char const *text) gtk_label_set_text(GTK_LABEL(uc->text), text); } +void dlg_label_change(union control *ctrl, void *dlg, char const *text) +{ + /* + * This function is currently only used by the config box to + * switch the labels on the host and port boxes between serial + * and network modes. Since Unix does not (yet) have a serial + * back end, this function can safely do nothing for the + * moment. + */ +} + void dlg_filesel_set(union control *ctrl, void *dlg, Filename fn) { struct dlgparam *dp = (struct dlgparam *)dlg; @@ -1956,7 +1995,6 @@ int do_config_box(const char *title, Config *cfg, int midsession, GtkTreeItem *treeitemlevels[8]; GtkTree *treelevels[8]; struct dlgparam dp; - struct sesslist sl; struct Shortcuts scs; struct selparam *selparams = NULL; @@ -1964,8 +2002,6 @@ int do_config_box(const char *title, Config *cfg, int midsession, dlg_init(&dp); - get_sesslist(&sl, TRUE); - listitemheight = get_listitemheight(); for (index = 0; index < lenof(scs.sc); index++) { @@ -1975,7 +2011,7 @@ int do_config_box(const char *title, Config *cfg, int midsession, window = gtk_dialog_new(); ctrlbox = ctrl_new_box(); - setup_config_box(ctrlbox, &sl, midsession, cfg->protocol, protcfginfo); + setup_config_box(ctrlbox, midsession, cfg->protocol, protcfginfo); unix_setup_config_box(ctrlbox, midsession); gtk_setup_config_box(ctrlbox, midsession, window); @@ -2161,7 +2197,6 @@ int do_config_box(const char *title, Config *cfg, int midsession, gtk_main(); - get_sesslist(&sl, FALSE); dlg_cleanup(&dp); sfree(selparams); @@ -2347,13 +2382,12 @@ int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, sfree(text); - if (ret == 0) - return 0; /* do not continue with connection */ - else { - if (ret == 2) - store_host_key(host, port, keytype, keystr); - return 1; /* continue with connection */ - } + if (ret == 2) { + store_host_key(host, port, keytype, keystr); + return 1; /* continue with connection */ + } else if (ret == 1) + return 1; /* continue with connection */ + return 0; /* do not continue with connection */ } /* @@ -2425,11 +2459,12 @@ static void licence_clicked(GtkButton *button, gpointer data) char *title; char *licence = - "Copyright 1997-2005 Simon Tatham.\n\n" + "Copyright 1997-2006 Simon Tatham.\n\n" "Portions copyright Robert de Bath, Joris van Rantwijk, Delian " "Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas " - "Barry, Justin Bradford, Ben Harris, Malcolm Smith, and CORE SDI S.A.\n\n" + "Barry, Justin Bradford, Ben Harris, Malcolm Smith, Ahmad Khalifa, " + "Markus Kuhn, and CORE SDI S.A.\n\n" "Permission is hereby granted, free of charge, to any person " "obtaining a copy of this software and associated documentation " @@ -2505,7 +2540,7 @@ void about_box(void *window) w, FALSE, FALSE, 5); gtk_widget_show(w); - w = gtk_label_new("Copyright 1997-2005 Simon Tatham. All rights reserved"); + w = gtk_label_new("Copyright 1997-2006 Simon Tatham. All rights reserved"); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(aboutbox)->vbox), w, FALSE, FALSE, 5); gtk_widget_show(w); @@ -2753,7 +2788,8 @@ void logevent_dlg(void *estuff, const char *string) es->nevents++; } -int askappend(void *frontend, Filename filename) +int askappend(void *frontend, Filename filename, + void (*callback)(void *ctx, int result), void *ctx) { static const char msgtemplate[] = "The session log file \"%.*s\" already exists. "