X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/876e5d5e627d117190851e41c0fb3d2d08cac70d..3f935d5bf975b26836da2fac5cd6e3df67a5e184:/config.c diff --git a/config.c b/config.c index 922bfa14..7204a6c3 100644 --- a/config.c +++ b/config.c @@ -110,7 +110,7 @@ static void cipherlist_handler(union control *ctrl, void *dlg, break; } } - dlg_listbox_addwithindex(ctrl, dlg, cstr, c); + dlg_listbox_addwithid(ctrl, dlg, cstr, c); } dlg_update_done(ctrl, dlg); @@ -179,9 +179,9 @@ static void sshbug_handler(union control *ctrl, void *dlg, if (event == EVENT_REFRESH) { dlg_update_start(ctrl, dlg); dlg_listbox_clear(ctrl, dlg); - dlg_listbox_addwithindex(ctrl, dlg, "Auto", AUTO); - dlg_listbox_addwithindex(ctrl, dlg, "Off", FORCE_OFF); - dlg_listbox_addwithindex(ctrl, dlg, "On", FORCE_ON); + dlg_listbox_addwithid(ctrl, dlg, "Auto", AUTO); + dlg_listbox_addwithid(ctrl, dlg, "Off", FORCE_OFF); + dlg_listbox_addwithid(ctrl, dlg, "On", FORCE_ON); switch (*(int *)ATOFFSET(data, ctrl->listbox.context.i)) { case AUTO: dlg_listbox_select(ctrl, dlg, 0); break; case FORCE_OFF: dlg_listbox_select(ctrl, dlg, 1); break; @@ -198,10 +198,11 @@ static void sshbug_handler(union control *ctrl, void *dlg, } } +#define SAVEDSESSION_LEN 2048 + struct sessionsaver_data { union control *editbox, *listbox, *loadbutton, *savebutton, *delbutton; union control *okbutton, *cancelbutton; - char savedsession[2048]; struct sesslist *sesslist; }; @@ -211,6 +212,7 @@ struct sessionsaver_data { * failure. */ static int load_selected_session(struct sessionsaver_data *ssd, + char *savedsession, void *dlg, Config *cfg) { int i = dlg_listbox_index(ssd->listbox, dlg); @@ -222,11 +224,11 @@ static int load_selected_session(struct sessionsaver_data *ssd, isdef = !strcmp(ssd->sesslist->sessions[i], "Default Settings"); load_settings(ssd->sesslist->sessions[i], !isdef, cfg); if (!isdef) { - strncpy(ssd->savedsession, ssd->sesslist->sessions[i], - sizeof(ssd->savedsession)); - ssd->savedsession[sizeof(ssd->savedsession)-1] = '\0'; + strncpy(savedsession, ssd->sesslist->sessions[i], + SAVEDSESSION_LEN); + savedsession[SAVEDSESSION_LEN-1] = '\0'; } else { - ssd->savedsession[0] = '\0'; + savedsession[0] = '\0'; } dlg_refresh(NULL, dlg); /* Restore the selection, which might have been clobbered by @@ -241,10 +243,25 @@ static void sessionsaver_handler(union control *ctrl, void *dlg, Config *cfg = (Config *)data; struct sessionsaver_data *ssd = (struct sessionsaver_data *)ctrl->generic.context.p; + char *savedsession; + + /* + * The first time we're called in a new dialog, we must + * allocate space to store the current contents of the saved + * session edit box (since it must persist even when we switch + * panels, but is not part of the Config). + */ + if (!dlg_get_privdata(ssd->editbox, dlg)) { + savedsession = (char *) + dlg_alloc_privdata(ssd->editbox, dlg, SAVEDSESSION_LEN); + savedsession[0] = '\0'; + } else { + savedsession = dlg_get_privdata(ssd->editbox, dlg); + } if (event == EVENT_REFRESH) { if (ctrl == ssd->editbox) { - dlg_editbox_set(ctrl, dlg, ssd->savedsession); + dlg_editbox_set(ctrl, dlg, savedsession); } else if (ctrl == ssd->listbox) { int i; dlg_update_start(ctrl, dlg); @@ -255,8 +272,8 @@ static void sessionsaver_handler(union control *ctrl, void *dlg, } } else if (event == EVENT_VALCHANGE) { if (ctrl == ssd->editbox) { - dlg_editbox_get(ctrl, dlg, ssd->savedsession, - sizeof(ssd->savedsession)); + dlg_editbox_get(ctrl, dlg, savedsession, + SAVEDSESSION_LEN); } } else if (event == EVENT_ACTION) { if (ctrl == ssd->listbox || ctrl == ssd->loadbutton) { @@ -267,34 +284,40 @@ static void sessionsaver_handler(union control *ctrl, void *dlg, * double-click on the list box _and_ that session * contains a hostname. */ - if (load_selected_session(ssd, dlg, cfg) && + if (load_selected_session(ssd, savedsession, dlg, cfg) && (ctrl == ssd->listbox && cfg->host[0])) { dlg_end(dlg, 1); /* it's all over, and succeeded */ } } else if (ctrl == ssd->savebutton) { - int isdef = !strcmp(ssd->savedsession, "Default Settings"); - if (!ssd->savedsession[0]) { - int i = dlg_listbox_index(ctrl, dlg); + int isdef = !strcmp(savedsession, "Default Settings"); + if (!savedsession[0]) { + int i = dlg_listbox_index(ssd->listbox, dlg); if (i < 0) { dlg_beep(dlg); return; } isdef = !strcmp(ssd->sesslist->sessions[i], "Default Settings"); if (!isdef) { - strncpy(ssd->savedsession, ssd->sesslist->sessions[i], - sizeof(ssd->savedsession)); - ssd->savedsession[sizeof(ssd->savedsession)-1] = '\0'; + strncpy(savedsession, ssd->sesslist->sessions[i], + SAVEDSESSION_LEN); + savedsession[SAVEDSESSION_LEN-1] = '\0'; } else { - ssd->savedsession[0] = '\0'; + savedsession[0] = '\0'; } } - save_settings(ssd->savedsession, isdef, cfg); + { + char *errmsg = save_settings(savedsession, !isdef, cfg); + if (errmsg) { + dlg_error_msg(dlg, errmsg); + sfree(errmsg); + } + } get_sesslist(ssd->sesslist, FALSE); get_sesslist(ssd->sesslist, TRUE); dlg_refresh(ssd->editbox, dlg); dlg_refresh(ssd->listbox, dlg); } else if (ctrl == ssd->delbutton) { - int i = dlg_listbox_index(ctrl, dlg); + int i = dlg_listbox_index(ssd->listbox, dlg); if (i <= 0) { dlg_beep(dlg); } else { @@ -311,9 +334,9 @@ static void sessionsaver_handler(union control *ctrl, void *dlg, * there was a session selected in that which had a * valid host name in it, then load it and go. */ - if (dlg_last_focused(dlg) == ssd->listbox && !*cfg->host) { + if (dlg_last_focused(ctrl, dlg) == ssd->listbox && !*cfg->host) { Config cfg2; - if (!load_selected_session(ssd, dlg, &cfg2)) { + if (!load_selected_session(ssd, savedsession, dlg, &cfg2)) { dlg_beep(dlg); return; } @@ -379,7 +402,7 @@ static void charclass_handler(union control *ctrl, void *dlg, } struct colour_data { - union control *listbox, *rgbtext, *button; + union control *listbox, *redit, *gedit, *bedit, *button; }; static const char *const colours[] = { @@ -412,7 +435,9 @@ static void colour_handler(union control *ctrl, void *dlg, for (i = 0; i < lenof(colours); i++) dlg_listbox_add(ctrl, dlg, colours[i]); dlg_update_done(ctrl, dlg); - dlg_text_set(cd->rgbtext, dlg, ""); + dlg_editbox_set(cd->redit, dlg, ""); + dlg_editbox_set(cd->gedit, dlg, ""); + dlg_editbox_set(cd->bedit, dlg, ""); } } else if (event == EVENT_SELCHANGE) { if (ctrl == cd->listbox) { @@ -427,6 +452,25 @@ static void colour_handler(union control *ctrl, void *dlg, b = cfg->colours[i][2]; update = TRUE; } + } else if (event == EVENT_VALCHANGE) { + if (ctrl == cd->redit || ctrl == cd->gedit || ctrl == cd->bedit) { + /* The user has changed the colour using the edit boxes. */ + char buf[80]; + int i, cval; + + dlg_editbox_get(ctrl, dlg, buf, lenof(buf)); + cval = atoi(buf) & 255; + + i = dlg_listbox_index(cd->listbox, dlg); + if (i >= 0) { + if (ctrl == cd->redit) + cfg->colours[i][0] = cval; + else if (ctrl == cd->gedit) + cfg->colours[i][1] = cval; + else if (ctrl == cd->bedit) + cfg->colours[i][2] = cval; + } + } } else if (event == EVENT_ACTION) { if (ctrl == cd->button) { int i = dlg_listbox_index(cd->listbox, dlg); @@ -463,8 +507,9 @@ static void colour_handler(union control *ctrl, void *dlg, if (update) { char buf[40]; - sprintf(buf, "%02x/%02x/%02x", r, g, b); - dlg_text_set(cd->rgbtext, dlg, buf); + sprintf(buf, "%d", r); dlg_editbox_set(cd->redit, dlg, buf); + sprintf(buf, "%d", g); dlg_editbox_set(cd->gedit, dlg, buf); + sprintf(buf, "%d", b); dlg_editbox_set(cd->bedit, dlg, buf); } } @@ -579,6 +624,11 @@ static void portfwd_handler(union control *ctrl, void *dlg, p += strlen(p) + 1; } dlg_update_done(ctrl, dlg); + } else if (ctrl == pfd->direction) { + /* + * Default is Local. + */ + dlg_radiobutton_set(ctrl, dlg, 0); } } else if (event == EVENT_ACTION) { if (ctrl == pfd->addbutton) { @@ -683,6 +733,7 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, ssd->okbutton->generic.column = 3; ssd->cancelbutton = ctrl_pushbutton(s, "Cancel", 'c', HELPCTX(no_help), sessionsaver_handler, P(ssd)); + ssd->cancelbutton->button.iscancel = TRUE; ssd->cancelbutton->generic.column = 4; /* We carefully don't close the 5-column part, so that platform- * specific add-ons can put extra buttons alongside Open and Cancel. */ @@ -706,7 +757,7 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, I(offsetof(Config,port)), I(-1)); c->generic.column = 1; ctrl_columns(s, 1, 100); - if (backends[3].backend == NULL) { + if (backends[3].name == NULL) { ctrl_radiobuttons(s, "Protocol:", NO_SHORTCUT, 3, HELPCTX(session_hostname), protocolbuttons_handler, P(c), @@ -728,7 +779,6 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, s = ctrl_getset(b, "Session", "savedsessions", "Load, save or delete a stored session"); ctrl_columns(s, 2, 75, 25); - ssd->savedsession[0] = '\0'; ssd->sesslist = sesslist; ssd->editbox = ctrl_editbox(s, "Saved Sessions", 'e', 100, HELPCTX(session_saved), @@ -738,6 +788,11 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, * than alongside that edit box. */ ctrl_columns(s, 1, 100); ctrl_columns(s, 2, 75, 25); + ssd->listbox = ctrl_listbox(s, NULL, NO_SHORTCUT, + HELPCTX(session_saved), + sessionsaver_handler, P(ssd)); + ssd->listbox->generic.column = 0; + ssd->listbox->listbox.height = 7; ssd->loadbutton = ctrl_pushbutton(s, "Load", 'l', HELPCTX(session_saved), sessionsaver_handler, P(ssd)); @@ -750,11 +805,6 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, HELPCTX(session_saved), sessionsaver_handler, P(ssd)); ssd->delbutton->generic.column = 1; - ssd->listbox = ctrl_listbox(s, NULL, NO_SHORTCUT, - HELPCTX(session_saved), - sessionsaver_handler, P(ssd)); - ssd->listbox->generic.column = 0; - ssd->listbox->listbox.height = 7; ctrl_columns(s, 1, 100); } @@ -903,13 +953,13 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, ctrl_editbox(s, "... in this many seconds", 't', 20, HELPCTX(bell_overload), dlg_stdeditbox_handler, I(offsetof(Config,bellovl_t)), - I(-1000)); + I(-TICKSPERSEC)); ctrl_text(s, "The bell is re-enabled after a few seconds of silence.", HELPCTX(bell_overload)); ctrl_editbox(s, "Seconds of silence required", 's', 20, HELPCTX(bell_overload), dlg_stdeditbox_handler, I(offsetof(Config,bellovl_s)), - I(-1000)); + I(-TICKSPERSEC)); /* * The Terminal/Features panel. @@ -970,10 +1020,6 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, ctrl_checkbox(s, "Display scrollbar", 'd', HELPCTX(window_scrollback), dlg_stdcheckbox_handler, I(offsetof(Config,scrollbar))); - ctrl_checkbox(s, "Display scrollbar in full screen mode", 'i', - HELPCTX(window_scrollback), - dlg_stdcheckbox_handler, - I(offsetof(Config,scrollbar_in_fullscreen))); ctrl_checkbox(s, "Reset scrollback on keypress", 'k', HELPCTX(window_scrollback), dlg_stdcheckbox_handler, I(offsetof(Config,scroll_on_key))); @@ -1101,7 +1147,7 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, charclass_handler, P(ccd)); ccd->listbox->listbox.multisel = 1; ccd->listbox->listbox.ncols = 4; - ccd->listbox->listbox.percentages = smalloc(4*sizeof(int)); + ccd->listbox->listbox.percentages = snewn(4, int); ccd->listbox->listbox.percentages[0] = 15; ccd->listbox->listbox.percentages[1] = 25; ccd->listbox->listbox.percentages[2] = 20; @@ -1138,10 +1184,18 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, cd->listbox = ctrl_listbox(s, "Select a colour to adjust:", 'u', HELPCTX(colours_config), colour_handler, P(cd)); cd->listbox->generic.column = 0; + cd->listbox->listbox.height = 7; c = ctrl_text(s, "RGB value:", HELPCTX(colours_config)); c->generic.column = 1; - cd->rgbtext = ctrl_text(s, "00/00/00", HELPCTX(colours_config)); - cd->rgbtext->generic.column = 1; + cd->redit = ctrl_editbox(s, "Red", 'r', 50, HELPCTX(colours_config), + colour_handler, P(cd), P(NULL)); + cd->redit->generic.column = 1; + cd->gedit = ctrl_editbox(s, "Green", 'n', 50, HELPCTX(colours_config), + colour_handler, P(cd), P(NULL)); + cd->gedit->generic.column = 1; + cd->bedit = ctrl_editbox(s, "Blue", 'e', 50, HELPCTX(colours_config), + colour_handler, P(cd), P(NULL)); + cd->bedit->generic.column = 1; cd->button = ctrl_pushbutton(s, "Modify", 'm', HELPCTX(colours_config), colour_handler, P(cd)); cd->button->generic.column = 1; @@ -1296,6 +1350,10 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, HELPCTX(telnet_environ), environ_handler, P(ed)); ed->listbox->listbox.height = 3; + ed->listbox->listbox.ncols = 2; + ed->listbox->listbox.percentages = snewn(2, int); + ed->listbox->listbox.percentages[0] = 30; + ed->listbox->listbox.percentages[1] = 70; } s = ctrl_getset(b, "Connection/Telnet", "protocol", @@ -1350,7 +1408,7 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, * All the SSH stuff is omitted in PuTTYtel. */ - if (!midsession && backends[3].backend != NULL) { + if (!midsession && backends[3].name != NULL) { /* * The Connection/SSH panel. @@ -1384,9 +1442,11 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, "2 only", 'n', I(3), NULL); s = ctrl_getset(b, "Connection/SSH", "encryption", "Encryption options"); - ctrl_draglist(s, "Encryption cipher selection policy:", 's', - HELPCTX(ssh_ciphers), - cipherlist_handler, P(NULL)); + c = ctrl_draglist(s, "Encryption cipher selection policy:", 's', + HELPCTX(ssh_ciphers), + cipherlist_handler, P(NULL)); + c->listbox.height = 6; + ctrl_checkbox(s, "Enable non-standard use of single-DES in SSH 2", 'i', HELPCTX(ssh_ciphers), dlg_stdcheckbox_handler, @@ -1470,6 +1530,10 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, HELPCTX(ssh_tunnels_portfwd), portfwd_handler, P(pfd)); pfd->listbox->listbox.height = 3; + pfd->listbox->listbox.ncols = 2; + pfd->listbox->listbox.percentages = snewn(2, int); + pfd->listbox->listbox.percentages[0] = 20; + pfd->listbox->listbox.percentages[1] = 80; ctrl_tabdelay(s, pfd->rembutton); ctrl_text(s, "Add new forwarded port:", HELPCTX(ssh_tunnels_portfwd)); /* You want to enter source, destination and type, _then_ hit Add.