X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=windlg.c;h=6c4d26c3dee07c402f89e7a5355acb87de6fb32f;hb=3f8bd285983e7cbf677d2469990a72e1dd94be16;hp=3a33d7e67a18d76f9c27d1887a5957725e103dab;hpb=66a5fe7301eec62090325e1c5d5ab83b7c46de42;p=PuTTY.git diff --git a/windlg.c b/windlg.c index 3a33d7e6..6c4d26c3 100644 --- a/windlg.c +++ b/windlg.c @@ -12,11 +12,18 @@ #include "win_res.h" #include "storage.h" +#ifdef MSVC4 +#define TVINSERTSTRUCT TV_INSERTSTRUCT +#define TVITEM TV_ITEM +#define ICON_BIG 1 +#endif + static char **events = NULL; static int nevents = 0, negsize = 0; static int readytogo; static int sesslist_has_focus; +static int requested_help; static struct prefslist cipherlist; @@ -256,6 +263,7 @@ enum { IDCX_ABOUT = IDC_LSTATOFF, IDC_LSTATASCII, IDC_LSTATRAW, + IDC_LSTATPACKET, IDC_LGFSTATIC, IDC_LGFEDIT, IDC_LGFBUTTON, @@ -295,7 +303,6 @@ enum { IDCX_ABOUT = IDC_CURAPPLIC, IDC_COMPOSEKEY, IDC_CTRLALTKEYS, - IDC_TELNETKEY, keyboardpanelend, terminalpanelstart, @@ -405,12 +412,14 @@ enum { IDCX_ABOUT = IDC_TITLE_CONNECTION, IDC_BOX_CONNECTION1, IDC_BOX_CONNECTION2, + IDC_BOX_CONNECTION3, IDC_TTSTATIC, IDC_TTEDIT, IDC_LOGSTATIC, IDC_LOGEDIT, IDC_PINGSTATIC, IDC_PINGEDIT, + IDC_NODELAY, connectionpanelend, telnetpanelstart, @@ -433,6 +442,8 @@ enum { IDCX_ABOUT = IDC_ACTSTATIC, IDC_TPASSIVE, IDC_TACTIVE, + IDC_TELNETKEY, + IDC_TELNETRET, telnetpanelend, rloginpanelstart, @@ -457,6 +468,7 @@ enum { IDCX_ABOUT = IDC_CIPHERUP, IDC_CIPHERDN, IDC_BUGGYMAC, + IDC_SSH2DES, IDC_SSHPROTSTATIC, IDC_SSHPROT1, IDC_SSHPROT2, @@ -473,7 +485,9 @@ enum { IDCX_ABOUT = IDC_PKEDIT, IDC_PKBUTTON, IDC_AGENTFWD, + IDC_CHANGEUSER, IDC_AUTHTIS, + IDC_AUTHKI, sshauthpanelend, selectionpanelstart, @@ -538,6 +552,7 @@ enum { IDCX_ABOUT = IDC_X11_DISPSTATIC, IDC_X11_DISPLAY, IDC_LPORT_ALL, + IDC_RPORT_ALL, IDC_PFWDSTATIC, IDC_PFWDSTATIC2, IDC_PFWDREMOVE, @@ -586,6 +601,332 @@ static void fmtfont(char *buf) (cfg.fontheight < 0 ? -cfg.fontheight : cfg.fontheight)); } +char *help_context_cmd(int id) +{ + switch (id) { + case IDC_HOSTSTATIC: + case IDC_HOST: + case IDC_PORTSTATIC: + case IDC_PORT: + case IDC_PROTSTATIC: + case IDC_PROTRAW: + case IDC_PROTTELNET: + case IDC_PROTRLOGIN: + case IDC_PROTSSH: + return "JI(`',`session.hostname')"; + case IDC_SESSSTATIC: + case IDC_SESSEDIT: + case IDC_SESSLIST: + case IDC_SESSLOAD: + case IDC_SESSSAVE: + case IDC_SESSDEL: + return "JI(`',`session.saved')"; + case IDC_CLOSEEXIT: + case IDC_COEALWAYS: + case IDC_COENEVER: + case IDC_COENORMAL: + return "JI(`',`session.coe')"; + case IDC_LSTATSTATIC: + case IDC_LSTATOFF: + case IDC_LSTATASCII: + case IDC_LSTATRAW: + case IDC_LSTATPACKET: + return "JI(`',`logging.main')"; + case IDC_LGFSTATIC: + case IDC_LGFEDIT: + case IDC_LGFBUTTON: + case IDC_LGFEXPLAIN: + return "JI(`',`logging.filename')"; + case IDC_LSTATXIST: + case IDC_LSTATXOVR: + case IDC_LSTATXAPN: + case IDC_LSTATXASK: + return "JI(`',`logging.exists')"; + + case IDC_DELSTATIC: + case IDC_DEL008: + case IDC_DEL127: + return "JI(`',`keyboard.backspace')"; + case IDC_HOMESTATIC: + case IDC_HOMETILDE: + case IDC_HOMERXVT: + return "JI(`',`keyboard.homeend')"; + case IDC_FUNCSTATIC: + case IDC_FUNCTILDE: + case IDC_FUNCLINUX: + case IDC_FUNCXTERM: + case IDC_FUNCVT400: + case IDC_FUNCVT100P: + case IDC_FUNCSCO: + return "JI(`',`keyboard.funkeys')"; + case IDC_KPSTATIC: + case IDC_KPNORMAL: + case IDC_KPAPPLIC: + case IDC_NOAPPLICK: + return "JI(`',`keyboard.appkeypad')"; + case IDC_NOAPPLICC: + case IDC_CURSTATIC: + case IDC_CURNORMAL: + case IDC_CURAPPLIC: + return "JI(`',`keyboard.appcursor')"; + case IDC_KPNH: + return "JI(`',`keyboard.nethack')"; + case IDC_COMPOSEKEY: + return "JI(`',`keyboard.compose')"; + case IDC_CTRLALTKEYS: + return "JI(`',`keyboard.ctrlalt')"; + + case IDC_WRAPMODE: + return "JI(`',`terminal.autowrap')"; + case IDC_DECOM: + return "JI(`',`terminal.decom')"; + case IDC_LFHASCR: + return "JI(`',`terminal.lfhascr')"; + case IDC_BCE: + return "JI(`',`terminal.bce')"; + case IDC_BLINKTEXT: + return "JI(`',`terminal.blink')"; + case IDC_ANSWERBACK: + case IDC_ANSWEREDIT: + return "JI(`',`terminal.answerback')"; + case IDC_ECHOSTATIC: + case IDC_ECHOBACKEND: + case IDC_ECHOYES: + case IDC_ECHONO: + return "JI(`',`terminal.localecho')"; + case IDC_EDITSTATIC: + case IDC_EDITBACKEND: + case IDC_EDITYES: + case IDC_EDITNO: + return "JI(`',`terminal.localedit')"; + + case IDC_BELLSTATIC: + case IDC_BELL_DISABLED: + case IDC_BELL_DEFAULT: + case IDC_BELL_WAVEFILE: + case IDC_BELL_VISUAL: + case IDC_BELL_WAVESTATIC: + case IDC_BELL_WAVEEDIT: + case IDC_BELL_WAVEBROWSE: + return "JI(`',`bell.style')"; + case IDC_B_IND_STATIC: + case IDC_B_IND_DISABLED: + case IDC_B_IND_FLASH: + case IDC_B_IND_STEADY: + return "JI(`',`bell.taskbar')"; + case IDC_BELLOVL: + case IDC_BELLOVLNSTATIC: + case IDC_BELLOVLN: + case IDC_BELLOVLTSTATIC: + case IDC_BELLOVLT: + case IDC_BELLOVLEXPLAIN: + case IDC_BELLOVLSSTATIC: + case IDC_BELLOVLS: + return "JI(`',`bell.overload')"; + + case IDC_ROWSSTATIC: + case IDC_ROWSEDIT: + case IDC_COLSSTATIC: + case IDC_COLSEDIT: + return "JI(`',`window.size')"; + case IDC_RESIZESTATIC: + case IDC_RESIZETERM: + case IDC_RESIZEFONT: + case IDC_RESIZENONE: + case IDC_RESIZEEITHER: + return "JI(`',`window.resize')"; + case IDC_SCROLLBAR: + case IDC_SCROLLBARFULLSCREEN: + case IDC_SAVESTATIC: + case IDC_SAVEEDIT: + case IDC_SCROLLKEY: + case IDC_SCROLLDISP: + return "JI(`',`window.scrollback')"; + + case IDC_CLOSEWARN: + return "JI(`',`behaviour.closewarn')"; + case IDC_ALTF4: + return "JI(`',`behaviour.altf4')"; + case IDC_ALTSPACE: + return "JI(`',`behaviour.altspace')"; + case IDC_ALTONLY: + return "JI(`',`behaviour.altonly')"; + case IDC_ALWAYSONTOP: + return "JI(`',`behaviour.alwaysontop')"; + case IDC_FULLSCREENONALTENTER: + return "JI(`',`behaviour.altenter')"; + + case IDC_CURSORSTATIC: + case IDC_CURBLOCK: + case IDC_CURUNDER: + case IDC_CURVERT: + case IDC_BLINKCUR: + return "JI(`',`appearance.cursor')"; + case IDC_FONTSTATIC: + case IDC_CHOOSEFONT: + return "JI(`',`appearance.font')"; + case IDC_WINTITLE: + case IDC_WINEDIT: + case IDC_WINNAME: + return "JI(`',`appearance.title')"; + case IDC_HIDEMOUSE: + return "JI(`',`appearance.hidemouse')"; + case IDC_SUNKENEDGE: + case IDC_WINBSTATIC: + case IDC_WINBEDIT: + return "JI(`',`appearance.border')"; + + case IDC_TTSTATIC: + case IDC_TTEDIT: + return "JI(`',`connection.termtype')"; + case IDC_LOGSTATIC: + case IDC_LOGEDIT: + return "JI(`',`connection.username')"; + case IDC_PINGSTATIC: + case IDC_PINGEDIT: + return "JI(`',`connection.keepalive')"; + case IDC_NODELAY: + return "JI(`',`connection.nodelay')"; + + case IDC_TSSTATIC: + case IDC_TSEDIT: + return "JI(`',`telnet.termspeed')"; + case IDC_ENVSTATIC: + case IDC_VARSTATIC: + case IDC_VAREDIT: + case IDC_VALSTATIC: + case IDC_VALEDIT: + case IDC_ENVLIST: + case IDC_ENVADD: + case IDC_ENVREMOVE: + return "JI(`',`telnet.environ')"; + case IDC_EMSTATIC: + case IDC_EMBSD: + case IDC_EMRFC: + return "JI(`',`telnet.oldenviron')"; + case IDC_ACTSTATIC: + case IDC_TPASSIVE: + case IDC_TACTIVE: + return "JI(`',`telnet.passive')"; + case IDC_TELNETKEY: + return "JI(`',`telnet.specialkeys')"; + case IDC_TELNETRET: + return "JI(`',`telnet.newline')"; + + case IDC_R_TSSTATIC: + case IDC_R_TSEDIT: + return "JI(`',`rlogin.termspeed')"; + case IDC_RLLUSERSTATIC: + case IDC_RLLUSEREDIT: + return "JI(`',`rlogin.localuser')"; + + case IDC_NOPTY: + return "JI(`',`ssh.nopty')"; + case IDC_CIPHERSTATIC2: + case IDC_CIPHERLIST: + case IDC_CIPHERUP: + case IDC_CIPHERDN: + case IDC_SSH2DES: + return "JI(`',`ssh.ciphers')"; + case IDC_BUGGYMAC: + return "JI(`',`ssh.buggymac')"; + case IDC_SSHPROTSTATIC: + case IDC_SSHPROT1: + case IDC_SSHPROT2: + return "JI(`',`ssh.protocol')"; + case IDC_CMDSTATIC: + case IDC_CMDEDIT: + return "JI(`',`ssh.command')"; + case IDC_COMPRESS: + return "JI(`',`ssh.compress')"; + + case IDC_PKSTATIC: + case IDC_PKEDIT: + case IDC_PKBUTTON: + return "JI(`',`ssh.auth.privkey')"; + case IDC_AGENTFWD: + return "JI(`',`ssh.auth.agentfwd')"; + case IDC_CHANGEUSER: + return "JI(`',`ssh.auth.changeuser')"; + case IDC_AUTHTIS: + return "JI(`',`ssh.auth.tis')"; + case IDC_AUTHKI: + return "JI(`',`ssh.auth.ki')"; + + case IDC_MBSTATIC: + case IDC_MBWINDOWS: + case IDC_MBXTERM: + return "JI(`',`selection.buttons')"; + case IDC_MOUSEOVERRIDE: + return "JI(`',`selection.shiftdrag')"; + case IDC_SELTYPESTATIC: + case IDC_SELTYPELEX: + case IDC_SELTYPERECT: + return "JI(`',`selection.rect')"; + case IDC_CCSTATIC: + case IDC_CCLIST: + case IDC_CCSET: + case IDC_CCSTATIC2: + case IDC_CCEDIT: + return "JI(`',`selection.charclasses')"; + case IDC_RAWCNP: + return "JI(`',`selection.linedraw')"; + case IDC_RTFPASTE: + return "JI(`',`selection.rtf')"; + + case IDC_BOLDCOLOUR: + return "JI(`',`colours.bold')"; + case IDC_PALETTE: + return "JI(`',`colours.logpal')"; + case IDC_COLOURSTATIC: + case IDC_COLOURLIST: + case IDC_RSTATIC: + case IDC_GSTATIC: + case IDC_BSTATIC: + case IDC_RVALUE: + case IDC_GVALUE: + case IDC_BVALUE: + case IDC_CHANGE: + return "JI(`',`colours.config')"; + + case IDC_CODEPAGESTATIC: + case IDC_CODEPAGE: + return "JI(`',`translation.codepage')"; + case IDC_CAPSLOCKCYR: + return "JI(`',`translation.cyrillic')"; + case IDC_VTSTATIC: + case IDC_VTXWINDOWS: + case IDC_VTOEMANSI: + case IDC_VTOEMONLY: + case IDC_VTPOORMAN: + case IDC_VTUNICODE: + return "JI(`',`translation.linedraw')"; + + case IDC_X11_FORWARD: + case IDC_X11_DISPSTATIC: + case IDC_X11_DISPLAY: + return "JI(`',`ssh.tunnels.x11')"; + case IDC_PFWDSTATIC: + case IDC_PFWDSTATIC2: + case IDC_PFWDREMOVE: + case IDC_PFWDLIST: + case IDC_PFWDADD: + case IDC_SPORTSTATIC: + case IDC_SPORTEDIT: + case IDC_DPORTSTATIC: + case IDC_DPORTEDIT: + case IDC_PFWDLOCAL: + case IDC_PFWDREMOTE: + return "JI(`',`ssh.tunnels.portfwd')"; + case IDC_LPORT_ALL: + case IDC_RPORT_ALL: + return "JI(`',`ssh.tunnels.portfwd.localhost')"; + + default: + return NULL; + } +} + /* 2nd arg: NZ => don't redraw session list (use when loading * a new session) */ static void init_dlg_ctrls(HWND hwnd, int keepsess) @@ -611,6 +952,7 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess) cfg.protocol == PROT_RLOGIN ? IDC_PROTRLOGIN : IDC_PROTRAW); SetDlgItemInt(hwnd, IDC_PINGEDIT, cfg.ping_interval, FALSE); + CheckDlgButton(hwnd, IDC_NODELAY, cfg.tcp_nodelay); CheckRadioButton(hwnd, IDC_DEL008, IDC_DEL127, cfg.bksp_is_delete ? IDC_DEL127 : IDC_DEL008); @@ -636,6 +978,7 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess) CheckDlgButton(hwnd, IDC_COMPOSEKEY, cfg.compose_key); CheckDlgButton(hwnd, IDC_CTRLALTKEYS, cfg.ctrlaltkeys); CheckDlgButton(hwnd, IDC_TELNETKEY, cfg.telnet_keyboard); + CheckDlgButton(hwnd, IDC_TELNETRET, cfg.telnet_newline); CheckRadioButton(hwnd, IDC_ECHOBACKEND, IDC_ECHONO, cfg.localecho == LD_BACKEND ? IDC_ECHOBACKEND : cfg.localecho == LD_YES ? IDC_ECHOYES : IDC_ECHONO); @@ -704,9 +1047,11 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess) SetDlgItemText(hwnd, IDC_RLLUSEREDIT, cfg.localusername); SetDlgItemText(hwnd, IDC_LOGEDIT, cfg.username); SetDlgItemText(hwnd, IDC_LGFEDIT, cfg.logfilename); - CheckRadioButton(hwnd, IDC_LSTATOFF, IDC_LSTATRAW, - cfg.logtype == 0 ? IDC_LSTATOFF : - cfg.logtype == 1 ? IDC_LSTATASCII : IDC_LSTATRAW); + CheckRadioButton(hwnd, IDC_LSTATOFF, IDC_LSTATPACKET, + cfg.logtype == LGTYP_NONE ? IDC_LSTATOFF : + cfg.logtype == LGTYP_ASCII ? IDC_LSTATASCII : + cfg.logtype == LGTYP_DEBUG ? IDC_LSTATRAW : + IDC_LSTATPACKET); CheckRadioButton(hwnd, IDC_LSTATXOVR, IDC_LSTATXASK, cfg.logxfovr == LGXF_OVR ? IDC_LSTATXOVR : cfg.logxfovr == LGXF_ASK ? IDC_LSTATXASK : @@ -736,10 +1081,13 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess) CheckDlgButton(hwnd, IDC_NOPTY, cfg.nopty); CheckDlgButton(hwnd, IDC_COMPRESS, cfg.compression); CheckDlgButton(hwnd, IDC_BUGGYMAC, cfg.buggymac); + CheckDlgButton(hwnd, IDC_SSH2DES, cfg.ssh2_des_cbc); CheckDlgButton(hwnd, IDC_AGENTFWD, cfg.agentfwd); + CheckDlgButton(hwnd, IDC_CHANGEUSER, cfg.change_username); CheckRadioButton(hwnd, IDC_SSHPROT1, IDC_SSHPROT2, cfg.sshprot == 1 ? IDC_SSHPROT1 : IDC_SSHPROT2); CheckDlgButton(hwnd, IDC_AUTHTIS, cfg.try_tis_auth); + CheckDlgButton(hwnd, IDC_AUTHKI, cfg.try_ki_auth); SetDlgItemText(hwnd, IDC_PKEDIT, cfg.keyfile); SetDlgItemText(hwnd, IDC_CMDEDIT, cfg.remote_cmd); @@ -836,6 +1184,7 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess) SetDlgItemText(hwnd, IDC_X11_DISPLAY, cfg.x11_display); CheckDlgButton(hwnd, IDC_LPORT_ALL, cfg.lport_acceptall); + CheckDlgButton(hwnd, IDC_RPORT_ALL, cfg.rport_acceptall); CheckRadioButton(hwnd, IDC_PFWDLOCAL, IDC_PFWDREMOTE, IDC_PFWDLOCAL); } @@ -875,7 +1224,7 @@ static HTREEITEM treeview_insert(struct treeview_faff *faff, static void create_controls(HWND hwnd, int dlgtype, int panel) { if (panel == sessionpanelstart) { - /* The Session panel. Accelerators used: [acgo] nprtih elsd w */ + /* The Session panel. Accelerators used: [acgoh] nprtis elvd w */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Basic options for your PuTTY session", @@ -899,9 +1248,9 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) "&Telnet", IDC_PROTTELNET, "Rlog&in", IDC_PROTRLOGIN, #ifdef FWHACK - "SS&H/hack", + "&SSH/hack", #else - "SS&H", + "&SSH", #endif IDC_PROTSSH, NULL); } @@ -911,7 +1260,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) sesssaver(&cp, "Sav&ed Sessions", IDC_SESSSTATIC, IDC_SESSEDIT, IDC_SESSLIST, "&Load", IDC_SESSLOAD, - "&Save", IDC_SESSSAVE, "&Delete", IDC_SESSDEL, NULL); + "Sa&ve", IDC_SESSSAVE, "&Delete", IDC_SESSDEL, NULL); endbox(&cp); } beginbox(&cp, NULL, IDC_BOX_SESSION3); @@ -923,7 +1272,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) } if (panel == loggingpanelstart) { - /* The Logging panel. Accelerators used: [acgo] tplfwe */ + /* The Logging panel. Accelerators used: [acgoh] tplsfwe */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling session logging", @@ -933,7 +1282,9 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) "Session logging:", IDC_LSTATSTATIC, "Logging &turned off completely", IDC_LSTATOFF, "Log &printable output only", IDC_LSTATASCII, - "&Log all session output", IDC_LSTATRAW, NULL); + "&Log all session output", IDC_LSTATRAW, + "Log &SSH packet data", IDC_LSTATPACKET, + NULL); editbutton(&cp, "Log &file name:", IDC_LGFSTATIC, IDC_LGFEDIT, "Bro&wse...", IDC_LGFBUTTON); @@ -948,7 +1299,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) } if (panel == terminalpanelstart) { - /* The Terminal panel. Accelerators used: [acgo] wdlen hts */ + /* The Terminal panel. Accelerators used: [acgoh] wdren lts */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling the terminal emulation", @@ -956,7 +1307,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) beginbox(&cp, "Set various terminal options", IDC_BOX_TERMINAL1); checkbox(&cp, "Auto &wrap mode initially on", IDC_WRAPMODE); checkbox(&cp, "&DEC Origin Mode initially on", IDC_DECOM); - checkbox(&cp, "Implicit CR in every &LF", IDC_LFHASCR); + checkbox(&cp, "Implicit C&R in every LF", IDC_LFHASCR); checkbox(&cp, "Use background colour to &erase screen", IDC_BCE); checkbox(&cp, "Enable bli&nking text", IDC_BLINKTEXT); multiedit(&cp, @@ -965,7 +1316,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) endbox(&cp); beginbox(&cp, "Line discipline options", IDC_BOX_TERMINAL2); - radioline(&cp, "Local ec&ho:", IDC_ECHOSTATIC, 3, + radioline(&cp, "&Local echo:", IDC_ECHOSTATIC, 3, "Auto", IDC_ECHOBACKEND, "Force on", IDC_ECHOYES, "Force off", IDC_ECHONO, NULL); radioline(&cp, "Local line edi&ting:", IDC_EDITSTATIC, 3, @@ -975,7 +1326,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) } if (panel == bellpanelstart) { - /* The Bell panel. Accelerators used: [acgo] bdsm wit */ + /* The Bell panel. Accelerators used: [acgoh] bdsm wit */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling the terminal bell", @@ -1012,7 +1363,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) } if (panel == keyboardpanelstart) { - /* The Keyboard panel. Accelerators used: [acgo] bhf ruyntd */ + /* The Keyboard panel. Accelerators used: [acgoh] bef ruyntd */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling the effects of keys", @@ -1021,7 +1372,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) radioline(&cp, "The &Backspace key", IDC_DELSTATIC, 2, "Control-H", IDC_DEL008, "Control-? (127)", IDC_DEL127, NULL); - radioline(&cp, "The &Home and End keys", IDC_HOMESTATIC, 2, + radioline(&cp, "The Home and &End keys", IDC_HOMESTATIC, 2, "Standard", IDC_HOMETILDE, "rxvt", IDC_HOMERXVT, NULL); radioline(&cp, "The &Function keys and keypad", IDC_FUNCSTATIC, 3, "ESC[n~", IDC_FUNCTILDE, @@ -1053,7 +1404,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) } if (panel == windowpanelstart) { - /* The Window panel. Accelerators used: [acgo] rmz sdikp */ + /* The Window panel. Accelerators used: [acgoh] rmz sdikp */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling PuTTY's window", @@ -1081,7 +1432,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) } if (panel == appearancepanelstart) { - /* The Appearance panel. Accelerators used: [acgo] luvb h ti p s */ + /* The Appearance panel. Accelerators used: [acgoh] luvb n ti p s */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Configure the appearance of PuTTY's window", @@ -1095,7 +1446,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) endbox(&cp); beginbox(&cp, "Set the font used in the terminal window", IDC_BOX_APPEARANCE2); - staticbtn(&cp, "", IDC_FONTSTATIC, "C&hange...", IDC_CHOOSEFONT); + staticbtn(&cp, "", IDC_FONTSTATIC, "Cha&nge...", IDC_CHOOSEFONT); endbox(&cp); beginbox(&cp, "Adjust the use of the window title", IDC_BOX_APPEARANCE3); @@ -1117,7 +1468,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) } if (panel == behaviourpanelstart) { - /* The Behaviour panel. Accelerators used: [acgo] w4yltf */ + /* The Behaviour panel. Accelerators used: [acgoh] w4yltf */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Configure the behaviour of PuTTY's window", @@ -1133,7 +1484,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) } if (panel == translationpanelstart) { - /* The Translation panel. Accelerators used: [acgo] rxbepus */ + /* The Translation panel. Accelerators used: [acgoh] rxbepus */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling character set translation", @@ -1161,7 +1512,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) } if (panel == selectionpanelstart) { - /* The Selection panel. Accelerators used: [acgo] df wxp hst nr */ + /* The Selection panel. Accelerators used: [acgoh] df wxp est nr */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling copy and paste", @@ -1192,14 +1543,14 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) endbox(&cp); beginbox(&cp, "Control the select-one-word-at-a-time mode", IDC_BOX_SELECTION3); - charclass(&cp, "C&haracter classes:", IDC_CCSTATIC, IDC_CCLIST, + charclass(&cp, "Charact&er classes:", IDC_CCSTATIC, IDC_CCLIST, "&Set", IDC_CCSET, IDC_CCEDIT, "&to class", IDC_CCSTATIC2); endbox(&cp); } if (panel == colourspanelstart) { - /* The Colours panel. Accelerators used: [acgo] blum */ + /* The Colours panel. Accelerators used: [acgoh] blum */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling use of colours", @@ -1222,7 +1573,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) } if (panel == connectionpanelstart) { - /* The Connection panel. Accelerators used: [acgo] tuk */ + /* The Connection panel. Accelerators used: [acgoh] tukn */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling the connection", @@ -1239,6 +1590,8 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) beginbox(&cp, "Adjust telnet session.", IDC_BOX_CONNECTION1); checkbox(&cp, "Keyboard sends telnet Backspace and Interrupt", IDC_TELNETKEY); + checkbox(&cp, "Return key sends telnet New Line instead of ^M", + IDC_TELNETRET); endbox(&cp); } beginbox(&cp, "Sending of null packets to keep session active", @@ -1246,10 +1599,17 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) staticedit(&cp, "Seconds between &keepalives (0 to turn off)", IDC_PINGSTATIC, IDC_PINGEDIT, 20); endbox(&cp); + if (dlgtype == 0) { + beginbox(&cp, "Low-level TCP connection options", + IDC_BOX_CONNECTION3); + checkbox(&cp, "Disable &Nagle's algorithm (TCP_NODELAY option)", + IDC_NODELAY); + endbox(&cp); + } } if (panel == telnetpanelstart) { - /* The Telnet panel. Accelerators used: [acgo] svldr bftk */ + /* The Telnet panel. Accelerators used: [acgoh] svldr bftk */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); if (dlgtype == 0) { @@ -1272,12 +1632,14 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) IDC_TACTIVE, NULL); checkbox(&cp, "&Keyboard sends telnet Backspace and Interrupt", IDC_TELNETKEY); + checkbox(&cp, "Return key sends telnet New Line instead of ^M", + IDC_TELNETRET); endbox(&cp); } } if (panel == rloginpanelstart) { - /* The Rlogin panel. Accelerators used: [acgo] sl */ + /* The Rlogin panel. Accelerators used: [acgoh] sl */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); if (dlgtype == 0) { @@ -1293,7 +1655,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) } if (panel == sshpanelstart) { - /* The SSH panel. Accelerators used: [acgo] r pe12i s */ + /* The SSH panel. Accelerators used: [acgoh] r pe12i sd */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); if (dlgtype == 0) { @@ -1317,12 +1679,14 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) prefslist(&cipherlist, &cp, "Encryption cipher &selection policy:", IDC_CIPHERSTATIC2, IDC_CIPHERLIST, IDC_CIPHERUP, IDC_CIPHERDN); + checkbox(&cp, "Enable non-standard use of single-&DES in SSH 2", + IDC_SSH2DES); endbox(&cp); } } if (panel == sshauthpanelstart) { - /* The SSH authentication panel. Accelerators used: [acgo] m fkw */ + /* The SSH authentication panel. Accelerators used: [acgoh] m fkiuw */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); if (dlgtype == 0) { @@ -1330,12 +1694,16 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) IDC_TITLE_SSHAUTH); beginbox(&cp, "Authentication methods", IDC_BOX_SSHAUTH1); - checkbox(&cp, "Atte&mpt TIS or CryptoCard authentication", + checkbox(&cp, "Atte&mpt TIS or CryptoCard authentication (SSH1)", IDC_AUTHTIS); + checkbox(&cp, "Attempt \"keyboard-&interactive\" authentication" + " (SSH2)", IDC_AUTHKI); endbox(&cp); beginbox(&cp, "Authentication parameters", IDC_BOX_SSHAUTH2); checkbox(&cp, "Allow agent &forwarding", IDC_AGENTFWD); + checkbox(&cp, "Allow attempted changes of &username in SSH2", + IDC_CHANGEUSER); editbutton(&cp, "Private &key file for authentication:", IDC_PKSTATIC, IDC_PKEDIT, "Bro&wse...", IDC_PKBUTTON); @@ -1344,7 +1712,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) } if (panel == tunnelspanelstart) { - /* The Tunnels panel. Accelerators used: [acgo] deilmrstx */ + /* The Tunnels panel. Accelerators used: [acgoh] deilmrstxp */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); if (dlgtype == 0) { @@ -1356,7 +1724,10 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) IDC_X11_DISPLAY, 50, NULL); endbox(&cp); beginbox(&cp, "Port forwarding", IDC_BOX_TUNNELS2); - checkbox(&cp, "Local ports accept connections from o&ther hosts", IDC_LPORT_ALL); + checkbox(&cp, "Local ports accept connections from o&ther hosts", + IDC_LPORT_ALL); + checkbox(&cp, "Remote &ports do the same (SSH v2 only)", + IDC_RPORT_ALL); staticbtn(&cp, "Forwarded ports:", IDC_PFWDSTATIC, "&Remove", IDC_PFWDREMOVE); fwdsetter(&cp, IDC_PFWDLIST, @@ -1365,7 +1736,8 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) "Dest&ination", IDC_DPORTSTATIC, IDC_DPORTEDIT, "A&dd", IDC_PFWDADD); bareradioline(&cp, 2, - "&Local", IDC_PFWDLOCAL, "Re&mote", IDC_PFWDREMOTE, NULL); + "&Local", IDC_PFWDLOCAL, + "Re&mote", IDC_PFWDREMOTE, NULL); endbox(&cp); } @@ -1422,6 +1794,15 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg, case WM_INITDIALOG: readytogo = 0; SetWindowLong(hwnd, GWL_USERDATA, 0); + if (help_path) + SetWindowLong(hwnd, GWL_EXSTYLE, + GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_CONTEXTHELP); + else { + HWND item = GetDlgItem(hwnd, IDC_HELPBTN); + if (item) + DestroyWindow(item); + } + requested_help = FALSE; SendMessage(hwnd, WM_SETICON, (WPARAM) ICON_BIG, (LPARAM) LoadIcon(hinst, MAKEINTRESOURCE(IDI_CFGICON))); /* @@ -1618,12 +1999,31 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg, } } /* If at this point we have a valid session, go! */ - if (*cfg.host) + if (*cfg.host) { + if (requested_help) { + WinHelp(hwnd, help_path, HELP_QUIT, 0); + requested_help = FALSE; + } EndDialog(hwnd, 1); - else + } else MessageBeep(0); return 0; + case IDC_HELPBTN: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) { + if (help_path) { + WinHelp(hwnd, help_path, + help_has_contents ? HELP_FINDER : HELP_CONTENTS, + 0); + requested_help = TRUE; + } + } + break; case IDCANCEL: + if (requested_help) { + WinHelp(hwnd, help_path, HELP_QUIT, 0); + requested_help = FALSE; + } EndDialog(hwnd, 0); return 0; case IDC_PROTTELNET: @@ -1773,6 +2173,12 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg, MyGetDlgItemInt(hwnd, IDC_PINGEDIT, &cfg.ping_interval); break; + case IDC_NODELAY: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.tcp_nodelay = + IsDlgButtonChecked(hwnd, IDC_NODELAY); + break; case IDC_DEL008: case IDC_DEL127: if (HIWORD(wParam) == BN_CLICKED || @@ -1941,6 +2347,12 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg, cfg.telnet_keyboard = IsDlgButtonChecked(hwnd, IDC_TELNETKEY); break; + case IDC_TELNETRET: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.telnet_newline = + IsDlgButtonChecked(hwnd, IDC_TELNETRET); + break; case IDC_WRAPMODE: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) @@ -2230,14 +2642,17 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg, case IDC_LSTATOFF: case IDC_LSTATASCII: case IDC_LSTATRAW: + case IDC_LSTATPACKET: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { if (IsDlgButtonChecked(hwnd, IDC_LSTATOFF)) - cfg.logtype = 0; + cfg.logtype = LGTYP_NONE; if (IsDlgButtonChecked(hwnd, IDC_LSTATASCII)) - cfg.logtype = 1; + cfg.logtype = LGTYP_ASCII; if (IsDlgButtonChecked(hwnd, IDC_LSTATRAW)) - cfg.logtype = 2; + cfg.logtype = LGTYP_DEBUG; + if (IsDlgButtonChecked(hwnd, IDC_LSTATPACKET)) + cfg.logtype = LGTYP_PACKETS; } break; case IDC_LSTATXASK: @@ -2372,12 +2787,24 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg, cfg.buggymac = IsDlgButtonChecked(hwnd, IDC_BUGGYMAC); break; + case IDC_SSH2DES: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.ssh2_des_cbc = + IsDlgButtonChecked(hwnd, IDC_SSH2DES); + break; case IDC_AGENTFWD: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.agentfwd = IsDlgButtonChecked(hwnd, IDC_AGENTFWD); break; + case IDC_CHANGEUSER: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.change_username = + IsDlgButtonChecked(hwnd, IDC_CHANGEUSER); + break; case IDC_CIPHERLIST: case IDC_CIPHERUP: case IDC_CIPHERDN: @@ -2401,6 +2828,12 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg, cfg.try_tis_auth = IsDlgButtonChecked(hwnd, IDC_AUTHTIS); break; + case IDC_AUTHKI: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.try_ki_auth = + IsDlgButtonChecked(hwnd, IDC_AUTHKI); + break; case IDC_PKEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText(hwnd, IDC_PKEDIT, cfg.keyfile, @@ -2602,14 +3035,20 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg, case IDC_X11_FORWARD: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) - cfg.x11_forward = - IsDlgButtonChecked(hwnd, IDC_X11_FORWARD); + cfg.x11_forward = + IsDlgButtonChecked(hwnd, IDC_X11_FORWARD); break; case IDC_LPORT_ALL: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) - cfg.lport_acceptall = - IsDlgButtonChecked(hwnd, IDC_LPORT_ALL); + cfg.lport_acceptall = + IsDlgButtonChecked(hwnd, IDC_LPORT_ALL); + break; + case IDC_RPORT_ALL: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.rport_acceptall = + IsDlgButtonChecked(hwnd, IDC_RPORT_ALL); break; case IDC_X11_DISPLAY: if (HIWORD(wParam) == EN_CHANGE) @@ -2702,7 +3141,23 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg, break; } return 0; + case WM_HELP: + if (help_path) { + int id = ((LPHELPINFO)lParam)->iCtrlId; + char *cmd = help_context_cmd(id); + if (cmd) { + WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd); + requested_help = TRUE; + } else { + MessageBeep(0); + } + } + break; case WM_CLOSE: + if (requested_help) { + WinHelp(hwnd, help_path, HELP_QUIT, 0); + requested_help = FALSE; + } EndDialog(hwnd, 0); return 0;