X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/3f935d5bf975b26836da2fac5cd6e3df67a5e184..79bf227ba7ba02e32ac710621b672e2789f9ef50:/config.c diff --git a/config.c b/config.c index 7204a6c3..d3d76f57 100644 --- a/config.c +++ b/config.c @@ -133,12 +133,18 @@ static void printerbox_handler(union control *ctrl, void *dlg, printer_enum *pe; dlg_update_start(ctrl, dlg); - dlg_listbox_clear(ctrl, dlg); - dlg_listbox_add(ctrl, dlg, PRINTER_DISABLED_STRING); - pe = printer_start_enum(&nprinters); - for (i = 0; i < nprinters; i++) - dlg_listbox_add(ctrl, dlg, printer_get_name(pe, i)); - printer_finish_enum(pe); + /* + * Some backends may wish to disable the drop-down list on + * this edit box. Be prepared for this. + */ + if (ctrl->editbox.has_list) { + dlg_listbox_clear(ctrl, dlg); + dlg_listbox_add(ctrl, dlg, PRINTER_DISABLED_STRING); + pe = printer_start_enum(&nprinters); + for (i = 0; i < nprinters; i++) + dlg_listbox_add(ctrl, dlg, printer_get_name(pe, i)); + printer_finish_enum(pe); + } dlg_editbox_set(ctrl, dlg, (*cfg->printer ? cfg->printer : PRINTER_DISABLED_STRING)); @@ -156,7 +162,7 @@ static void codepage_handler(union control *ctrl, void *dlg, Config *cfg = (Config *)data; if (event == EVENT_REFRESH) { int i; - char *cp; + const char *cp; dlg_update_start(ctrl, dlg); strcpy(cfg->line_codepage, cp_name(decode_codepage(cfg->line_codepage))); @@ -250,8 +256,12 @@ static void sessionsaver_handler(union control *ctrl, void *dlg, * 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). + * + * Of course, this doesn't need to be done mid-session. */ - if (!dlg_get_privdata(ssd->editbox, dlg)) { + if (!ssd->editbox) { + savedsession = NULL; + } else if (!dlg_get_privdata(ssd->editbox, dlg)) { savedsession = (char *) dlg_alloc_privdata(ssd->editbox, dlg, SAVEDSESSION_LEN); savedsession[0] = '\0'; @@ -327,6 +337,11 @@ static void sessionsaver_handler(union control *ctrl, void *dlg, dlg_refresh(ssd->listbox, dlg); } } else if (ctrl == ssd->okbutton) { + if (!savedsession) { + /* In a mid-session Change Settings, Apply is always OK. */ + dlg_end(dlg, 1); + return; + } /* * Annoying special case. If the `Open' button is * pressed while no host name is currently set, _and_ @@ -343,6 +358,7 @@ static void sessionsaver_handler(union control *ctrl, void *dlg, /* If at this point we have a valid session, go! */ if (*cfg2.host) { *cfg = cfg2; /* structure copy */ + cfg->remote_cmd_ptr = cfg->remote_cmd; /* nasty */ dlg_end(dlg, 1); } else dlg_beep(dlg); @@ -634,24 +650,31 @@ static void portfwd_handler(union control *ctrl, void *dlg, if (ctrl == pfd->addbutton) { char str[sizeof(cfg->portfwd)]; char *p; - if (dlg_radiobutton_get(pfd->direction, dlg) == 0) + int whichbutton = dlg_radiobutton_get(pfd->direction, dlg); + if (whichbutton == 0) str[0] = 'L'; - else + else if (whichbutton == 1) str[0] = 'R'; + else + str[0] = 'D'; dlg_editbox_get(pfd->sourcebox, dlg, str+1, sizeof(str) - 2); if (!str[1]) { dlg_error_msg(dlg, "You need to specify a source port number"); return; } p = str + strlen(str); - *p++ = '\t'; - dlg_editbox_get(pfd->destbox, dlg, p, sizeof(str)-1 - (p - str)); - if (!*p || !strchr(p, ':')) { - dlg_error_msg(dlg, - "You need to specify a destination address\n" - "in the form \"host.name:port\""); - return; - } + if (str[0] != 'D') { + *p++ = '\t'; + dlg_editbox_get(pfd->destbox, dlg, p, + sizeof(str)-1 - (p - str)); + if (!*p || !strchr(p, ':')) { + dlg_error_msg(dlg, + "You need to specify a destination address\n" + "in the form \"host.name:port\""); + return; + } + } else + *p = '\0'; p = cfg->portfwd; while (*p) { while (*p) @@ -713,9 +736,11 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, struct environ_data *ed; struct portfwd_data *pfd; union control *c; + char *str; ssd = (struct sessionsaver_data *) ctrl_alloc(b, sizeof(struct sessionsaver_data)); + memset(ssd, 0, sizeof(*ssd)); ssd->sesslist = (midsession ? NULL : sesslist); /* @@ -741,7 +766,9 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, /* * The Session panel. */ - ctrl_settitle(b, "Session", "Basic options for your PuTTY session"); + str = dupprintf("Basic options for your %s session", appname); + ctrl_settitle(b, "Session", str); + sfree(str); if (!midsession) { s = ctrl_getset(b, "Session", "hostport", @@ -823,14 +850,27 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, ctrl_settitle(b, "Session/Logging", "Options controlling session logging"); s = ctrl_getset(b, "Session/Logging", "main", NULL); - ctrl_radiobuttons(s, "Session logging:", NO_SHORTCUT, 1, - HELPCTX(logging_main), - dlg_stdradiobutton_handler, I(offsetof(Config, logtype)), - "Logging turned off completely", 't', I(LGTYP_NONE), - "Log printable output only", 'p', I(LGTYP_ASCII), - "Log all session output", 'l', I(LGTYP_DEBUG), - "Log SSH packet data", 's', I(LGTYP_PACKETS), - NULL); + /* + * The logging buttons change depending on whether SSH packet + * logging can sensibly be available. + */ + { + char *sshlogname; + if ((midsession && protocol == PROT_SSH) || + (!midsession && backends[3].name != NULL)) + sshlogname = "Log SSH packet data"; + else + sshlogname = NULL; /* this will disable the button */ + ctrl_radiobuttons(s, "Session logging:", NO_SHORTCUT, 1, + HELPCTX(logging_main), + dlg_stdradiobutton_handler, + I(offsetof(Config, logtype)), + "Logging turned off completely", 't', I(LGTYP_NONE), + "Log printable output only", 'p', I(LGTYP_ASCII), + "Log all session output", 'l', I(LGTYP_DEBUG), + sshlogname, 's', I(LGTYP_PACKETS), + NULL); + } ctrl_filesel(s, "Log file name:", 'f', NULL, TRUE, "Select session log file name", HELPCTX(logging_filename), @@ -988,17 +1028,28 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, HELPCTX(features_retitle), dlg_stdcheckbox_handler, I(offsetof(Config,no_remote_wintitle))); + ctrl_checkbox(s, "Disable remote window title querying (SECURITY)", + 'q', HELPCTX(features_qtitle), dlg_stdcheckbox_handler, + I(offsetof(Config,no_remote_qtitle))); ctrl_checkbox(s, "Disable destructive backspace on server sending ^?",'b', HELPCTX(features_dbackspace), dlg_stdcheckbox_handler, I(offsetof(Config,no_dbackspace))); ctrl_checkbox(s, "Disable remote-controlled character set configuration", 'r', HELPCTX(features_charset), dlg_stdcheckbox_handler, I(offsetof(Config,no_remote_charset))); + ctrl_checkbox(s, "Disable Arabic text shaping", + 'l', HELPCTX(features_arabicshaping), dlg_stdcheckbox_handler, + I(offsetof(Config, arabicshaping))); + ctrl_checkbox(s, "Disable bidirectional text display", + 'd', HELPCTX(features_bidi), dlg_stdcheckbox_handler, + I(offsetof(Config, bidi))); /* * The Window panel. */ - ctrl_settitle(b, "Window", "Options controlling PuTTY's window"); + str = dupprintf("Options controlling %s's window", appname); + ctrl_settitle(b, "Window", str); + sfree(str); s = ctrl_getset(b, "Window", "size", "Set the size of the window"); ctrl_columns(s, 2, 50, 50); @@ -1034,8 +1085,9 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, /* * The Window/Appearance panel. */ - ctrl_settitle(b, "Window/Appearance", - "Configure the appearance of PuTTY's window"); + str = dupprintf("Configure the appearance of %s's window", appname); + ctrl_settitle(b, "Window/Appearance", str); + sfree(str); s = ctrl_getset(b, "Window/Appearance", "cursor", "Adjust the use of the cursor"); @@ -1072,8 +1124,9 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, /* * The Window/Behaviour panel. */ - ctrl_settitle(b, "Window/Behaviour", - "Configure the behaviour of PuTTY's window"); + str = dupprintf("Configure the behaviour of %s's window", appname); + ctrl_settitle(b, "Window/Behaviour", str); + sfree(str); s = ctrl_getset(b, "Window/Behaviour", "title", "Adjust the behaviour of the window title"); @@ -1103,26 +1156,24 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, 'r', 100, HELPCTX(translation_codepage), codepage_handler, P(NULL), P(NULL)); - s = ctrl_getset(b, "Window/Translation", "linedraw", - "Adjust how PuTTY displays line drawing characters"); + str = dupprintf("Adjust how %s handles line drawing characters", appname); + s = ctrl_getset(b, "Window/Translation", "linedraw", str); + sfree(str); ctrl_radiobuttons(s, "Handling of line drawing characters:", NO_SHORTCUT,1, HELPCTX(translation_linedraw), dlg_stdradiobutton_handler, I(offsetof(Config, vtmode)), - "Font has XWindows encoding", 'x', I(VT_XWINDOWS), + "Use Unicode line drawing code points",'u',I(VT_UNICODE), "Poor man's line drawing (+, - and |)",'p',I(VT_POORMAN), - "Unicode mode", 'u', I(VT_UNICODE), NULL); + NULL); + ctrl_checkbox(s, "Copy and paste line drawing characters as lqqqk",'d', + HELPCTX(selection_linedraw), + dlg_stdcheckbox_handler, I(offsetof(Config,rawcnp))); /* * The Window/Selection panel. */ ctrl_settitle(b, "Window/Selection", "Options controlling copy and paste"); - - s = ctrl_getset(b, "Window/Selection", "trans", - "Translation of pasted characters"); - ctrl_checkbox(s, "Don't translate line drawing chars into +, - and |",'d', - HELPCTX(selection_linedraw), - dlg_stdcheckbox_handler, I(offsetof(Config,rawcnp))); s = ctrl_getset(b, "Window/Selection", "mouse", "Control use of mouse"); @@ -1174,8 +1225,9 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, HELPCTX(colours_bold), dlg_stdcheckbox_handler, I(offsetof(Config,bold_colour))); - s = ctrl_getset(b, "Window/Colours", "adjust", - "Adjust the precise colours PuTTY displays"); + str = dupprintf("Adjust the precise colours %s displays", appname); + s = ctrl_getset(b, "Window/Colours", "adjust", str); + sfree(str); ctrl_text(s, "Select a colour from the list, and then click the" " Modify button to change its appearance.", HELPCTX(colours_config)); @@ -1202,36 +1254,50 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, ctrl_columns(s, 1, 100); /* - * The Connection panel. + * The Connection panel. This doesn't show up if we're in a + * non-network utility such as pterm. We tell this by being + * passed a protocol < 0. */ - ctrl_settitle(b, "Connection", "Options controlling the connection"); + if (protocol >= 0) { + ctrl_settitle(b, "Connection", "Options controlling the connection"); - if (!midsession) { - s = ctrl_getset(b, "Connection", "data", "Data to send to the server"); - ctrl_editbox(s, "Terminal-type string", 't', 50, - HELPCTX(connection_termtype), - dlg_stdeditbox_handler, I(offsetof(Config,termtype)), - I(sizeof(((Config *)0)->termtype))); - ctrl_editbox(s, "Auto-login username", 'u', 50, - HELPCTX(connection_username), - dlg_stdeditbox_handler, I(offsetof(Config,username)), - I(sizeof(((Config *)0)->username))); - } + if (!midsession) { + s = ctrl_getset(b, "Connection", "data", + "Data to send to the server"); + ctrl_editbox(s, "Terminal-type string", 't', 50, + HELPCTX(connection_termtype), + dlg_stdeditbox_handler, I(offsetof(Config,termtype)), + I(sizeof(((Config *)0)->termtype))); + ctrl_editbox(s, "Terminal speeds", 's', 50, + HELPCTX(connection_termspeed), + dlg_stdeditbox_handler, I(offsetof(Config,termspeed)), + I(sizeof(((Config *)0)->termspeed))); + ctrl_editbox(s, "Auto-login username", 'u', 50, + HELPCTX(connection_username), + dlg_stdeditbox_handler, I(offsetof(Config,username)), + I(sizeof(((Config *)0)->username))); + } - s = ctrl_getset(b, "Connection", "keepalive", - "Sending of null packets to keep session active"); - ctrl_editbox(s, "Seconds between keepalives (0 to turn off)", 'k', 20, - HELPCTX(connection_keepalive), - dlg_stdeditbox_handler, I(offsetof(Config,ping_interval)), - I(-1)); + s = ctrl_getset(b, "Connection", "keepalive", + "Sending of null packets to keep session active"); + ctrl_editbox(s, "Seconds between keepalives (0 to turn off)", 'k', 20, + HELPCTX(connection_keepalive), + dlg_stdeditbox_handler, I(offsetof(Config,ping_interval)), + I(-1)); + + if (!midsession) { + s = ctrl_getset(b, "Connection", "tcp", + "Low-level TCP connection options"); + ctrl_checkbox(s, "Disable Nagle's algorithm (TCP_NODELAY option)", + 'n', HELPCTX(connection_nodelay), + dlg_stdcheckbox_handler, + I(offsetof(Config,tcp_nodelay))); + ctrl_checkbox(s, "Enable TCP keepalives (SO_KEEPALIVE option)", + 'p', HELPCTX(connection_tcpkeepalive), + dlg_stdcheckbox_handler, + I(offsetof(Config,tcp_keepalives))); + } - if (!midsession) { - s = ctrl_getset(b, "Connection", "tcp", - "Low-level TCP connection options"); - ctrl_checkbox(s, "Disable Nagle's algorithm (TCP_NODELAY option)", 'n', - HELPCTX(connection_nodelay), - dlg_stdcheckbox_handler, - I(offsetof(Config,tcp_nodelay))); } if (!midsession) { @@ -1241,15 +1307,16 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, ctrl_settitle(b, "Connection/Proxy", "Options controlling proxy usage"); - s = ctrl_getset(b, "Connection/Proxy", "basics", "Proxy basics"); - ctrl_radiobuttons(s, "Proxy type:", NO_SHORTCUT, 4, + s = ctrl_getset(b, "Connection/Proxy", "basics", NULL); + ctrl_radiobuttons(s, "Proxy type:", 't', 3, HELPCTX(proxy_type), dlg_stdradiobutton_handler, I(offsetof(Config, proxy_type)), - "None", 'n', I(PROXY_NONE), - "HTTP", 't', I(PROXY_HTTP), - "SOCKS", 's', I(PROXY_SOCKS), - "Telnet", 'l', I(PROXY_TELNET), + "None", I(PROXY_NONE), + "SOCKS 4", I(PROXY_SOCKS4), + "SOCKS 5", I(PROXY_SOCKS5), + "HTTP", I(PROXY_HTTP), + "Telnet", I(PROXY_TELNET), NULL); ctrl_columns(s, 2, 80, 20); c = ctrl_editbox(s, "Proxy hostname", 'y', 100, @@ -1292,19 +1359,11 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, I(offsetof(Config,proxy_password)), I(sizeof(((Config *)0)->proxy_password))); c->editbox.password = 1; - - s = ctrl_getset(b, "Connection/Proxy", "misc", - "Miscellaneous proxy settings"); ctrl_editbox(s, "Telnet command", 'm', 100, HELPCTX(proxy_command), dlg_stdeditbox_handler, I(offsetof(Config,proxy_telnet_command)), I(sizeof(((Config *)0)->proxy_telnet_command))); - ctrl_radiobuttons(s, "SOCKS Version", 'v', 2, - HELPCTX(proxy_socksver), - dlg_stdradiobutton_handler, - I(offsetof(Config, proxy_socks_version)), - "Version 5", I(5), "Version 4", I(4), NULL); } /* @@ -1321,10 +1380,6 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, if (!midsession) { s = ctrl_getset(b, "Connection/Telnet", "data", "Data to send to the server"); - ctrl_editbox(s, "Terminal-speed string", 's', 50, - HELPCTX(telnet_termspeed), - dlg_stdeditbox_handler, I(offsetof(Config,termspeed)), - I(sizeof(((Config *)0)->termspeed))); ctrl_text(s, "Environment variables:", HELPCTX(telnet_environ)); ctrl_columns(s, 2, 80, 20); ed = (struct environ_data *) @@ -1393,10 +1448,6 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, s = ctrl_getset(b, "Connection/Rlogin", "data", "Data to send to the server"); - ctrl_editbox(s, "Terminal-speed string", 's', 50, - HELPCTX(rlogin_termspeed), - dlg_stdeditbox_handler, I(offsetof(Config,termspeed)), - I(sizeof(((Config *)0)->termspeed))); ctrl_editbox(s, "Local username:", 'l', 50, HELPCTX(rlogin_localuser), dlg_stdeditbox_handler, I(offsetof(Config,localusername)), @@ -1447,7 +1498,7 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, cipherlist_handler, P(NULL)); c->listbox.height = 6; - ctrl_checkbox(s, "Enable non-standard use of single-DES in SSH 2", 'i', + ctrl_checkbox(s, "Enable legacy use of single-DES in SSH 2", 'i', HELPCTX(ssh_ciphers), dlg_stdcheckbox_handler, I(offsetof(Config,ssh2_des_cbc))); @@ -1550,11 +1601,13 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist, pfd->destbox = ctrl_editbox(s, "Destination", 'i', 67, HELPCTX(ssh_tunnels_portfwd), portfwd_handler, P(pfd), P(NULL)); - pfd->direction = ctrl_radiobuttons(s, NULL, NO_SHORTCUT, 2, + pfd->direction = ctrl_radiobuttons(s, NULL, NO_SHORTCUT, 3, HELPCTX(ssh_tunnels_portfwd), portfwd_handler, P(pfd), "Local", 'l', P(NULL), - "Remote", 'm', P(NULL), NULL); + "Remote", 'm', P(NULL), + "Dynamic", 'y', P(NULL), + NULL); ctrl_tabdelay(s, pfd->addbutton); ctrl_columns(s, 1, 100);