From: simon Date: Sat, 16 Oct 2004 14:17:58 +0000 (+0000) Subject: Markus Kuhn's UTF-8 page X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/commitdiff_plain/6ac7f054182a91601c70c93b663c10149a766fb7 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. git-svn-id: svn://svn.tartarus.org/sgt/putty@4648 cda61777-01e9-0310-a592-d414129be87e --- diff --git a/putty.h b/putty.h index 89889b96..a7f3f5b2 100644 --- a/putty.h +++ b/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; diff --git a/settings.c b/settings.c index b0f223e9..a8f70917 100644 --- a/settings.c +++ b/settings.c @@ -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); diff --git a/unix/pterm.c b/unix/pterm.c index ec1ffec4..13cd994f 100644 --- a/unix/pterm.c +++ b/unix/pterm.c @@ -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); } diff --git a/unix/unix.h b/unix/unix.h index f12f576d..384789aa 100644 --- a/unix/unix.h +++ b/unix/unix.h @@ -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. diff --git a/unix/uxcfg.c b/unix/uxcfg.c index 813009ef..fff29680 100644 --- a/unix/uxcfg.c +++ b/unix/uxcfg.c @@ -130,6 +130,21 @@ void unix_setup_config_box(struct controlbox *b, int midsession, void *win) 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. */ diff --git a/unix/uxucs.c b/unix/uxucs.c index 601b35da..83595538 100644 --- a/unix/uxucs.c +++ b/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