1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-07-02 03:52:49 -05:00

Deglobalise the Unicode module. Despite all my grand plans, I've

just done this the very simple way - bundle all the globals into a
data structure and pass pointers around. One particularly ugly wart
is that wc_to_mb now takes a pointer to this structure as an
argument (optional, may be NULL, and unused in any Unicode layer
that's even marginally less of a mess than the Windows one). I do
need to do this properly at some point, but for now this should just
about be adequate. As usual, the Mac port has not been updated.

[originally from svn r2592]
This commit is contained in:
Simon Tatham
2003-01-14 18:28:23 +00:00
parent a185e16467
commit b2374a64fd
10 changed files with 193 additions and 167 deletions

View File

@ -120,6 +120,7 @@ static void *ldisc;
static Backend *back;
static void *backhandle;
static struct unicode_data ucsdata;
static int session_closed;
Config cfg; /* exported to windlg.c */
@ -508,7 +509,9 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
hwnd = NULL;
term = term_init(&cfg, NULL);
memset(&ucsdata, 0, sizeof(ucsdata));
term = term_init(&cfg, &ucsdata, NULL);
logctx = log_init(NULL, &cfg);
term_provide_logctx(term, logctx);
@ -1112,16 +1115,15 @@ static void init_fonts(int pick_width, int pick_height)
/* !!! Yes the next line is right */
if (cset == OEM_CHARSET)
font_codepage = GetOEMCP();
ucsdata.font_codepage = GetOEMCP();
else
if (TranslateCharsetInfo
((DWORD *) cset, &info, TCI_SRCCHARSET)) font_codepage =
info.ciACP;
if (TranslateCharsetInfo ((DWORD *) cset, &info, TCI_SRCCHARSET))
ucsdata.font_codepage = info.ciACP;
else
font_codepage = -1;
ucsdata.font_codepage = -1;
GetCPInfo(font_codepage, &cpinfo);
dbcs_screenfont = (cpinfo.MaxCharSize > 1);
GetCPInfo(ucsdata.font_codepage, &cpinfo);
ucsdata.dbcs_screenfont = (cpinfo.MaxCharSize > 1);
}
f(FONT_UNDERLINE, cfg.fontcharset, fw_dontcare, TRUE);
@ -1209,7 +1211,7 @@ static void init_fonts(int pick_width, int pick_height)
}
fontflag[0] = fontflag[1] = fontflag[2] = 1;
init_ucs(&cfg);
init_ucs(&cfg, &ucsdata);
}
static void another_font(int fontno)
@ -2760,8 +2762,8 @@ void do_text(Context ctx, int x, int y, char *text, int len,
if (lattr == LATTR_TOP || lattr == LATTR_BOT)
text_adjust *= 2;
attr &= ~CSET_MASK;
text[0] = (char) (unitab_xterm['q'] & CHAR_MASK);
attr |= (unitab_xterm['q'] & CSET_MASK);
text[0] = (char) (ucsdata.unitab_xterm['q'] & CHAR_MASK);
attr |= (ucsdata.unitab_xterm['q'] & CSET_MASK);
if (attr & ATTR_UNDER) {
attr &= ~ATTR_UNDER;
force_manual_underline = 1;
@ -2822,7 +2824,7 @@ void do_text(Context ctx, int x, int y, char *text, int len,
line_box.right = font_width*term->cols+offset_width;
/* We're using a private area for direct to font. (512 chars.) */
if (dbcs_screenfont && (attr & CSET_MASK) == ATTR_ACP) {
if (ucsdata.dbcs_screenfont && (attr & CSET_MASK) == ATTR_ACP) {
/* Ho Hum, dbcs fonts are a PITA! */
/* To display on W9x I have to convert to UCS */
static wchar_t *uni_buf = 0;
@ -2835,15 +2837,15 @@ void do_text(Context ctx, int x, int y, char *text, int len,
for(nlen = mptr = 0; mptr<len; mptr++) {
uni_buf[nlen] = 0xFFFD;
if (IsDBCSLeadByteEx(font_codepage, (BYTE) text[mptr])) {
if (IsDBCSLeadByteEx(ucsdata.font_codepage, (BYTE) text[mptr])) {
IpDx[nlen] += char_width;
MultiByteToWideChar(font_codepage, MB_USEGLYPHCHARS,
MultiByteToWideChar(ucsdata.font_codepage, MB_USEGLYPHCHARS,
text+mptr, 2, uni_buf+nlen, 1);
mptr++;
}
else
{
MultiByteToWideChar(font_codepage, MB_USEGLYPHCHARS,
MultiByteToWideChar(ucsdata.font_codepage, MB_USEGLYPHCHARS,
text+mptr, 1, uni_buf+nlen, 1);
}
nlen++;
@ -3012,17 +3014,17 @@ int char_width(Context ctx, int uc) {
switch (uc & CSET_MASK) {
case ATTR_ASCII:
uc = unitab_line[uc & 0xFF];
uc = ucsdata.unitab_line[uc & 0xFF];
break;
case ATTR_LINEDRW:
uc = unitab_xterm[uc & 0xFF];
uc = ucsdata.unitab_xterm[uc & 0xFF];
break;
case ATTR_SCOACS:
uc = unitab_scoacs[uc & 0xFF];
uc = ucsdata.unitab_scoacs[uc & 0xFF];
break;
}
if (DIRECT_FONT(uc)) {
if (dbcs_screenfont) return 1;
if (ucsdata.dbcs_screenfont) return 1;
/* Speedup, I know of no font where ascii is the wrong width */
if ((uc&CHAR_MASK) >= ' ' && (uc&CHAR_MASK)<= '~')
@ -3767,7 +3769,7 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam,
#ifdef SHOW_TOASCII_RESULT
if (r == 1 && !key_down) {
if (alt_sum) {
if (in_utf(term) || dbcs_screenfont)
if (in_utf(term) || ucsdata.dbcs_screenfont)
debug((", (U+%04x)", alt_sum));
else
debug((", LCH(%d)", alt_sum));
@ -3820,7 +3822,7 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam,
if (!key_down) {
if (alt_sum) {
if (in_utf(term) || dbcs_screenfont) {
if (in_utf(term) || ucsdata.dbcs_screenfont) {
keybuf = alt_sum;
term_seen_key_event(term);
luni_send(ldisc, &keybuf, 1, 1);
@ -3870,7 +3872,7 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam,
if (!left_alt)
keys[0] = 0;
/* If we will be using alt_sum fix the 256s */
else if (keys[0] && (in_utf(term) || dbcs_screenfont))
else if (keys[0] && (in_utf(term) || ucsdata.dbcs_screenfont))
keys[0] = 10;
}