CloseOnExit now defaults to COE_ALWAYS for pterm, bringing it back
[u/mdw/putty] / settings.c
index ef0446f..736d677 100644 (file)
@@ -2,7 +2,6 @@
  * settings.c: read and write saved sessions.
  */
 
-#include <windows.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include "putty.h"
@@ -310,6 +309,11 @@ void save_settings(char *section, int do_host, Config * cfg)
     write_setting_i(sesskey, "BugDeriveKey2", cfg->sshbug_derivekey2);
     write_setting_i(sesskey, "BugRSAPad2", cfg->sshbug_rsapad2);
     write_setting_i(sesskey, "BugDHGEx2", cfg->sshbug_dhgex2);
+    write_setting_i(sesskey, "StampUtmp", cfg->stamp_utmp);
+    write_setting_i(sesskey, "LoginShell", cfg->login_shell);
+    write_setting_i(sesskey, "ScrollbarOnLeft", cfg->scrollbar_on_left);
+    write_setting_s(sesskey, "BoldFont", cfg->boldfont);
+    write_setting_i(sesskey, "ShadowBoldOffset", cfg->shadowboldoffset);
     close_settings_w(sesskey);
 }
 
@@ -345,7 +349,23 @@ void load_settings(char *section, int do_host, Config * cfg)
            break;
        }
 
-    gppi(sesskey, "CloseOnExit", COE_NORMAL, &cfg->close_on_exit);
+    /*
+     * CloseOnExit defaults to closing only on a clean exit - but
+     * unfortunately not on Unix (pterm). On Unix, the exit code of
+     * a shell is the last exit code of one of its child processes,
+     * even if it's an interactive shell - so some pterms will
+     * close and some will not for no particularly good reason. The
+     * mode is still useful for specialist purposes (running a
+     * single command in its own pterm), but I don't think it's a
+     * sane default, unfortunately.
+     */
+    gppi(sesskey, "CloseOnExit",
+#ifdef _WINDOWS
+         COE_NORMAL,
+#else
+         COE_ALWAYS,
+#endif
+         &cfg->close_on_exit);
     gppi(sesskey, "WarnOnClose", 1, &cfg->warn_on_close);
     {
        /* This is two values for backward compatibility with 0.50/0.51 */
@@ -363,7 +383,7 @@ void load_settings(char *section, int do_host, Config * cfg)
     /* proxy settings */
     gpps(sesskey, "ProxyExcludeList", "", cfg->proxy_exclude_list,
         sizeof(cfg->proxy_exclude_list));
-    gppi(sesskey, "ProxyType", PROXY_NONE, &cfg->proxy_type);
+    gppi(sesskey, "ProxyType", PROXY_NONE, &i); cfg->proxy_type = i;
     gpps(sesskey, "ProxyHost", "proxy", cfg->proxy_host,
         sizeof(cfg->proxy_host));
     gppi(sesskey, "ProxyPort", 80, &cfg->proxy_port);
@@ -404,7 +424,7 @@ void load_settings(char *section, int do_host, Config * cfg)
     gppi(sesskey, "ChangeUsername", 0, &cfg->change_username);
     gprefs(sesskey, "Cipher", "\0",
           ciphernames, CIPHER_MAX, cfg->ssh_cipherlist);
-    gppi(sesskey, "SshProt", 1, &cfg->sshprot);
+    gppi(sesskey, "SshProt", 2, &cfg->sshprot);
     gppi(sesskey, "SSH2DES", 0, &cfg->ssh2_des_cbc);
     gppi(sesskey, "AuthTIS", 0, &cfg->try_tis_auth);
     gppi(sesskey, "AuthKI", 1, &cfg->try_ki_auth);
@@ -452,8 +472,8 @@ void load_settings(char *section, int do_host, Config * cfg)
         sizeof(cfg->bell_wavefile));
     gppi(sesskey, "BellOverload", 1, &cfg->bellovl);
     gppi(sesskey, "BellOverloadN", 5, &cfg->bellovl_n);
-    gppi(sesskey, "BellOverloadT", 2000, &cfg->bellovl_t);
-    gppi(sesskey, "BellOverloadS", 5000, &cfg->bellovl_s);
+    gppi(sesskey, "BellOverloadT", 2*TICKSPERSEC, &cfg->bellovl_t);
+    gppi(sesskey, "BellOverloadS", 5*TICKSPERSEC, &cfg->bellovl_s);
     gppi(sesskey, "ScrollbackLines", 200, &cfg->savelines);
     gppi(sesskey, "DECOriginMode", 0, &cfg->dec_om);
     gppi(sesskey, "AutoWrapMode", 1, &cfg->wrap_mode);
@@ -462,10 +482,17 @@ void load_settings(char *section, int do_host, Config * cfg)
     gpps(sesskey, "WinTitle", "", cfg->wintitle, sizeof(cfg->wintitle));
     gppi(sesskey, "TermWidth", 80, &cfg->width);
     gppi(sesskey, "TermHeight", 24, &cfg->height);
+#ifdef _WINDOWS
     gpps(sesskey, "Font", "Courier New", cfg->font, sizeof(cfg->font));
+#else
+    gpps(sesskey, "Font", "fixed", cfg->font, sizeof(cfg->font));
+#endif
     gppi(sesskey, "FontIsBold", 0, &cfg->fontisbold);
+#ifdef _WINDOWS
     gppi(sesskey, "FontCharSet", ANSI_CHARSET, &cfg->fontcharset);
+#endif
     gppi(sesskey, "FontHeight", 10, &cfg->fontheight);
+#ifdef _WINDOWS
     if (cfg->fontheight < 0) {
        int oldh, newh;
        HDC hdc = GetDC(NULL);
@@ -478,6 +505,7 @@ void load_settings(char *section, int do_host, Config * cfg)
            newh--;
        cfg->fontheight = newh;
     }
+#endif
     gppi(sesskey, "FontVTMode", VT_UNICODE, (int *) &cfg->vtmode);
     gppi(sesskey, "TryPalette", 0, &cfg->try_palette);
     gppi(sesskey, "BoldAsColour", 1, &cfg->bold_colour);
@@ -499,7 +527,16 @@ void load_settings(char *section, int do_host, Config * cfg)
            cfg->colours[i][2] = c2;
        }
     }
+#ifndef _WINDOWS
+    /* Non-raw cut and paste of line-drawing chars works badly on the
+     * current Unix stub implementation of the Unicode functions.
+     * So I'm going to temporarily set the default to raw mode so
+     * that the failure mode isn't quite so drastically horrid.
+     * When Unicode comes in, this can all be put right. */
+    gppi(sesskey, "RawCNP", 1, &cfg->rawcnp);
+#else
     gppi(sesskey, "RawCNP", 0, &cfg->rawcnp);
+#endif
     gppi(sesskey, "PasteRTF", 0, &cfg->rtf_paste);
     gppi(sesskey, "MouseIsXterm", 0, &cfg->mouse_is_xterm);
     gppi(sesskey, "RectSelect", 0, &cfg->rect_select);
@@ -541,8 +578,8 @@ void load_settings(char *section, int do_host, Config * cfg)
     gppi(sesskey, "ScrollBarFullScreen", 0, &cfg->scrollbar_in_fullscreen);
     gppi(sesskey, "ScrollOnKey", 0, &cfg->scroll_on_key);
     gppi(sesskey, "ScrollOnDisp", 1, &cfg->scroll_on_disp);
-    gppi(sesskey, "LockSize", 0, &cfg->resize_action);
-    gppi(sesskey, "BCE", 0, &cfg->bce);
+    gppi(sesskey, "LockSize", 0, &i); cfg->resize_action = i;
+    gppi(sesskey, "BCE", 1, &cfg->bce);
     gppi(sesskey, "BlinkText", 0, &cfg->blinktext);
     gppi(sesskey, "X11Forward", 0, &cfg->x11_forward);
     gpps(sesskey, "X11Display", "localhost:0", cfg->x11_display,
@@ -570,21 +607,26 @@ void load_settings(char *section, int do_host, Config * cfg)
        }
        *q = '\0';
     }
-    gppi(sesskey, "BugIgnore1", BUG_AUTO, &cfg->sshbug_ignore1);
-    gppi(sesskey, "BugPlainPW1", BUG_AUTO, &cfg->sshbug_plainpw1);
-    gppi(sesskey, "BugRSA1", BUG_AUTO, &cfg->sshbug_rsa1);
+    gppi(sesskey, "BugIgnore1", BUG_AUTO, &i); cfg->sshbug_ignore1 = i;
+    gppi(sesskey, "BugPlainPW1", BUG_AUTO, &i); cfg->sshbug_plainpw1 = i;
+    gppi(sesskey, "BugRSA1", BUG_AUTO, &i); cfg->sshbug_rsa1 = i;
     {
        int i;
-       gppi(sesskey, "BugHMAC2", BUG_AUTO, &cfg->sshbug_hmac2);
+       gppi(sesskey, "BugHMAC2", BUG_AUTO, &i); cfg->sshbug_hmac2 = i;
        if (cfg->sshbug_hmac2 == BUG_AUTO) {
            gppi(sesskey, "BuggyMAC", 0, &i);
            if (i == 1)
                cfg->sshbug_hmac2 = BUG_ON;
        }
     }
-    gppi(sesskey, "BugDeriveKey2", BUG_AUTO, &cfg->sshbug_derivekey2);
-    gppi(sesskey, "BugRSAPad2", BUG_AUTO, &cfg->sshbug_rsapad2);
-    gppi(sesskey, "BugDHGEx2", BUG_AUTO, &cfg->sshbug_dhgex2);
+    gppi(sesskey, "BugDeriveKey2", BUG_AUTO, &i); cfg->sshbug_derivekey2 = i;
+    gppi(sesskey, "BugRSAPad2", BUG_AUTO, &i); cfg->sshbug_rsapad2 = i;
+    gppi(sesskey, "BugDHGEx2", BUG_AUTO, &i); cfg->sshbug_dhgex2 = i;
+    gppi(sesskey, "StampUtmp", 1, &cfg->stamp_utmp);
+    gppi(sesskey, "LoginShell", 1, &cfg->login_shell);
+    gppi(sesskey, "ScrollbarOnLeft", 0, &cfg->scrollbar_on_left);
+    gpps(sesskey, "BoldFont", "", cfg->boldfont, sizeof(cfg->boldfont));
+    gppi(sesskey, "ShadowBoldOffset", -1, &cfg->shadowboldoffset);
 
     close_settings_r(sesskey);
 }