Tentative merge of ben-mac-port (only dead for three years!) into the trunk.
[u/mdw/putty] / settings.c
index 98847de..9530b4a 100644 (file)
@@ -312,6 +312,8 @@ void save_settings(char *section, int do_host, Config * cfg)
     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);
 }
 
@@ -347,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 */
@@ -466,6 +484,8 @@ void load_settings(char *section, int do_host, Config * cfg)
     gppi(sesskey, "TermHeight", 24, &cfg->height);
 #ifdef _WINDOWS
     gpps(sesskey, "Font", "Courier New", cfg->font, sizeof(cfg->font));
+#elif defined(macintosh)
+    gpps(sesskey, "Font", "Monaco", cfg->font, sizeof(cfg->font));
 #else
     gpps(sesskey, "Font", "fixed", cfg->font, sizeof(cfg->font));
 #endif
@@ -509,7 +529,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);
@@ -598,6 +627,8 @@ void load_settings(char *section, int do_host, Config * cfg)
     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);
 }
@@ -630,10 +661,9 @@ static int sessioncmp(const void *av, const void *bv)
     return strcmp(a, b);              /* otherwise, compare normally */
 }
 
-void get_sesslist(int allocate)
+void get_sesslist(struct sesslist *list, int allocate)
 {
-    static char otherbuf[2048];
-    static char *buffer;
+    char otherbuf[2048];
     int buflen, bufsize, i;
     char *p, *ret;
     void *handle;
@@ -641,24 +671,24 @@ void get_sesslist(int allocate)
     if (allocate) {
 
        buflen = bufsize = 0;
-       buffer = NULL;
-       if ((handle = enum_settings_start())) {
+       list->buffer = NULL;
+       if ((handle = enum_settings_start()) != NULL) {
            do {
                ret = enum_settings_next(handle, otherbuf, sizeof(otherbuf));
                if (ret) {
                    int len = strlen(otherbuf) + 1;
                    if (bufsize < buflen + len) {
                        bufsize = buflen + len + 2048;
-                       buffer = srealloc(buffer, bufsize);
+                       list->buffer = srealloc(list->buffer, bufsize);
                    }
-                   strcpy(buffer + buflen, otherbuf);
-                   buflen += strlen(buffer + buflen) + 1;
+                   strcpy(list->buffer + buflen, otherbuf);
+                   buflen += strlen(list->buffer + buflen) + 1;
                }
            } while (ret);
            enum_settings_finish(handle);
        }
-       buffer = srealloc(buffer, buflen + 1);
-       buffer[buflen] = '\0';
+       list->buffer = srealloc(list->buffer, buflen + 1);
+       list->buffer[buflen] = '\0';
 
        /*
         * Now set up the list of sessions. Note that "Default
@@ -666,31 +696,31 @@ void get_sesslist(int allocate)
         * doesn't really.
         */
 
-       p = buffer;
-       nsessions = 1;                 /* "Default Settings" counts as one */
+       p = list->buffer;
+       list->nsessions = 1;           /* "Default Settings" counts as one */
        while (*p) {
            if (strcmp(p, "Default Settings"))
-               nsessions++;
+               list->nsessions++;
            while (*p)
                p++;
            p++;
        }
 
-       sessions = smalloc((nsessions + 1) * sizeof(char *));
-       sessions[0] = "Default Settings";
-       p = buffer;
+       list->sessions = smalloc((list->nsessions + 1) * sizeof(char *));
+       list->sessions[0] = "Default Settings";
+       p = list->buffer;
        i = 1;
        while (*p) {
            if (strcmp(p, "Default Settings"))
-               sessions[i++] = p;
+               list->sessions[i++] = p;
            while (*p)
                p++;
            p++;
        }
 
-       qsort(sessions, i, sizeof(char *), sessioncmp);
+       qsort(list->sessions, i, sizeof(char *), sessioncmp);
     } else {
-       sfree(buffer);
-       sfree(sessions);
+       sfree(list->buffer);
+       sfree(list->sessions);
     }
 }