mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-25 01:02:24 +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 */
|
/* translations */
|
||||||
int vtmode;
|
int vtmode;
|
||||||
char line_codepage[128];
|
char line_codepage[128];
|
||||||
|
int utf8_override;
|
||||||
int xlat_capslockcyr;
|
int xlat_capslockcyr;
|
||||||
/* X11 forwarding */
|
/* X11 forwarding */
|
||||||
int x11_forward;
|
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, buf, buf2);
|
||||||
}
|
}
|
||||||
write_setting_s(sesskey, "LineCodePage", cfg->line_codepage);
|
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_s(sesskey, "Printer", cfg->printer);
|
||||||
write_setting_i(sesskey, "CapsLockCyr", cfg->xlat_capslockcyr);
|
write_setting_i(sesskey, "CapsLockCyr", cfg->xlat_capslockcyr);
|
||||||
write_setting_i(sesskey, "ScrollBar", cfg->scrollbar);
|
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,
|
gpps(sesskey, "LineCodePage", "", cfg->line_codepage,
|
||||||
sizeof(cfg->line_codepage));
|
sizeof(cfg->line_codepage));
|
||||||
|
gppi(sesskey, "UTF8Override", 1, &cfg->utf8_override);
|
||||||
gpps(sesskey, "Printer", "", cfg->printer, sizeof(cfg->printer));
|
gpps(sesskey, "Printer", "", cfg->printer, sizeof(cfg->printer));
|
||||||
gppi (sesskey, "CapsLockCyr", 0, &cfg->xlat_capslockcyr);
|
gppi (sesskey, "CapsLockCyr", 0, &cfg->xlat_capslockcyr);
|
||||||
gppi(sesskey, "ScrollBar", 1, &cfg->scrollbar);
|
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_width = gdk_char_width(inst->fonts[0], ' ');
|
||||||
inst->font_height = inst->fonts[0]->ascent + inst->fonts[0]->descent;
|
inst->font_height = inst->fonts[0]->ascent + inst->fonts[0]->descent;
|
||||||
|
|
||||||
inst->direct_to_font = init_ucs(&inst->ucsdata,
|
inst->direct_to_font = init_ucs(&inst->ucsdata, inst->cfg.line_codepage,
|
||||||
inst->cfg.line_codepage, font_charset,
|
inst->cfg.utf8_override, font_charset,
|
||||||
inst->cfg.vtmode);
|
inst->cfg.vtmode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,8 +118,8 @@ void (*putty_signal(int sig, void (*func)(int)))(int);
|
|||||||
* Exports from unicode.c.
|
* Exports from unicode.c.
|
||||||
*/
|
*/
|
||||||
struct unicode_data;
|
struct unicode_data;
|
||||||
int init_ucs(struct unicode_data *ucsdata,
|
int init_ucs(struct unicode_data *ucsdata, char *line_codepage,
|
||||||
char *line_codepage, int font_charset, int vtmode);
|
int utf8_override, int font_charset, int vtmode);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Spare function exported directly from uxnet.c.
|
* 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,
|
HELPCTX(no_help), dlg_stdeditbox_handler,
|
||||||
I(offsetof(Config,shadowboldoffset)), I(-1));
|
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
|
* Unix supports a local-command proxy. This also means we must
|
||||||
* adjust the text on the `Telnet command' control.
|
* 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.
|
* Return value is TRUE if pterm is to run in direct-to-font mode.
|
||||||
*/
|
*/
|
||||||
int init_ucs(struct unicode_data *ucsdata,
|
int init_ucs(struct unicode_data *ucsdata, char *linecharset,
|
||||||
char *linecharset, int font_charset, int vtmode)
|
int utf8_override, int font_charset, int vtmode)
|
||||||
{
|
{
|
||||||
int i, ret = 0;
|
int i, ret = 0;
|
||||||
|
|
||||||
@ -120,10 +120,27 @@ int init_ucs(struct unicode_data *ucsdata,
|
|||||||
ucsdata->font_codepage = -1;
|
ucsdata->font_codepage = -1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* line_codepage should be decoded from the specification in
|
* If utf8_override is set and the POSIX locale settings
|
||||||
* cfg.
|
* 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
|
* If line_codepage is _still_ CS_NONE, we assume we're using
|
||||||
|
Loading…
Reference in New Issue
Block a user