Retired the #ifdef DUMP_PACKETS stuff in ssh.c because I'm utterly
[u/mdw/putty] / windlg.c
index a8f7ef0..c3f13b7 100644 (file)
--- a/windlg.c
+++ b/windlg.c
@@ -17,6 +17,7 @@ static int nevents = 0, negsize = 0;
 
 static int readytogo;
 static int sesslist_has_focus;
+static int requested_help;
 
 static struct prefslist cipherlist;
 
@@ -256,9 +257,11 @@ enum { IDCX_ABOUT =
     IDC_LSTATOFF,
     IDC_LSTATASCII,
     IDC_LSTATRAW,
+    IDC_LSTATPACKET,
     IDC_LGFSTATIC,
     IDC_LGFEDIT,
     IDC_LGFBUTTON,
+    IDC_LGFEXPLAIN,
     IDC_LSTATXIST,
     IDC_LSTATXOVR,
     IDC_LSTATXAPN,
@@ -294,7 +297,6 @@ enum { IDCX_ABOUT =
     IDC_CURAPPLIC,
     IDC_COMPOSEKEY,
     IDC_CTRLALTKEYS,
-    IDC_TELNETKEY,
     keyboardpanelend,
 
     terminalpanelstart,
@@ -353,18 +355,29 @@ enum { IDCX_ABOUT =
     IDC_ROWSEDIT,
     IDC_COLSSTATIC,
     IDC_COLSEDIT,
-    IDC_LOCKSIZE,
+    IDC_RESIZESTATIC,
+    IDC_RESIZETERM,
+    IDC_RESIZEFONT,
+    IDC_RESIZENONE,
+    IDC_RESIZEEITHER,
     IDC_SCROLLBAR,
-    IDC_CLOSEWARN,
+    IDC_SCROLLBARFULLSCREEN,
     IDC_SAVESTATIC,
     IDC_SAVEEDIT,
+    IDC_SCROLLKEY,
+    IDC_SCROLLDISP,
+    windowpanelend,
+
+    behaviourpanelstart,
+    IDC_TITLE_BEHAVIOUR,
+    IDC_BOX_BEHAVIOUR1,
+    IDC_CLOSEWARN,
     IDC_ALTF4,
     IDC_ALTSPACE,
     IDC_ALTONLY,
-    IDC_SCROLLKEY,
-    IDC_SCROLLDISP,
     IDC_ALWAYSONTOP,
-    windowpanelend,
+    IDC_FULLSCREENONALTENTER,
+    behaviourpanelend,
 
     appearancepanelstart,
     IDC_TITLE_APPEARANCE,
@@ -385,18 +398,22 @@ enum { IDCX_ABOUT =
     IDC_WINNAME,
     IDC_HIDEMOUSE,
     IDC_SUNKENEDGE,
+    IDC_WINBSTATIC,
+    IDC_WINBEDIT,
     appearancepanelend,
 
     connectionpanelstart,
     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,
@@ -419,6 +436,7 @@ enum { IDCX_ABOUT =
     IDC_ACTSTATIC,
     IDC_TPASSIVE,
     IDC_TACTIVE,
+    IDC_TELNETKEY,
     telnetpanelend,
 
     rloginpanelstart,
@@ -443,6 +461,7 @@ enum { IDCX_ABOUT =
     IDC_CIPHERUP,
     IDC_CIPHERDN,
     IDC_BUGGYMAC,
+    IDC_SSH2DES,
     IDC_SSHPROTSTATIC,
     IDC_SSHPROT1,
     IDC_SSHPROT2,
@@ -459,7 +478,9 @@ enum { IDCX_ABOUT =
     IDC_PKEDIT,
     IDC_PKBUTTON,
     IDC_AGENTFWD,
+    IDC_CHANGEUSER,
     IDC_AUTHTIS,
+    IDC_AUTHKI,
     sshauthpanelend,
 
     selectionpanelstart,
@@ -471,12 +492,16 @@ enum { IDCX_ABOUT =
     IDC_MBWINDOWS,
     IDC_MBXTERM,
     IDC_MOUSEOVERRIDE,
+    IDC_SELTYPESTATIC,
+    IDC_SELTYPELEX,
+    IDC_SELTYPERECT,
     IDC_CCSTATIC,
     IDC_CCLIST,
     IDC_CCSET,
     IDC_CCSTATIC2,
     IDC_CCEDIT,
     IDC_RAWCNP,
+    IDC_RTFPASTE,
     selectionpanelend,
 
     colourspanelstart,
@@ -500,8 +525,10 @@ enum { IDCX_ABOUT =
     IDC_TITLE_TRANSLATION,
     IDC_BOX_TRANSLATION1,
     IDC_BOX_TRANSLATION2,
+    IDC_BOX_TRANSLATION3,
     IDC_CODEPAGESTATIC,
     IDC_CODEPAGE,
+    IDC_CAPSLOCKCYR,
     IDC_VTSTATIC,
     IDC_VTXWINDOWS,
     IDC_VTOEMANSI,
@@ -566,6 +593,328 @@ 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_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_LPORT_ALL:
+      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')";
+
+      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)
@@ -591,6 +940,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);
@@ -624,6 +974,7 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess)
                     cfg.localedit == LD_YES ? IDC_EDITYES : IDC_EDITNO);
     SetDlgItemText(hwnd, IDC_ANSWEREDIT, cfg.answerback);
     CheckDlgButton(hwnd, IDC_ALWAYSONTOP, cfg.alwaysontop);
+    CheckDlgButton(hwnd, IDC_FULLSCREENONALTENTER, cfg.fullscreenonaltenter);
     CheckDlgButton(hwnd, IDC_SCROLLKEY, cfg.scroll_on_key);
     CheckDlgButton(hwnd, IDC_SCROLLDISP, cfg.scroll_on_disp);
 
@@ -659,12 +1010,18 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess)
     CheckDlgButton(hwnd, IDC_WINNAME, cfg.win_name_always);
     CheckDlgButton(hwnd, IDC_HIDEMOUSE, cfg.hide_mouseptr);
     CheckDlgButton(hwnd, IDC_SUNKENEDGE, cfg.sunken_edge);
+    SetDlgItemInt(hwnd, IDC_WINBEDIT, cfg.window_border, FALSE);
     CheckRadioButton(hwnd, IDC_CURBLOCK, IDC_CURVERT,
                     cfg.cursor_type == 0 ? IDC_CURBLOCK :
                     cfg.cursor_type == 1 ? IDC_CURUNDER : IDC_CURVERT);
     CheckDlgButton(hwnd, IDC_BLINKCUR, cfg.blink_cur);
     CheckDlgButton(hwnd, IDC_SCROLLBAR, cfg.scrollbar);
-    CheckDlgButton(hwnd, IDC_LOCKSIZE, cfg.locksize);
+    CheckDlgButton(hwnd, IDC_SCROLLBARFULLSCREEN, cfg.scrollbar_in_fullscreen);
+    CheckRadioButton(hwnd, IDC_RESIZETERM, IDC_RESIZEEITHER,
+                    cfg.resize_action == RESIZE_TERM ? IDC_RESIZETERM :
+                    cfg.resize_action == RESIZE_FONT ? IDC_RESIZEFONT :
+                    cfg.resize_action == RESIZE_EITHER ? IDC_RESIZEEITHER :
+                    IDC_RESIZENONE);
     CheckRadioButton(hwnd, IDC_COEALWAYS, IDC_COENORMAL,
                     cfg.close_on_exit == COE_NORMAL ? IDC_COENORMAL :
                     cfg.close_on_exit ==
@@ -677,9 +1034,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 :
@@ -709,10 +1068,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);
 
@@ -721,7 +1083,7 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess)
        static const struct { char *s; int c; } ciphers[] = {
            { "3DES",                   CIPHER_3DES },
            { "Blowfish",               CIPHER_BLOWFISH },
-           { "DES (SSH 1 only)",       CIPHER_DES },
+           { "DES",                    CIPHER_DES },
            { "AES (SSH 2 only)",       CIPHER_AES },
            { "-- warn below here --",  CIPHER_WARN }
        };
@@ -747,11 +1109,13 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess)
 
     }
 
-
     CheckRadioButton(hwnd, IDC_MBWINDOWS, IDC_MBXTERM,
                     cfg.mouse_is_xterm ? IDC_MBXTERM : IDC_MBWINDOWS);
+    CheckRadioButton(hwnd, IDC_SELTYPELEX, IDC_SELTYPERECT,
+                    cfg.rect_select == 0 ? IDC_SELTYPELEX : IDC_SELTYPERECT);
     CheckDlgButton(hwnd, IDC_MOUSEOVERRIDE, cfg.mouse_override);
     CheckDlgButton(hwnd, IDC_RAWCNP, cfg.rawcnp);
+    CheckDlgButton(hwnd, IDC_RTFPASTE, cfg.rtf_paste);
     {
        static int tabs[4] = { 25, 61, 96, 128 };
        SendDlgItemMessage(hwnd, IDC_CCLIST, LB_SETTABSTOPS, 4,
@@ -788,6 +1152,7 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess)
        char *cp;
        strcpy(cfg.line_codepage, cp_name(decode_codepage(cfg.line_codepage)));
        SendDlgItemMessage(hwnd, IDC_CODEPAGE, CB_RESETCONTENT, 0, 0);
+       CheckDlgButton (hwnd, IDC_CAPSLOCKCYR, cfg.xlat_capslockcyr);
        for (i = 0; (cp = cp_enumerate(i)) != NULL; i++) {
            SendDlgItemMessage(hwnd, IDC_CODEPAGE, CB_ADDSTRING,
                               0, (LPARAM) cp);
@@ -893,7 +1258,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: [acgo] tplsfwe */
        struct ctlpos cp;
        ctlposinit(&cp, hwnd, 80, 3, 13);
        bartitle(&cp, "Options controlling session logging",
@@ -903,10 +1268,14 @@ 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);
+       statictext(&cp, "(Log file name can contain &&Y, &&M, &&D for date,"
+                  " &&T for time, and &&H for host name)", 2, IDC_LGFEXPLAIN);
        radiobig(&cp,
                 "What to do if the log file already &exists:",
                 IDC_LSTATXIST, "Always overwrite it", IDC_LSTATXOVR,
@@ -973,7 +1342,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
                   IDC_BELLOVLTSTATIC, IDC_BELLOVLT, 20);
        statictext(&cp,
                   "The bell is re-enabled after a few seconds of silence.",
-                  IDC_BELLOVLEXPLAIN);
+                  1, IDC_BELLOVLEXPLAIN);
        staticedit(&cp, "Seconds of &silence required", IDC_BELLOVLSSTATIC,
                   IDC_BELLOVLS, 20);
        endbox(&cp);
@@ -983,10 +1352,8 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
        /* The Keyboard panel. Accelerators used: [acgo] bhf ruyntd */
        struct ctlpos cp;
        ctlposinit(&cp, hwnd, 80, 3, 13);
-       /*
-          bartitle(&cp, "Options controlling the effects of keys",
-          IDC_TITLE_KEYBOARD);
-        */
+       bartitle(&cp, "Options controlling the effects of keys",
+                IDC_TITLE_KEYBOARD);
        beginbox(&cp, "Change the sequences sent by:", IDC_BOX_KEYBOARD1);
        radioline(&cp, "The &Backspace key", IDC_DELSTATIC, 2,
                  "Control-H", IDC_DEL008,
@@ -1023,7 +1390,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
     }
 
     if (panel == windowpanelstart) {
-       /* The Window panel. Accelerators used: [acgo] rmz sdkp w4ylt */
+       /* The Window panel. Accelerators used: [acgo] rmz sdikp */
        struct ctlpos cp;
        ctlposinit(&cp, hwnd, 80, 3, 13);
        bartitle(&cp, "Options controlling PuTTY's window",
@@ -1032,31 +1399,29 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
        multiedit(&cp,
                  "&Rows", IDC_ROWSSTATIC, IDC_ROWSEDIT, 50,
                  "Colu&mns", IDC_COLSSTATIC, IDC_COLSEDIT, 50, NULL);
-       checkbox(&cp, "Lock window size against resi&zing", IDC_LOCKSIZE);
+       radiobig(&cp, "When window is resi&zed:", IDC_RESIZESTATIC,
+                "Change the number of rows and columns", IDC_RESIZETERM,
+                "Change the size of the font", IDC_RESIZEFONT,
+                "Change font size only when maximised", IDC_RESIZEEITHER,
+                "Forbid resizing completely", IDC_RESIZENONE, NULL);
        endbox(&cp);
        beginbox(&cp, "Control the scrollback in the window",
                 IDC_BOX_WINDOW2);
        staticedit(&cp, "Lines of &scrollback",
                   IDC_SAVESTATIC, IDC_SAVEEDIT, 50);
        checkbox(&cp, "&Display scrollbar", IDC_SCROLLBAR);
+       checkbox(&cp, "D&isplay scrollbar in full screen mode", IDC_SCROLLBARFULLSCREEN);
        checkbox(&cp, "Reset scrollback on &keypress", IDC_SCROLLKEY);
        checkbox(&cp, "Reset scrollback on dis&play activity",
                 IDC_SCROLLDISP);
        endbox(&cp);
-       beginbox(&cp, NULL, IDC_BOX_WINDOW3);
-       checkbox(&cp, "&Warn before closing window", IDC_CLOSEWARN);
-       checkbox(&cp, "Window closes on ALT-F&4", IDC_ALTF4);
-       checkbox(&cp, "S&ystem menu appears on ALT-Space", IDC_ALTSPACE);
-       checkbox(&cp, "System menu appears on A&LT alone", IDC_ALTONLY);
-       checkbox(&cp, "Ensure window is always on &top", IDC_ALWAYSONTOP);
-       endbox(&cp);
     }
 
     if (panel == appearancepanelstart) {
        /* The Appearance panel. Accelerators used: [acgo] luvb h ti p s */
        struct ctlpos cp;
        ctlposinit(&cp, hwnd, 80, 3, 13);
-       bartitle(&cp, "Options controlling PuTTY's appearance",
+       bartitle(&cp, "Configure the appearance of PuTTY's window",
                 IDC_TITLE_APPEARANCE);
        beginbox(&cp, "Adjust the use of the cursor", IDC_BOX_APPEARANCE1);
        radioline(&cp, "Cursor appearance:", IDC_CURSORSTATIC, 3,
@@ -1083,22 +1448,45 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
        beginbox(&cp, "Adjust the window border", IDC_BOX_APPEARANCE5);
        checkbox(&cp, "&Sunken-edge border (slightly thicker)",
                 IDC_SUNKENEDGE);
+       staticedit(&cp, "Gap between text and window edge",
+                  IDC_WINBSTATIC, IDC_WINBEDIT, 20);
+       endbox(&cp);
+    }
+
+    if (panel == behaviourpanelstart) {
+       /* The Behaviour panel. Accelerators used: [acgo] w4yltf */
+       struct ctlpos cp;
+       ctlposinit(&cp, hwnd, 80, 3, 13);
+       bartitle(&cp, "Configure the behaviour of PuTTY's window",
+                IDC_TITLE_WINDOW);
+       beginbox(&cp, NULL, IDC_BOX_BEHAVIOUR1);
+       checkbox(&cp, "&Warn before closing window", IDC_CLOSEWARN);
+       checkbox(&cp, "Window closes on ALT-F&4", IDC_ALTF4);
+       checkbox(&cp, "S&ystem menu appears on ALT-Space", IDC_ALTSPACE);
+       checkbox(&cp, "System menu appears on A&LT alone", IDC_ALTONLY);
+       checkbox(&cp, "Ensure window is always on &top", IDC_ALWAYSONTOP);
+       checkbox(&cp, "&Full screen on Alt-Enter", IDC_FULLSCREENONALTENTER);
        endbox(&cp);
     }
 
     if (panel == translationpanelstart) {
-       /* The Translation panel. Accelerators used: [acgo] xbep t s */
+       /* The Translation panel. Accelerators used: [acgo] rxbepus */
        struct ctlpos cp;
        ctlposinit(&cp, hwnd, 80, 3, 13);
        bartitle(&cp, "Options controlling character set translation",
                 IDC_TITLE_TRANSLATION);
        beginbox(&cp, "Character set translation on received data",
-                IDC_BOX_TRANSLATION2);
-       combobox(&cp, "Received data assumed to be in which character set:",
+                IDC_BOX_TRANSLATION1);
+       combobox(&cp, "&Received data assumed to be in which character set:",
                 IDC_CODEPAGESTATIC, IDC_CODEPAGE);
        endbox(&cp);
+        beginbox(&cp, "Enable character set translation on input data",
+                 IDC_BOX_TRANSLATION2);
+        checkbox(&cp, "Cap&s Lock acts as Cyrillic switch",
+                 IDC_CAPSLOCKCYR);
+        endbox(&cp);
        beginbox(&cp, "Adjust how PuTTY displays line drawing characters",
-                IDC_BOX_TRANSLATION1);
+                IDC_BOX_TRANSLATION3);
        radiobig(&cp,
                 "Handling of line drawing characters:", IDC_VTSTATIC,
                 "Font has &XWindows encoding", IDC_VTXWINDOWS,
@@ -1110,7 +1498,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
     }
 
     if (panel == selectionpanelstart) {
-       /* The Selection panel. Accelerators used: [acgo] d wxp hst */
+       /* The Selection panel. Accelerators used: [acgo] df wxp hst nr */
        struct ctlpos cp;
        ctlposinit(&cp, hwnd, 80, 3, 13);
        bartitle(&cp, "Options controlling copy and paste",
@@ -1120,6 +1508,9 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
        checkbox(&cp,
                 "&Don't translate line drawing chars into +, - and |",
                 IDC_RAWCNP);
+       checkbox(&cp,
+                "Paste to clipboard in RT&F as well as plain text",
+                IDC_RTFPASTE);
        endbox(&cp);
        beginbox(&cp, "Control which mouse button does which thing",
                 IDC_BOX_SELECTION2);
@@ -1130,6 +1521,11 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
        checkbox(&cp,
                 "Shift overrides a&pplication's use of mouse",
                 IDC_MOUSEOVERRIDE);
+        radioline(&cp,
+                  "Default selection mode (Alt+drag does the other one):",
+                  IDC_SELTYPESTATIC, 2,
+                 "&Normal", IDC_SELTYPELEX,
+                 "&Rectangular block", IDC_SELTYPERECT, NULL);
        endbox(&cp);
        beginbox(&cp, "Control the select-one-word-at-a-time mode",
                 IDC_BOX_SELECTION3);
@@ -1163,7 +1559,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: [acgo] tukn */
        struct ctlpos cp;
        ctlposinit(&cp, hwnd, 80, 3, 13);
        bartitle(&cp, "Options controlling the connection",
@@ -1187,6 +1583,13 @@ 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) {
@@ -1234,7 +1637,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
     }
 
     if (panel == sshpanelstart) {
-       /* The SSH panel. Accelerators used: [acgo] r pe12i sud */
+       /* The SSH panel. Accelerators used: [acgo] r pe12i sd */
        struct ctlpos cp;
        ctlposinit(&cp, hwnd, 80, 3, 13);
        if (dlgtype == 0) {
@@ -1258,12 +1661,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: [acgo] m fkiw */
        struct ctlpos cp;
        ctlposinit(&cp, hwnd, 80, 3, 13);
        if (dlgtype == 0) {
@@ -1271,12 +1676,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);
@@ -1363,6 +1772,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)));
        /*
@@ -1404,7 +1822,7 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
            r.left = 3;
            r.right = r.left + 75;
            r.top = 13;
-           r.bottom = r.top + 206;
+           r.bottom = r.top + 219;
            MapDialogRect(hwnd, &r);
            treeview = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, "",
                                      WS_CHILD | WS_VISIBLE |
@@ -1431,6 +1849,7 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
        treeview_insert(&tvfaff, 1, "Bell");
        treeview_insert(&tvfaff, 0, "Window");
        treeview_insert(&tvfaff, 1, "Appearance");
+       treeview_insert(&tvfaff, 1, "Behaviour");
        treeview_insert(&tvfaff, 1, "Translation");
        treeview_insert(&tvfaff, 1, "Selection");
        treeview_insert(&tvfaff, 1, "Colours");
@@ -1484,6 +1903,9 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
            TVITEM item;
            int j;
            char buffer[64];
+           SendMessage (hwnd, WM_SETREDRAW, FALSE, 0);
            item.hItem = i;
            item.pszText = buffer;
            item.cchTextMax = sizeof(buffer);
@@ -1508,6 +1930,8 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
                create_controls(hwnd, dlgtype, windowpanelstart);
            if (!strcmp(buffer, "Appearance"))
                create_controls(hwnd, dlgtype, appearancepanelstart);
+           if (!strcmp(buffer, "Behaviour"))
+               create_controls(hwnd, dlgtype, behaviourpanelstart);
            if (!strcmp(buffer, "Tunnels"))
                create_controls(hwnd, dlgtype, tunnelspanelstart);
            if (!strcmp(buffer, "Connection"))
@@ -1528,6 +1952,9 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
                create_controls(hwnd, dlgtype, translationpanelstart);
 
            init_dlg_ctrls(hwnd, FALSE);
+           SendMessage (hwnd, WM_SETREDRAW, TRUE, 0);
+           InvalidateRect (hwnd, NULL, TRUE);
 
            SetFocus(((LPNMHDR) lParam)->hwndFrom);     /* ensure focus stays */
            return 0;
@@ -1550,12 +1977,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:
@@ -1705,6 +2151,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 ||
@@ -1837,6 +2289,12 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
                        cfg.alwaysontop =
                        IsDlgButtonChecked(hwnd, IDC_ALWAYSONTOP);
                break;
+             case IDC_FULLSCREENONALTENTER:
+               if (HIWORD(wParam) == BN_CLICKED ||
+                   HIWORD(wParam) == BN_DOUBLECLICKED)
+                       cfg.fullscreenonaltenter =
+                       IsDlgButtonChecked(hwnd, IDC_FULLSCREENONALTENTER);
+               break;
              case IDC_SCROLLKEY:
                if (HIWORD(wParam) == BN_CLICKED ||
                    HIWORD(wParam) == BN_DOUBLECLICKED)
@@ -2040,6 +2498,13 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
                        cfg.sunken_edge =
                        IsDlgButtonChecked(hwnd, IDC_SUNKENEDGE);
                break;
+             case IDC_WINBEDIT:
+               if (HIWORD(wParam) == EN_CHANGE)
+                   MyGetDlgItemInt(hwnd, IDC_WINBEDIT,
+                                   &cfg.window_border);
+               if (cfg.window_border > 32)
+                   cfg.window_border = 32;
+               break;
              case IDC_CURBLOCK:
                if (HIWORD(wParam) == BN_CLICKED ||
                    HIWORD(wParam) == BN_DOUBLECLICKED)
@@ -2067,11 +2532,27 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
                        cfg.scrollbar =
                        IsDlgButtonChecked(hwnd, IDC_SCROLLBAR);
                break;
-             case IDC_LOCKSIZE:
+             case IDC_SCROLLBARFULLSCREEN:
                if (HIWORD(wParam) == BN_CLICKED ||
                    HIWORD(wParam) == BN_DOUBLECLICKED)
-                       cfg.locksize =
-                       IsDlgButtonChecked(hwnd, IDC_LOCKSIZE);
+                   cfg.scrollbar_in_fullscreen =
+                   IsDlgButtonChecked(hwnd, IDC_SCROLLBARFULLSCREEN);
+               break;
+             case IDC_RESIZETERM:
+             case IDC_RESIZEFONT:
+             case IDC_RESIZENONE:
+             case IDC_RESIZEEITHER:
+               if (HIWORD(wParam) == BN_CLICKED ||
+                   HIWORD(wParam) == BN_DOUBLECLICKED) {
+                   cfg.resize_action =
+                       IsDlgButtonChecked(hwnd,
+                                          IDC_RESIZETERM) ? RESIZE_TERM :
+                       IsDlgButtonChecked(hwnd,
+                                          IDC_RESIZEFONT) ? RESIZE_FONT :
+                       IsDlgButtonChecked(hwnd,
+                                          IDC_RESIZEEITHER) ? RESIZE_EITHER :
+                       RESIZE_DISABLED;
+               }
                break;
              case IDC_WINEDIT:
                if (HIWORD(wParam) == EN_CHANGE)
@@ -2133,14 +2614,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:
@@ -2275,12 +2759,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:
@@ -2304,6 +2800,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,
@@ -2330,7 +2832,7 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
                of.nMaxFile = sizeof(filename);
                of.lpstrFileTitle = NULL;
                of.lpstrInitialDir = NULL;
-               of.lpstrTitle = "Select Public Key File";
+               of.lpstrTitle = "Select Private Key File";
                of.Flags = 0;
                if (GetOpenFileName(&of)) {
                    strcpy(cfg.keyfile, filename);
@@ -2340,10 +2842,17 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
              case IDC_RAWCNP:
                cfg.rawcnp = IsDlgButtonChecked(hwnd, IDC_RAWCNP);
                break;
+             case IDC_RTFPASTE:
+               cfg.rtf_paste = IsDlgButtonChecked(hwnd, IDC_RTFPASTE);
+               break;
              case IDC_MBWINDOWS:
              case IDC_MBXTERM:
                cfg.mouse_is_xterm = IsDlgButtonChecked(hwnd, IDC_MBXTERM);
                break;
+             case IDC_SELTYPELEX:
+             case IDC_SELTYPERECT:
+               cfg.rect_select = IsDlgButtonChecked(hwnd, IDC_SELTYPERECT);
+               break;
              case IDC_MOUSEOVERRIDE:
                cfg.mouse_override = IsDlgButtonChecked(hwnd, IDC_MOUSEOVERRIDE);
                break;
@@ -2473,6 +2982,13 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
                    SetDlgItemText(hwnd, IDC_CODEPAGE, cfg.line_codepage);
                }
                break;
+             case IDC_CAPSLOCKCYR:
+               if (HIWORD(wParam) == BN_CLICKED ||
+                   HIWORD(wParam) == BN_DOUBLECLICKED) {
+                   cfg.xlat_capslockcyr =
+                       IsDlgButtonChecked (hwnd, IDC_CAPSLOCKCYR);
+               }
+               break;
              case IDC_VTXWINDOWS:
              case IDC_VTOEMANSI:
              case IDC_VTOEMONLY:
@@ -2591,7 +3107,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;
 
@@ -2861,3 +3393,23 @@ int askappend(char *filename)
     else
        return 0;
 }
+
+/*
+ * Warn about the obsolescent key file format.
+ */
+void old_keyfile_warning(void)
+{
+    static const char mbtitle[] = "PuTTY Key File Warning";
+    static const char message[] =
+       "You are loading an SSH 2 private key which has an\n"
+       "old version of the file format. This means your key\n"
+       "file is not fully tamperproof. Future versions of\n"
+       "PuTTY may stop supporting this private key format,\n"
+       "so we recommend you convert your key to the new\n"
+       "format.\n"
+       "\n"
+       "You can perform this conversion by loading the key\n"
+       "into PuTTYgen and then saving it again.";
+
+    MessageBox(NULL, message, mbtitle, MB_OK);
+}