X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/6473492058e854537bb061277bd9eb5c319bf11a..f6fc00103fd047abc6c707db8912d3e71c336481:/terminal.c diff --git a/terminal.c b/terminal.c index ba5e14e8..005bee55 100644 --- a/terminal.c +++ b/terminal.c @@ -337,7 +337,8 @@ void term_clrsb(Terminal *term) /* * Initialise the terminal. */ -Terminal *term_init(Config *mycfg, void *frontend) +Terminal *term_init(Config *mycfg, struct unicode_data *ucsdata, + void *frontend) { Terminal *term; @@ -347,6 +348,7 @@ Terminal *term_init(Config *mycfg, void *frontend) */ term = smalloc(sizeof(Terminal)); term->frontend = frontend; + term->ucsdata = ucsdata; term->cfg = *mycfg; /* STRUCTURE COPY */ term->logctx = NULL; term->compatibility_level = TM_PUTTY; @@ -389,6 +391,34 @@ Terminal *term_init(Config *mycfg, void *frontend) return term; } +void term_free(Terminal *term) +{ + unsigned long *line; + struct beeptime *beep; + + while ((line = delpos234(term->scrollback, 0)) != NULL) + sfree(line); + freetree234(term->scrollback); + while ((line = delpos234(term->screen, 0)) != NULL) + sfree(line); + freetree234(term->screen); + while ((line = delpos234(term->alt_screen, 0)) != NULL) + sfree(line); + freetree234(term->alt_screen); + sfree(term->disptext); + while (term->beephead) { + beep = term->beephead; + term->beephead = beep->next; + sfree(beep); + } + bufchain_clear(&term->inbuf); + if(term->print_job) + printer_finish_job(term->print_job); + bufchain_clear(&term->printer_buf); + sfree(term->paste_buffer); + sfree(term); +} + /* * Set up the terminal for a given size. */ @@ -1274,8 +1304,8 @@ void term_out(Terminal *term) case 0: if (c < 0x80) { /* UTF-8 must be stateless so we ignore iso2022. */ - if (unitab_ctrl[c] != 0xFF) - c = unitab_ctrl[c]; + if (term->ucsdata->unitab_ctrl[c] != 0xFF) + c = term->ucsdata->unitab_ctrl[c]; else c = ((unsigned char)c) | ATTR_ASCII; break; } else if ((c & 0xe0) == 0xc0) { @@ -1372,8 +1402,8 @@ void term_out(Terminal *term) * the same encoding. */ case ATTR_LINEDRW: - if (unitab_ctrl[c] != 0xFF) - c = unitab_ctrl[c]; + if (term->ucsdata->unitab_ctrl[c] != 0xFF) + c = term->ucsdata->unitab_ctrl[c]; else c = ((unsigned char) c) | ATTR_LINEDRW; break; @@ -1385,8 +1415,8 @@ void term_out(Terminal *term) break; } /*FALLTHROUGH*/ case ATTR_ASCII: - if (unitab_ctrl[c] != 0xFF) - c = unitab_ctrl[c]; + if (term->ucsdata->unitab_ctrl[c] != 0xFF) + c = term->ucsdata->unitab_ctrl[c]; else c = ((unsigned char) c) | ATTR_ASCII; break; @@ -3115,13 +3145,13 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise) tattr = (*d & (ATTR_MASK ^ CSET_MASK)); switch (tchar & CSET_MASK) { case ATTR_ASCII: - tchar = unitab_line[tchar & 0xFF]; + tchar = term->ucsdata->unitab_line[tchar & 0xFF]; break; case ATTR_LINEDRW: - tchar = unitab_xterm[tchar & 0xFF]; + tchar = term->ucsdata->unitab_xterm[tchar & 0xFF]; break; case ATTR_SCOACS: - tchar = unitab_scoacs[tchar&0xFF]; + tchar = term->ucsdata->unitab_scoacs[tchar&0xFF]; break; } tattr |= (tchar & CSET_MASK); @@ -3179,7 +3209,7 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise) if ((attr & CSET_MASK) == 0x2300 && tchar >= 0xBA && tchar <= 0xBD) break_run = TRUE; - if (!dbcs_screenfont && !dirty_line) { + if (!term->ucsdata->dbcs_screenfont && !dirty_line) { if ((tchar | tattr) == term->disptext[idx]) break_run = TRUE; else if (!dirty_run && ccount == 1) @@ -3194,7 +3224,7 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise) start = j; ccount = 0; attr = tattr; - if (dbcs_screenfont) + if (term->ucsdata->dbcs_screenfont) last_run_dirty = dirty_run; dirty_run = dirty_line; } @@ -3414,22 +3444,22 @@ static void clipme(Terminal *term, pos top, pos bottom, int rect) switch (uc & CSET_MASK) { case ATTR_LINEDRW: if (!term->cfg.rawcnp) { - uc = unitab_xterm[uc & 0xFF]; + uc = term->ucsdata->unitab_xterm[uc & 0xFF]; break; } case ATTR_ASCII: - uc = unitab_line[uc & 0xFF]; + uc = term->ucsdata->unitab_line[uc & 0xFF]; break; case ATTR_SCOACS: - uc = unitab_scoacs[uc&0xFF]; + uc = term->ucsdata->unitab_scoacs[uc&0xFF]; break; } switch (uc & CSET_MASK) { case ATTR_ACP: - uc = unitab_font[uc & 0xFF]; + uc = term->ucsdata->unitab_font[uc & 0xFF]; break; case ATTR_OEMCP: - uc = unitab_oemcp[uc & 0xFF]; + uc = term->ucsdata->unitab_oemcp[uc & 0xFF]; break; } @@ -3443,14 +3473,14 @@ static void clipme(Terminal *term, pos top, pos bottom, int rect) char buf[4]; WCHAR wbuf[4]; int rv; - if (is_dbcs_leadbyte(font_codepage, (BYTE) c)) { + if (is_dbcs_leadbyte(term->ucsdata->font_codepage, (BYTE) c)) { buf[0] = c; buf[1] = (char) (0xFF & ldata[top.x + 1]); - rv = mb_to_wc(font_codepage, 0, buf, 2, wbuf, 4); + rv = mb_to_wc(term->ucsdata->font_codepage, 0, buf, 2, wbuf, 4); top.x++; } else { buf[0] = c; - rv = mb_to_wc(font_codepage, 0, buf, 1, wbuf, 4); + rv = mb_to_wc(term->ucsdata->font_codepage, 0, buf, 1, wbuf, 4); } if (rv > 0) { @@ -3580,28 +3610,29 @@ static int wordtype(Terminal *term, int uc) switch (uc & CSET_MASK) { case ATTR_LINEDRW: - uc = unitab_xterm[uc & 0xFF]; + uc = term->ucsdata->unitab_xterm[uc & 0xFF]; break; case ATTR_ASCII: - uc = unitab_line[uc & 0xFF]; + uc = term->ucsdata->unitab_line[uc & 0xFF]; break; case ATTR_SCOACS: - uc = unitab_scoacs[uc&0xFF]; + uc = term->ucsdata->unitab_scoacs[uc&0xFF]; break; } switch (uc & CSET_MASK) { case ATTR_ACP: - uc = unitab_font[uc & 0xFF]; + uc = term->ucsdata->unitab_font[uc & 0xFF]; break; case ATTR_OEMCP: - uc = unitab_oemcp[uc & 0xFF]; + uc = term->ucsdata->unitab_oemcp[uc & 0xFF]; break; } /* For DBCS font's I can't do anything usefull. Even this will sometimes * fail as there's such a thing as a double width space. :-( */ - if (dbcs_screenfont && font_codepage == line_codepage) + if (term->ucsdata->dbcs_screenfont && + term->ucsdata->font_codepage == term->ucsdata->line_codepage) return (uc != ' '); if (uc < 0x80)