I'm sick of all those #ifdefs in settings.c, and in any case plink
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Thu, 9 Jan 2003 18:06:29 +0000 (18:06 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Thu, 9 Jan 2003 18:06:29 +0000 (18:06 +0000)
and pterm need at least one default setting to be _different_ (pterm
needs the default term type to be `xterm', while plink needs it to
be taken from $TERM). So here's a completely new alternative
mechanism for platform- and app-specific default settings. Ben will
probably want to check the integrity of the Mac port, since I've
fiddled with it without testing that it still compiles.

git-svn-id: svn://svn.tartarus.org/sgt/putty@2513 cda61777-01e9-0310-a592-d414129be87e

Recipe
mac/mac.c
putty.h
settings.c
unix/pterm.c
unix/uxplink.c
windefs.c [new file with mode: 0644]

diff --git a/Recipe b/Recipe
index 8d6ec6f..3569fbe 100644 (file)
--- a/Recipe
+++ b/Recipe
@@ -109,6 +109,7 @@ SFTP     = sftp int64 logging
 # Miscellaneous objects appearing in all the network utilities (not
 # Pageant or PuTTYgen).
 WINMISC  = misc version winstore settings tree234 winnet proxy cmdline
+         + windefs
 UXMISC   = misc version uxstore settings tree234 uxnet proxy cmdline
 MACMISC  = misc version macstore settings tree234 mtcpnet proxy
 
index 21a2f01..a2c9b08 100644 (file)
--- a/mac/mac.c
+++ b/mac/mac.c
@@ -1,4 +1,4 @@
-/* $Id: mac.c,v 1.20 2003/01/08 22:46:12 ben Exp $ */
+/* $Id: mac.c,v 1.21 2003/01/09 18:06:29 simon Exp $ */
 /*
  * Copyright (c) 1999 Ben Harris
  * All rights reserved.
@@ -694,6 +694,27 @@ void old_keyfile_warning(void)
 
 }
 
+char *platform_default_s(char *name)
+{
+    if (!strcmp(name, "Font"))
+       return "Monaco";
+    return NULL;
+}
+
+int platform_default_i(char *name, int def)
+{
+    if (!strcmp(name, "FontHeight"))
+       return 9;
+    /* 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. */
+    if (!strcmp(name, "RawCNP"))
+       return 1;
+    return def;
+}
+
 /*
  * Local Variables:
  * c-file-style: "simon"
diff --git a/putty.h b/putty.h
index 93fef20..c4e6d98 100644 (file)
--- a/putty.h
+++ b/putty.h
@@ -482,6 +482,18 @@ void do_defaults(char *, Config *);
 void registry_cleanup(void);
 
 /*
+ * Functions used by settings.c to provide platform-specific
+ * default settings.
+ * 
+ * (The integer one is expected to return `def' if it has no clear
+ * opinion of its own. This is because there's no integer value
+ * which I can reliably set aside to indicate `nil'. The string
+ * function is perfectly all right returning NULL, of course.)
+ */
+char *platform_default_s(char *name);
+int platform_default_i(char *name, int def);
+
+/*
  * Exports from terminal.c.
  */
 
index 6f488d8..b36affc 100644 (file)
@@ -23,13 +23,22 @@ static const struct keyval ciphernames[] = {
 static void gpps(void *handle, char *name, char *def, char *val, int len)
 {
     if (!read_setting_s(handle, name, val, len)) {
-       strncpy(val, def, len);
+       char *pdef;
+
+       pdef = platform_default_s(name);
+       if (pdef) {
+           strncpy(val, pdef, len);
+       } else {
+           strncpy(val, def, len);
+       }
+
        val[len - 1] = '\0';
     }
 }
 
 static void gppi(void *handle, char *name, int def, int *i)
 {
+    def = platform_default_i(name, def);
     *i = read_setting_i(handle, name, def);
 }
 
@@ -367,13 +376,7 @@ void load_open_settings(void *sesskey, int do_host, Config *cfg)
      * 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, "CloseOnExit", COE_NORMAL, &cfg->close_on_exit);
     gppi(sesskey, "WarnOnClose", 1, &cfg->warn_on_close);
     {
        /* This is two values for backward compatibility with 0.50/0.51 */
@@ -492,22 +495,10 @@ void load_open_settings(void *sesskey, 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));
-#elif defined(macintosh)
-    gpps(sesskey, "Font", "Monaco", cfg->font, sizeof(cfg->font));
-#else
-    gpps(sesskey, "Font", "fixed", cfg->font, sizeof(cfg->font));
-#endif
+    gpps(sesskey, "Font", "XXX", cfg->font, sizeof(cfg->font));
     gppi(sesskey, "FontIsBold", 0, &cfg->fontisbold);
-#ifdef _WINDOWS
-    gppi(sesskey, "FontCharSet", ANSI_CHARSET, &cfg->fontcharset);
-#endif
-#ifdef macintosh
-    gppi(sesskey, "FontHeight", 9, &cfg->fontheight);
-#else
+    gppi(sesskey, "FontCharSet", 0, &cfg->fontcharset);
     gppi(sesskey, "FontHeight", 10, &cfg->fontheight);
-#endif
 #ifdef _WINDOWS
     if (cfg->fontheight < 0) {
        int oldh, newh;
@@ -543,16 +534,7 @@ void load_open_settings(void *sesskey, 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,17 +580,8 @@ void load_open_settings(void *sesskey, int do_host, Config *cfg)
     gppi(sesskey, "BCE", 1, &cfg->bce);
     gppi(sesskey, "BlinkText", 0, &cfg->blinktext);
     gppi(sesskey, "X11Forward", 0, &cfg->x11_forward);
-#ifdef _WINDOWS
     gpps(sesskey, "X11Display", "localhost:0", cfg->x11_display,
         sizeof(cfg->x11_display));
-#else
-    {
-       /* On Unix, the default X display should simply be $DISPLAY. */
-       char *disp = getenv("DISPLAY");
-       gpps(sesskey, "X11Display", disp, cfg->x11_display,
-            sizeof(cfg->x11_display));
-    }
-#endif
 
     gppi(sesskey, "LocalPortAcceptAll", 0, &cfg->lport_acceptall);
     gppi(sesskey, "RemotePortAcceptAll", 0, &cfg->rport_acceptall);
index b7e2b93..dbcb545 100644 (file)
@@ -83,6 +83,23 @@ char *x_get_default(char *key)
     return XGetDefault(GDK_DISPLAY(), app_name, key);
 }
 
+/*
+ * Default settings that are specific to pterm.
+ */
+char *platform_default_s(char *name)
+{
+    if (!strcmp(name, "Font"))
+       return "fixed";        /* COE_NORMAL works badly in an xterm */
+    return NULL;
+}
+
+int platform_default_i(char *name, int def)
+{
+    if (!strcmp(name, "CloseOnExit"))
+       return COE_ALWAYS;             /* COE_NORMAL works badly in an xterm */
+    return def;
+}
+
 void ldisc_update(void *frontend, int echo, int edit)
 {
     /*
index 99ace88..a005ce6 100644 (file)
@@ -9,6 +9,8 @@
 #include <unistd.h>
 #include <fcntl.h>
 #include <termios.h>
+#include <pwd.h>
+#include <sys/ioctl.h>
 
 /* More helpful version of the FD_SET macro, to also handle maxfd. */
 #define FD_SET_MAX(fd, max, set) do { \
@@ -69,6 +71,68 @@ struct termios orig_termios;
 static Backend *back;
 static void *backhandle;
 
+/*
+ * Default settings that are specific to pterm.
+ */
+char *platform_default_s(char *name)
+{
+    if (!strcmp(name, "X11Display"))
+       return getenv("DISPLAY");
+    if (!strcmp(name, "TermType"))
+       return getenv("TERM");
+    if (!strcmp(name, "UserName")) {
+       /*
+        * Remote login username will default to the local username.
+        */
+       struct passwd *p;
+       uid_t uid = getuid();
+       char *user, *ret = NULL;
+
+       /*
+        * First, find who we think we are using getlogin. If this
+        * agrees with our uid, we'll go along with it. This should
+        * allow sharing of uids between several login names whilst
+        * coping correctly with people who have su'ed.
+        */
+       user = getlogin();
+       setpwent();
+       if (user)
+           p = getpwnam(user);
+       else
+           p = NULL;
+       if (p && p->pw_uid == uid) {
+           /*
+            * The result of getlogin() really does correspond to
+            * our uid. Fine.
+            */
+           ret = user;
+       } else {
+           /*
+            * If that didn't work, for whatever reason, we'll do
+            * the simpler version: look up our uid in the password
+            * file and map it straight to a name.
+            */
+           p = getpwuid(uid);
+           ret = p->pw_name;
+       }
+       endpwent();
+
+       return ret;
+    }
+    return NULL;
+}
+
+int platform_default_i(char *name, int def)
+{
+    if (!strcmp(name, "TermWidth") ||
+       !strcmp(name, "TermHeight")) {
+       struct winsize size;
+       if (ioctl(0, TIOCGWINSZ, (void *)&size) >= 0)
+           return (!strcmp(name, "TermWidth") ? size.ws_col : size.ws_row);
+    }
+    return def;
+}
+
 char *x_get_default(char *key)
 {
     return NULL;                      /* this is a stub */
diff --git a/windefs.c b/windefs.c
new file mode 100644 (file)
index 0000000..88e9fe6
--- /dev/null
+++ b/windefs.c
@@ -0,0 +1,25 @@
+/*
+ * windefs.c: default settings that are specific to Windows.
+ */
+
+#include <windows.h>
+#include <commctrl.h>
+
+#include "winstuff.h"
+#include "puttymem.h"
+
+#include "putty.h"
+
+char *platform_default_s(char *name)
+{
+    if (!strcmp(name, "Font"))
+       return "Courier New";
+    return NULL;
+}
+
+int platform_default_i(char *name, int def)
+{
+    if (!strcmp(name, "FontCharSet"))
+       return ANSI_CHARSET;
+    return def;
+}