X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/14ce98878d96729b687fdd3cd734081eb0ef37c6..806c9d94341c912a45e563d87ad36d63966a4308:/windows/window.c diff --git a/windows/window.c b/windows/window.c index f47fb478..c8c2b56d 100644 --- a/windows/window.c +++ b/windows/window.c @@ -311,6 +311,15 @@ static void close_session(void) InsertMenu(popup_menus[i].menu, IDM_DUPSESS, MF_BYCOMMAND | MF_ENABLED, IDM_RESTART, "&Restart Session"); } + + /* + * Unset the 'must_close_session' flag, or else we'll come + * straight back here the next time we go round the main message + * loop - which, worse still, will be immediately (without + * blocking) because we've just triggered a WM_SETTEXT by the + * window title change above. + */ + must_close_session = FALSE; } int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) @@ -1282,15 +1291,7 @@ static void general_textout(HDC hdc, int x, int y, CONST RECT *lprc, CONST INT *lpDx, int opaque) { int i, j, xp, xn; - RECT newrc; - -#ifdef FIXME_REMOVE_BEFORE_CHECKIN -int k; -debug(("general_textout: %d,%d", x, y)); -for(k=0;kleft, lprc->top, lprc->right, lprc->bottom)); -debug(("\n")); -#endif + int bkmode = 0, got_bkmode = FALSE; xp = xn = x; @@ -1311,44 +1312,25 @@ debug(("\n")); * function. */ if (rtl) { - newrc.left = lprc->left + xp - x; - newrc.right = lprc->left + xn - x; - newrc.top = lprc->top; - newrc.bottom = lprc->bottom; -#ifdef FIXME_REMOVE_BEFORE_CHECKIN -{ -int k; -debug((" exact_textout: %d,%d", xp, y)); -for(k=0;kleft + xp - x; - newrc.right = lprc->left + xn - x; - newrc.top = lprc->top; - newrc.bottom = lprc->bottom; ExtTextOutW(hdc, xp, y, ETO_CLIPPED | (opaque ? ETO_OPAQUE : 0), - &newrc, lpString+i, j-i, lpDx+i); + lprc, lpString+i, j-i, + font_varpitch ? NULL : lpDx+i); } i = j; xp = xn; + + bkmode = GetBkMode(hdc); + got_bkmode = TRUE; + SetBkMode(hdc, TRANSPARENT); + opaque = FALSE; } -#ifdef FIXME_REMOVE_BEFORE_CHECKIN -debug(("general_textout: done, xn=%d\n", xn)); -#endif - assert(xn - x >= lprc->right - lprc->left); + if (got_bkmode) + SetBkMode(hdc, bkmode); } static int get_font_width(HDC hdc, const TEXTMETRIC *tm) @@ -3237,8 +3219,9 @@ void do_text_internal(Context ctx, int x, int y, wchar_t *text, int len, int text_adjust = 0; int xoffset = 0; int maxlen, remaining, opaque; - static int *IpDx = 0, IpDxLEN = 0; - int *IpDxReal; + static int *lpDx = NULL; + static int lpDx_len = 0; + int *lpDx_maybe; lattr &= LATTR_MODE; @@ -3247,17 +3230,6 @@ void do_text_internal(Context ctx, int x, int y, wchar_t *text, int len, if (attr & ATTR_WIDE) char_width *= 2; - if (len > IpDxLEN || IpDx[0] != char_width) { - int i; - if (len > IpDxLEN) { - sfree(IpDx); - IpDx = snewn(len + 16, int); - IpDxLEN = (len + 16); - } - for (i = 0; i < IpDxLEN; i++) - IpDx[i] = char_width; - } - /* Only want the left half of double width lines */ if (lattr != LATTR_NORM && x*2 >= term->cols) return; @@ -3383,12 +3355,12 @@ void do_text_internal(Context ctx, int x, int y, wchar_t *text, int len, * If we're using a variable-pitch font, we unconditionally * draw the glyphs one at a time and centre them in their * character cells (which means in particular that we must - * disable the IpDx mechanism). This gives slightly odd but + * disable the lpDx mechanism). This gives slightly odd but * generally reasonable results. */ xoffset = char_width / 2; SetTextAlign(hdc, TA_TOP | TA_CENTER | TA_NOUPDATECP); - IpDxReal = NULL; + lpDx_maybe = NULL; maxlen = 1; } else { /* @@ -3397,7 +3369,7 @@ void do_text_internal(Context ctx, int x, int y, wchar_t *text, int len, */ xoffset = 0; SetTextAlign(hdc, TA_TOP | TA_LEFT | TA_NOUPDATECP); - IpDxReal = IpDx; + lpDx_maybe = lpDx; maxlen = len; } @@ -3406,6 +3378,18 @@ void do_text_internal(Context ctx, int x, int y, wchar_t *text, int len, text += len, remaining -= len, x += char_width * len) { len = (maxlen < remaining ? maxlen : remaining); + if (len > lpDx_len) { + if (len > lpDx_len) { + lpDx_len = len * 9 / 8 + 16; + lpDx = sresize(lpDx, lpDx_len, int); + } + } + { + int i; + for (i = 0; i < len; i++) + lpDx[i] = char_width; + } + /* We're using a private area for direct to font. (512 chars.) */ if (ucsdata.dbcs_screenfont && (text[0] & CSET_MASK) == CSET_ACP) { /* Ho Hum, dbcs fonts are a PITA! */ @@ -3426,7 +3410,7 @@ void do_text_internal(Context ctx, int x, int y, wchar_t *text, int len, char dbcstext[2]; dbcstext[0] = text[mptr] & 0xFF; dbcstext[1] = text[mptr+1] & 0xFF; - IpDx[nlen] += char_width; + lpDx[nlen] += char_width; MultiByteToWideChar(ucsdata.font_codepage, MB_USEGLYPHCHARS, dbcstext, 2, uni_buf+nlen, 1); mptr++; @@ -3447,16 +3431,16 @@ void do_text_internal(Context ctx, int x, int y, wchar_t *text, int len, y - font_height * (lattr == LATTR_BOT) + text_adjust, ETO_CLIPPED | (opaque ? ETO_OPAQUE : 0), &line_box, uni_buf, nlen, - IpDxReal); + lpDx_maybe); if (bold_mode == BOLD_SHADOW && (attr & ATTR_BOLD)) { SetBkMode(hdc, TRANSPARENT); ExtTextOutW(hdc, x + xoffset - 1, y - font_height * (lattr == LATTR_BOT) + text_adjust, - ETO_CLIPPED, &line_box, uni_buf, nlen, IpDxReal); + ETO_CLIPPED, &line_box, uni_buf, nlen, lpDx_maybe); } - IpDx[0] = -1; + lpDx[0] = -1; } else if (DIRECT_FONT(text[0])) { static char *directbuf = NULL; static int directlen = 0; @@ -3472,7 +3456,7 @@ void do_text_internal(Context ctx, int x, int y, wchar_t *text, int len, ExtTextOut(hdc, x + xoffset, y - font_height * (lattr == LATTR_BOT) + text_adjust, ETO_CLIPPED | (opaque ? ETO_OPAQUE : 0), - &line_box, directbuf, len, IpDxReal); + &line_box, directbuf, len, lpDx_maybe); if (bold_mode == BOLD_SHADOW && (attr & ATTR_BOLD)) { SetBkMode(hdc, TRANSPARENT); @@ -3488,7 +3472,7 @@ void do_text_internal(Context ctx, int x, int y, wchar_t *text, int len, ExtTextOut(hdc, x + xoffset - 1, y - font_height * (lattr == LATTR_BOT) + text_adjust, - ETO_CLIPPED, &line_box, directbuf, len, IpDxReal); + ETO_CLIPPED, &line_box, directbuf, len, lpDx_maybe); } } else { /* And 'normal' unicode characters */ @@ -3508,7 +3492,7 @@ void do_text_internal(Context ctx, int x, int y, wchar_t *text, int len, /* print Glyphs as they are, without Windows' Shaping*/ general_textout(hdc, x + xoffset, y - font_height * (lattr==LATTR_BOT) + text_adjust, - &line_box, wbuf, len, IpDxReal, + &line_box, wbuf, len, lpDx, opaque && !(attr & TATTR_COMBINING)); /* And the shadow bold hack. */ @@ -3517,7 +3501,7 @@ void do_text_internal(Context ctx, int x, int y, wchar_t *text, int len, ExtTextOutW(hdc, x + xoffset - 1, y - font_height * (lattr == LATTR_BOT) + text_adjust, - ETO_CLIPPED, &line_box, wbuf, len, IpDxReal); + ETO_CLIPPED, &line_box, wbuf, len, lpDx_maybe); } }