Miscellaneous fixes for better interoperation with commercial SSH 2
[sgt/putty] / windlg.c
index 0821b79..57f4943 100644 (file)
--- a/windlg.c
+++ b/windlg.c
@@ -173,6 +173,14 @@ static int CALLBACK AboutProc (HWND hwnd, UINT msg,
     return 0;
 }
 
+/*
+ * Null dialog procedure.
+ */
+static int CALLBACK NullDlgProc (HWND hwnd, UINT msg,
+                                 WPARAM wParam, LPARAM lParam) {
+    return 0;
+}
+
 /* ----------------------------------------------------------------------
  * Routines to self-manage the controls in a dialog box.
  */
@@ -945,6 +953,7 @@ enum { IDCX_ABOUT = IDC_ABOUT, IDCX_TVSTATIC, IDCX_TREEVIEW, controlstartvalue,
     IDC_CIPHER3DES,
     IDC_CIPHERBLOWF,
     IDC_CIPHERDES,
+    IDC_BUGGYMAC,
     IDC_AUTHTIS,
     IDC_PKSTATIC,
     IDC_PKEDIT,
@@ -997,6 +1006,7 @@ enum { IDCX_ABOUT = IDC_ABOUT, IDCX_TVSTATIC, IDCX_TREEVIEW, controlstartvalue,
     IDC_NOXLAT,
     IDC_KOI8WIN1251,
     IDC_88592WIN1250,
+    IDC_88592CP852,
     IDC_CAPSLOCKCYR,
     IDC_VTSTATIC,
     IDC_VTXWINDOWS,
@@ -1046,9 +1056,6 @@ static void init_dlg_ctrls(HWND hwnd) {
     SetDlgItemText (hwnd, IDC_HOST, cfg.host);
     SetDlgItemText (hwnd, IDC_SESSEDIT, savedsession);
     SetDlgItemInt (hwnd, IDC_PORT, cfg.port, FALSE);
-    for (i = 0; i < nsessions; i++)
-       SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_ADDSTRING,
-                           0, (LPARAM) (sessions[i]));
     CheckRadioButton (hwnd, IDC_PROTRAW, IDC_PROTSSH,
                      cfg.protocol==PROT_SSH ? IDC_PROTSSH :
                      cfg.protocol==PROT_TELNET ? IDC_PROTTELNET : IDC_PROTRAW );
@@ -1058,7 +1065,7 @@ static void init_dlg_ctrls(HWND hwnd) {
                      cfg.bksp_is_delete ? IDC_DEL127 : IDC_DEL008);
     CheckRadioButton (hwnd, IDC_HOMETILDE, IDC_HOMERXVT,
                      cfg.rxvt_homeend ? IDC_HOMERXVT : IDC_HOMETILDE);
-    CheckRadioButton (hwnd, IDC_FUNCTILDE, IDC_FUNCXTERM,
+    CheckRadioButton (hwnd, IDC_FUNCTILDE, IDC_FUNCVT400,
                       cfg.funky_type == 0 ? IDC_FUNCTILDE :
                       cfg.funky_type == 1 ? IDC_FUNCLINUX :
                       cfg.funky_type == 2 ? IDC_FUNCXTERM :
@@ -1111,6 +1118,7 @@ static void init_dlg_ctrls(HWND hwnd) {
     SetDlgItemText (hwnd, IDC_TTEDIT, cfg.termtype);
     SetDlgItemText (hwnd, IDC_LOGEDIT, cfg.username);
     CheckDlgButton (hwnd, IDC_NOPTY, cfg.nopty);
+    CheckDlgButton (hwnd, IDC_BUGGYMAC, cfg.buggymac);
     CheckDlgButton (hwnd, IDC_AGENTFWD, cfg.agentfwd);
     CheckRadioButton (hwnd, IDC_CIPHER3DES, IDC_CIPHERDES,
                      cfg.cipher == CIPHER_BLOWFISH ? IDC_CIPHERBLOWF :
@@ -1152,8 +1160,9 @@ static void init_dlg_ctrls(HWND hwnd) {
     SetDlgItemInt (hwnd, IDC_GVALUE, cfg.colours[0][1], FALSE);
     SetDlgItemInt (hwnd, IDC_BVALUE, cfg.colours[0][2], FALSE);
 
-    CheckRadioButton (hwnd, IDC_NOXLAT, IDC_88592WIN1250,
+    CheckRadioButton (hwnd, IDC_NOXLAT, IDC_88592CP852,
                      cfg.xlat_88592w1250 ? IDC_88592WIN1250 :
+                     cfg.xlat_88592cp852 ? IDC_88592CP852 :
                      cfg.xlat_enablekoiwin ? IDC_KOI8WIN1251 :
                      IDC_NOXLAT);
     CheckDlgButton (hwnd, IDC_CAPSLOCKCYR, cfg.xlat_capslockcyr);
@@ -1365,7 +1374,7 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
                      "&Standard", IDC_HOMETILDE,
                      "&rxvt", IDC_HOMERXVT, NULL);
            radioline(&cp, "The Function keys and keypad", IDC_FUNCSTATIC, 4,
-                     "&VT400", IDC_FUNCTILDE,
+                     "ESC[n&~", IDC_FUNCTILDE,
                      "&Linux", IDC_FUNCLINUX,
                      "&Xterm R6", IDC_FUNCXTERM,
                       "&VT400", IDC_FUNCVT400, NULL);
@@ -1440,7 +1449,8 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
                     "Character set translation:", IDC_XLATSTATIC,
                     "&None", IDC_NOXLAT,
                     "&KOI8 / Win-1251", IDC_KOI8WIN1251,
-                    "&ISO-8859-2 / Win-1250", IDC_88592WIN1250, NULL);
+                    "&ISO-8859-2 / Win-1250", IDC_88592WIN1250,
+                     "&ISO-8859-2 / CP852", IDC_88592CP852, NULL);
             endbox(&cp);
             beginbox(&cp, "Enable character set translation on input data",
                      IDC_BOX_TRANSLATION3, IDC_BOXT_TRANSLATION3);
@@ -1546,7 +1556,7 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
        }
 
        /* The SSH panel. Accelerators used: [acgo] rmakwp123bd */
-       {
+        if (backends[2].backend != NULL) {
            struct ctlpos cp;
            ctlposinit(&cp, hwnd, 80, 3, 13);
            if (dlgtype == 0) {
@@ -1575,6 +1585,8 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
                          "&3DES", IDC_CIPHER3DES,
                          "&Blowfish", IDC_CIPHERBLOWF,
                          "&DES", IDC_CIPHERDES, NULL);
+               checkbox(&cp, "Imitate SSH 2 MAC bug in commercial <= v2.3.x",
+                         IDC_BUGGYMAC);
                 endbox(&cp);
 
                 treeview_insert(&tvfaff, 1, "SSH");
@@ -1582,6 +1594,9 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
        }
 
        init_dlg_ctrls(hwnd);
+        for (i = 0; i < nsessions; i++)
+            SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_ADDSTRING,
+                                0, (LPARAM) (sessions[i]));
 
         /*
          * Hide all the controls to start with.
@@ -1740,14 +1755,16 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
            {
                int n = SendDlgItemMessage (hwnd, IDC_SESSLIST,
                                            LB_GETCURSEL, 0, 0);
+                int isdef;
                if (n == LB_ERR) {
                    MessageBeep(0);
                    break;
                }
-               load_settings (sessions[n],
-                              !!strcmp(sessions[n], "Default Settings"),
-                               &cfg);
+                isdef = !strcmp(sessions[n], "Default Settings");
+               load_settings (sessions[n], !isdef, &cfg);
                init_dlg_ctrls(hwnd);
+                if (!isdef)
+                    SetDlgItemText(hwnd, IDC_SESSEDIT, sessions[n]);
            }
            if (LOWORD(wParam) == IDC_SESSLIST) {
                /*
@@ -2054,6 +2071,11 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
                HIWORD(wParam) == BN_DOUBLECLICKED)
                cfg.nopty = IsDlgButtonChecked (hwnd, IDC_NOPTY);
            break;
+         case IDC_BUGGYMAC:
+           if (HIWORD(wParam) == BN_CLICKED ||
+               HIWORD(wParam) == BN_DOUBLECLICKED)
+               cfg.buggymac = IsDlgButtonChecked (hwnd, IDC_BUGGYMAC);
+           break;
          case IDC_AGENTFWD:
            if (HIWORD(wParam) == BN_CLICKED ||
                HIWORD(wParam) == BN_DOUBLECLICKED)
@@ -2221,10 +2243,13 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
          case IDC_NOXLAT:
          case IDC_KOI8WIN1251:
          case IDC_88592WIN1250:
+         case IDC_88592CP852:
            cfg.xlat_enablekoiwin =
                IsDlgButtonChecked (hwnd, IDC_KOI8WIN1251);
            cfg.xlat_88592w1250 =
                IsDlgButtonChecked (hwnd, IDC_88592WIN1250);
+           cfg.xlat_88592cp852 =
+               IsDlgButtonChecked (hwnd, IDC_88592CP852);
            break;
          case IDC_CAPSLOCKCYR:
            if (HIWORD(wParam) == BN_CLICKED ||
@@ -2280,6 +2305,21 @@ static int CALLBACK ReconfDlgProc (HWND hwnd, UINT msg,
     return GenericMainDlgProc (hwnd, msg, wParam, lParam, 1);
 }
 
+int defuse_showwindow(void) {
+    /*
+     * Work around the fact that the app's first call to ShowWindow
+     * will ignore the default in favour of the shell-provided
+     * setting.
+     */
+    {
+        HWND hwnd;
+        hwnd = CreateDialog (hinst, MAKEINTRESOURCE(IDD_ABOUTBOX),
+                             NULL, NullDlgProc);
+        ShowWindow(hwnd, SW_HIDE);
+        DestroyWindow(hwnd);
+    }
+}
+
 int do_config (void) {
     int ret;