mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-10 01:48:00 +00:00
Markus Kuhn's UTF-8 page
http://www.cl.cam.ac.uk/~mgk25/unicode.html#activate feels strongly that it should be easy to make _all_ your applications work in UTF-8 mode, without having to remember a switch for each one. Every application should simply note a UTF-8 locale setting and switch into UTF-8 mode automatically. Therefore, for the Unix port only, there's now a checkbox, enabled by default, which causes the drop-down Translation box to be overridden if the locale indicates UTF-8. Anyone who doesn't like this, or doesn't like MGK, is welcome to turn it straight back off. I'm not _completely_ convinced by MGK's argument myself; for xterm/pterm to do _useful_ UTF-8 you also need to specify a decently Unicode-capable font, and there's no way _that_ can be automagically done on noticing a locale setting. But it's a de facto standard (i.e. xterm does it :-) so I might as well at least be _able_ to support it. [originally from svn r4648]
This commit is contained in:
parent
d412fed542
commit
1b3eb3e20d
1
putty.h
1
putty.h
@ -448,6 +448,7 @@ struct config_tag {
|
||||
/* translations */
|
||||
int vtmode;
|
||||
char line_codepage[128];
|
||||
int utf8_override;
|
||||
int xlat_capslockcyr;
|
||||
/* X11 forwarding */
|
||||
int x11_forward;
|
||||
|
@ -314,6 +314,7 @@ void save_open_settings(void *sesskey, int do_host, Config *cfg)
|
||||
write_setting_s(sesskey, buf, buf2);
|
||||
}
|
||||
write_setting_s(sesskey, "LineCodePage", cfg->line_codepage);
|
||||
write_setting_i(sesskey, "UTF8Override", cfg->utf8_override);
|
||||
write_setting_s(sesskey, "Printer", cfg->printer);
|
||||
write_setting_i(sesskey, "CapsLockCyr", cfg->xlat_capslockcyr);
|
||||
write_setting_i(sesskey, "ScrollBar", cfg->scrollbar);
|
||||
@ -608,6 +609,7 @@ void load_open_settings(void *sesskey, int do_host, Config *cfg)
|
||||
*/
|
||||
gpps(sesskey, "LineCodePage", "", cfg->line_codepage,
|
||||
sizeof(cfg->line_codepage));
|
||||
gppi(sesskey, "UTF8Override", 1, &cfg->utf8_override);
|
||||
gpps(sesskey, "Printer", "", cfg->printer, sizeof(cfg->printer));
|
||||
gppi (sesskey, "CapsLockCyr", 0, &cfg->xlat_capslockcyr);
|
||||
gppi(sesskey, "ScrollBar", 1, &cfg->scrollbar);
|
||||
|
@ -2737,8 +2737,8 @@ void setup_fonts_ucs(struct gui_data *inst)
|
||||
inst->font_width = gdk_char_width(inst->fonts[0], ' ');
|
||||
inst->font_height = inst->fonts[0]->ascent + inst->fonts[0]->descent;
|
||||
|
||||
inst->direct_to_font = init_ucs(&inst->ucsdata,
|
||||
inst->cfg.line_codepage, font_charset,
|
||||
inst->direct_to_font = init_ucs(&inst->ucsdata, inst->cfg.line_codepage,
|
||||
inst->cfg.utf8_override, font_charset,
|
||||
inst->cfg.vtmode);
|
||||
}
|
||||
|
||||
|
@ -118,8 +118,8 @@ void (*putty_signal(int sig, void (*func)(int)))(int);
|
||||
* Exports from unicode.c.
|
||||
*/
|
||||
struct unicode_data;
|
||||
int init_ucs(struct unicode_data *ucsdata,
|
||||
char *line_codepage, int font_charset, int vtmode);
|
||||
int init_ucs(struct unicode_data *ucsdata, char *line_codepage,
|
||||
int utf8_override, int font_charset, int vtmode);
|
||||
|
||||
/*
|
||||
* Spare function exported directly from uxnet.c.
|
||||
|
15
unix/uxcfg.c
15
unix/uxcfg.c
@ -129,6 +129,21 @@ void unix_setup_config_box(struct controlbox *b, int midsession, void *win)
|
||||
HELPCTX(no_help), dlg_stdeditbox_handler,
|
||||
I(offsetof(Config,shadowboldoffset)), I(-1));
|
||||
|
||||
/*
|
||||
* Markus Kuhn feels, not totally unreasonably, that it's good
|
||||
* for all applications to shift into UTF-8 mode if they notice
|
||||
* that they've been started with a LANG setting dictating it,
|
||||
* so that people don't have to keep remembering a separate
|
||||
* UTF-8 option for every application they use. Therefore,
|
||||
* here's an override option in the Translation panel.
|
||||
*/
|
||||
s = ctrl_getset(b, "Window/Translation", "trans",
|
||||
"Character set translation on received data");
|
||||
ctrl_checkbox(s, "Override with UTF-8 if locale says so", 'l',
|
||||
HELPCTX(translation_utf8_override),
|
||||
dlg_stdcheckbox_handler,
|
||||
I(offsetof(Config,utf8_override)));
|
||||
|
||||
/*
|
||||
* Unix supports a local-command proxy. This also means we must
|
||||
* adjust the text on the `Telnet command' control.
|
||||
|
27
unix/uxucs.c
27
unix/uxucs.c
@ -106,8 +106,8 @@ int wc_to_mb(int codepage, int flags, wchar_t *wcstr, int wclen,
|
||||
/*
|
||||
* Return value is TRUE if pterm is to run in direct-to-font mode.
|
||||
*/
|
||||
int init_ucs(struct unicode_data *ucsdata,
|
||||
char *linecharset, int font_charset, int vtmode)
|
||||
int init_ucs(struct unicode_data *ucsdata, char *linecharset,
|
||||
int utf8_override, int font_charset, int vtmode)
|
||||
{
|
||||
int i, ret = 0;
|
||||
|
||||
@ -120,10 +120,27 @@ int init_ucs(struct unicode_data *ucsdata,
|
||||
ucsdata->font_codepage = -1;
|
||||
|
||||
/*
|
||||
* line_codepage should be decoded from the specification in
|
||||
* cfg.
|
||||
* If utf8_override is set and the POSIX locale settings
|
||||
* dictate a UTF-8 character set, then just go straight for
|
||||
* UTF-8.
|
||||
*/
|
||||
ucsdata->line_codepage = decode_codepage(linecharset);
|
||||
ucsdata->line_codepage = CS_NONE;
|
||||
if (utf8_override) {
|
||||
const char *s;
|
||||
if (((s = getenv("LC_ALL")) && *s) ||
|
||||
((s = getenv("LC_CTYPE")) && *s) ||
|
||||
((s = getenv("LANG")) && *s)) {
|
||||
if (strstr(s, "UTF-8"))
|
||||
ucsdata->line_codepage = CS_UTF8;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Failing that, line_codepage should be decoded from the
|
||||
* specification in cfg.
|
||||
*/
|
||||
if (ucsdata->line_codepage == CS_NONE)
|
||||
ucsdata->line_codepage = decode_codepage(linecharset);
|
||||
|
||||
/*
|
||||
* If line_codepage is _still_ CS_NONE, we assume we're using
|
||||
|
Loading…
Reference in New Issue
Block a user