/* See if host is of the form user@host */
if (cfg.host[0] != '\0') {
- char *atsign = strchr(cfg.host, '@');
+ char *atsign = strrchr(cfg.host, '@');
/* Make sure we're not overflowing the user field */
if (atsign) {
if (atsign - cfg.host < sizeof cfg.username) {
InsertMenu(popup_menus[j].menu,
popup_menus[j].specials_submenu_pos,
MF_BYPOSITION | MF_POPUP | MF_ENABLED,
- (UINT) p, "Special Command");
+ (UINT) p, "S&pecial Command");
}
}
}
mi.rcMonitor.top == pt.y) {
mouse_on_hotspot = 1;
}
- CloseHandle(mon);
}
}
#else
*
* We are allowed to fiddle with the contents of `text'.
*/
-void do_text(Context ctx, int x, int y, char *text, int len,
+void do_text(Context ctx, int x, int y, wchar_t *text, int len,
unsigned long attr, int lattr)
{
COLORREF fg, bg, t;
HDC hdc = ctx;
RECT line_box;
int force_manual_underline = 0;
- int fnt_width = font_width * (1 + (lattr != LATTR_NORM));
- int char_width = fnt_width;
+ int fnt_width, char_width;
int text_adjust = 0;
static int *IpDx = 0, IpDxLEN = 0;
+ lattr &= LATTR_MODE;
+
+ char_width = fnt_width = font_width * (1 + (lattr != LATTR_NORM));
+
if (attr & ATTR_WIDE)
char_width *= 2;
nfont |= FONT_NARROW;
/* Special hack for the VT100 linedraw glyphs. */
- if ((attr & CSET_MASK) == 0x2300) {
- if (text[0] >= (char) 0xBA && text[0] <= (char) 0xBD) {
- switch ((unsigned char) (text[0])) {
- case 0xBA:
- text_adjust = -2 * font_height / 5;
- break;
- case 0xBB:
- text_adjust = -1 * font_height / 5;
- break;
- case 0xBC:
- text_adjust = font_height / 5;
- break;
- case 0xBD:
- text_adjust = 2 * font_height / 5;
- break;
- }
- if (lattr == LATTR_TOP || lattr == LATTR_BOT)
- text_adjust *= 2;
- attr &= ~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;
- }
+ if (text[0] >= 0x23BA && text[0] <= 0x23BD) {
+ switch ((unsigned char) (text[0])) {
+ case 0xBA:
+ text_adjust = -2 * font_height / 5;
+ break;
+ case 0xBB:
+ text_adjust = -1 * font_height / 5;
+ break;
+ case 0xBC:
+ text_adjust = font_height / 5;
+ break;
+ case 0xBD:
+ text_adjust = 2 * font_height / 5;
+ break;
+ }
+ if (lattr == LATTR_TOP || lattr == LATTR_BOT)
+ text_adjust *= 2;
+ text[0] = ucsdata.unitab_xterm['q'];
+ if (attr & ATTR_UNDER) {
+ attr &= ~ATTR_UNDER;
+ force_manual_underline = 1;
}
}
/* Anything left as an original character set is unprintable. */
- if (DIRECT_CHAR(attr)) {
- attr &= ~CSET_MASK;
- attr |= 0xFF00;
- memset(text, 0xFD, len);
+ if (DIRECT_CHAR(text[0])) {
+ int i;
+ for (i = 0; i < len; i++)
+ text[i] = 0xFFFD;
}
/* OEM CP */
- if ((attr & CSET_MASK) == ATTR_OEMCP)
+ if ((text[0] & CSET_MASK) == CSET_OEMCP)
nfont |= FONT_OEM;
nfg = ((attr & ATTR_FGMASK) >> ATTR_FGSHIFT);
line_box.right = font_width*term->cols+offset_width;
/* We're using a private area for direct to font. (512 chars.) */
- if (ucsdata.dbcs_screenfont && (attr & CSET_MASK) == ATTR_ACP) {
+ if (ucsdata.dbcs_screenfont && (text[0] & CSET_MASK) == CSET_ACP) {
/* Ho Hum, dbcs fonts are a PITA! */
/* To display on W9x I have to convert to UCS */
static wchar_t *uni_buf = 0;
for(nlen = mptr = 0; mptr<len; mptr++) {
uni_buf[nlen] = 0xFFFD;
if (IsDBCSLeadByteEx(ucsdata.font_codepage, (BYTE) text[mptr])) {
+ char dbcstext[2];
+ dbcstext[0] = text[mptr] & 0xFF;
+ dbcstext[1] = text[mptr+1] & 0xFF;
IpDx[nlen] += char_width;
MultiByteToWideChar(ucsdata.font_codepage, MB_USEGLYPHCHARS,
- text+mptr, 2, uni_buf+nlen, 1);
+ dbcstext, 2, uni_buf+nlen, 1);
mptr++;
}
else
{
+ char dbcstext[1];
+ dbcstext[0] = text[mptr] & 0xFF;
MultiByteToWideChar(ucsdata.font_codepage, MB_USEGLYPHCHARS,
- text+mptr, 1, uni_buf+nlen, 1);
+ dbcstext, 1, uni_buf+nlen, 1);
}
nlen++;
}
}
IpDx[0] = -1;
- } else if (DIRECT_FONT(attr)) {
+ } else if (DIRECT_FONT(text[0])) {
+ static char *directbuf = NULL;
+ static int directlen = 0;
+ int i;
+ if (len > directlen) {
+ directlen = len;
+ directbuf = sresize(directbuf, directlen, char);
+ }
+
+ for (i = 0; i < len; i++)
+ directbuf[i] = text[i] & 0xFF;
+
ExtTextOut(hdc, x,
y - font_height * (lattr == LATTR_BOT) + text_adjust,
- ETO_CLIPPED | ETO_OPAQUE, &line_box, text, len, IpDx);
+ ETO_CLIPPED | ETO_OPAQUE, &line_box, directbuf, len, IpDx);
if (bold_mode == BOLD_SHADOW && (attr & ATTR_BOLD)) {
SetBkMode(hdc, TRANSPARENT);
ExtTextOut(hdc, x - 1,
y - font_height * (lattr ==
LATTR_BOT) + text_adjust,
- ETO_CLIPPED, &line_box, text, len, IpDx);
+ ETO_CLIPPED, &line_box, directbuf, len, IpDx);
}
} else {
/* And 'normal' unicode characters */
wbuf = snewn(wlen, WCHAR);
}
for (i = 0; i < len; i++)
- wbuf[i] = (WCHAR) ((attr & CSET_MASK) + (text[i] & CHAR_MASK));
+ wbuf[i] = text[i];
/* print Glyphs as they are, without Windows' Shaping*/
exact_textout(hdc, x, y - font_height * (lattr == LATTR_BOT) + text_adjust,
}
}
-void do_cursor(Context ctx, int x, int y, char *text, int len,
+void do_cursor(Context ctx, int x, int y, wchar_t *text, int len,
unsigned long attr, int lattr)
{
int ctype = cfg.cursor_type;
if ((attr & TATTR_ACTCURS) && (ctype == 0 || term->big_cursor)) {
- if (((attr & CSET_MASK) | (unsigned char) *text) != UCSWIDE) {
+ if (*text != UCSWIDE) {
do_text(ctx, x, y, text, len, attr, lattr);
return;
}
if (!font_dualwidth) return 1;
switch (uc & CSET_MASK) {
- case ATTR_ASCII:
+ case CSET_ASCII:
uc = ucsdata.unitab_line[uc & 0xFF];
break;
- case ATTR_LINEDRW:
+ case CSET_LINEDRW:
uc = ucsdata.unitab_xterm[uc & 0xFF];
break;
- case ATTR_SCOACS:
+ case CSET_SCOACS:
uc = ucsdata.unitab_scoacs[uc & 0xFF];
break;
}
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)<= '~')
+ if ((uc&~CSET_MASK) >= ' ' && (uc&~CSET_MASK)<= '~')
return 1;
- if ( (uc & CSET_MASK) == ATTR_ACP ) {
+ if ( (uc & CSET_MASK) == CSET_ACP ) {
SelectObject(hdc, fonts[FONT_NORMAL]);
- } else if ( (uc & CSET_MASK) == ATTR_OEMCP ) {
+ } else if ( (uc & CSET_MASK) == CSET_OEMCP ) {
another_font(FONT_OEM);
if (!fonts[FONT_OEM]) return 0;
} else
return 0;
- if ( GetCharWidth32(hdc, uc&CHAR_MASK, uc&CHAR_MASK, &ibuf) != 1 &&
- GetCharWidth(hdc, uc&CHAR_MASK, uc&CHAR_MASK, &ibuf) != 1)
+ if ( GetCharWidth32(hdc, uc&~CSET_MASK, uc&~CSET_MASK, &ibuf) != 1 &&
+ GetCharWidth(hdc, uc&~CSET_MASK, uc&~CSET_MASK, &ibuf) != 1)
return 0;
} else {
/* Speedup, I know of no font where ascii is the wrong width */