mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-10 01:48:00 +00:00
I'm sick of all those #ifdefs in settings.c, and in any case plink
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. [originally from svn r2513]
This commit is contained in:
parent
10c1d43ac6
commit
4d86f5979d
1
Recipe
1
Recipe
@ -109,6 +109,7 @@ SFTP = sftp int64 logging
|
|||||||
# Miscellaneous objects appearing in all the network utilities (not
|
# Miscellaneous objects appearing in all the network utilities (not
|
||||||
# Pageant or PuTTYgen).
|
# Pageant or PuTTYgen).
|
||||||
WINMISC = misc version winstore settings tree234 winnet proxy cmdline
|
WINMISC = misc version winstore settings tree234 winnet proxy cmdline
|
||||||
|
+ windefs
|
||||||
UXMISC = misc version uxstore settings tree234 uxnet proxy cmdline
|
UXMISC = misc version uxstore settings tree234 uxnet proxy cmdline
|
||||||
MACMISC = misc version macstore settings tree234 mtcpnet proxy
|
MACMISC = misc version macstore settings tree234 mtcpnet proxy
|
||||||
|
|
||||||
|
23
mac/mac.c
23
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
|
* Copyright (c) 1999 Ben Harris
|
||||||
* All rights reserved.
|
* 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:
|
* Local Variables:
|
||||||
* c-file-style: "simon"
|
* c-file-style: "simon"
|
||||||
|
12
putty.h
12
putty.h
@ -481,6 +481,18 @@ void get_sesslist(struct sesslist *, int allocate);
|
|||||||
void do_defaults(char *, Config *);
|
void do_defaults(char *, Config *);
|
||||||
void registry_cleanup(void);
|
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.
|
* Exports from terminal.c.
|
||||||
*/
|
*/
|
||||||
|
53
settings.c
53
settings.c
@ -23,13 +23,22 @@ static const struct keyval ciphernames[] = {
|
|||||||
static void gpps(void *handle, char *name, char *def, char *val, int len)
|
static void gpps(void *handle, char *name, char *def, char *val, int len)
|
||||||
{
|
{
|
||||||
if (!read_setting_s(handle, name, val, 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';
|
val[len - 1] = '\0';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gppi(void *handle, char *name, int def, int *i)
|
static void gppi(void *handle, char *name, int def, int *i)
|
||||||
{
|
{
|
||||||
|
def = platform_default_i(name, def);
|
||||||
*i = read_setting_i(handle, 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
|
* single command in its own pterm), but I don't think it's a
|
||||||
* sane default, unfortunately.
|
* sane default, unfortunately.
|
||||||
*/
|
*/
|
||||||
gppi(sesskey, "CloseOnExit",
|
gppi(sesskey, "CloseOnExit", COE_NORMAL, &cfg->close_on_exit);
|
||||||
#ifdef _WINDOWS
|
|
||||||
COE_NORMAL,
|
|
||||||
#else
|
|
||||||
COE_ALWAYS,
|
|
||||||
#endif
|
|
||||||
&cfg->close_on_exit);
|
|
||||||
gppi(sesskey, "WarnOnClose", 1, &cfg->warn_on_close);
|
gppi(sesskey, "WarnOnClose", 1, &cfg->warn_on_close);
|
||||||
{
|
{
|
||||||
/* This is two values for backward compatibility with 0.50/0.51 */
|
/* 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));
|
gpps(sesskey, "WinTitle", "", cfg->wintitle, sizeof(cfg->wintitle));
|
||||||
gppi(sesskey, "TermWidth", 80, &cfg->width);
|
gppi(sesskey, "TermWidth", 80, &cfg->width);
|
||||||
gppi(sesskey, "TermHeight", 24, &cfg->height);
|
gppi(sesskey, "TermHeight", 24, &cfg->height);
|
||||||
#ifdef _WINDOWS
|
gpps(sesskey, "Font", "XXX", cfg->font, sizeof(cfg->font));
|
||||||
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
|
|
||||||
gppi(sesskey, "FontIsBold", 0, &cfg->fontisbold);
|
gppi(sesskey, "FontIsBold", 0, &cfg->fontisbold);
|
||||||
#ifdef _WINDOWS
|
gppi(sesskey, "FontCharSet", 0, &cfg->fontcharset);
|
||||||
gppi(sesskey, "FontCharSet", ANSI_CHARSET, &cfg->fontcharset);
|
|
||||||
#endif
|
|
||||||
#ifdef macintosh
|
|
||||||
gppi(sesskey, "FontHeight", 9, &cfg->fontheight);
|
|
||||||
#else
|
|
||||||
gppi(sesskey, "FontHeight", 10, &cfg->fontheight);
|
gppi(sesskey, "FontHeight", 10, &cfg->fontheight);
|
||||||
#endif
|
|
||||||
#ifdef _WINDOWS
|
#ifdef _WINDOWS
|
||||||
if (cfg->fontheight < 0) {
|
if (cfg->fontheight < 0) {
|
||||||
int oldh, newh;
|
int oldh, newh;
|
||||||
@ -543,16 +534,7 @@ void load_open_settings(void *sesskey, int do_host, Config *cfg)
|
|||||||
cfg->colours[i][2] = c2;
|
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);
|
gppi(sesskey, "RawCNP", 0, &cfg->rawcnp);
|
||||||
#endif
|
|
||||||
gppi(sesskey, "PasteRTF", 0, &cfg->rtf_paste);
|
gppi(sesskey, "PasteRTF", 0, &cfg->rtf_paste);
|
||||||
gppi(sesskey, "MouseIsXterm", 0, &cfg->mouse_is_xterm);
|
gppi(sesskey, "MouseIsXterm", 0, &cfg->mouse_is_xterm);
|
||||||
gppi(sesskey, "RectSelect", 0, &cfg->rect_select);
|
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, "BCE", 1, &cfg->bce);
|
||||||
gppi(sesskey, "BlinkText", 0, &cfg->blinktext);
|
gppi(sesskey, "BlinkText", 0, &cfg->blinktext);
|
||||||
gppi(sesskey, "X11Forward", 0, &cfg->x11_forward);
|
gppi(sesskey, "X11Forward", 0, &cfg->x11_forward);
|
||||||
#ifdef _WINDOWS
|
|
||||||
gpps(sesskey, "X11Display", "localhost:0", cfg->x11_display,
|
gpps(sesskey, "X11Display", "localhost:0", cfg->x11_display,
|
||||||
sizeof(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, "LocalPortAcceptAll", 0, &cfg->lport_acceptall);
|
||||||
gppi(sesskey, "RemotePortAcceptAll", 0, &cfg->rport_acceptall);
|
gppi(sesskey, "RemotePortAcceptAll", 0, &cfg->rport_acceptall);
|
||||||
|
17
unix/pterm.c
17
unix/pterm.c
@ -83,6 +83,23 @@ char *x_get_default(char *key)
|
|||||||
return XGetDefault(GDK_DISPLAY(), app_name, 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)
|
void ldisc_update(void *frontend, int echo, int edit)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -9,6 +9,8 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
/* More helpful version of the FD_SET macro, to also handle maxfd. */
|
/* More helpful version of the FD_SET macro, to also handle maxfd. */
|
||||||
#define FD_SET_MAX(fd, max, set) do { \
|
#define FD_SET_MAX(fd, max, set) do { \
|
||||||
@ -69,6 +71,68 @@ struct termios orig_termios;
|
|||||||
static Backend *back;
|
static Backend *back;
|
||||||
static void *backhandle;
|
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)
|
char *x_get_default(char *key)
|
||||||
{
|
{
|
||||||
return NULL; /* this is a stub */
|
return NULL; /* this is a stub */
|
||||||
|
25
windefs.c
Normal file
25
windefs.c
Normal file
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user