|
|
@ -1094,6 +1094,27 @@ tmoveto(int x, int y) { |
|
|
|
|
|
|
|
void |
|
|
|
tsetchar(char *c) { |
|
|
|
/* |
|
|
|
* The table is proudly stolen from rxvt. |
|
|
|
*/ |
|
|
|
if(term.c.attr.mode & ATTR_GFX) { |
|
|
|
char *vt100_0[62] = { /* 0x41 - 0x7e */ |
|
|
|
"↑", "↓", "→", "←", "█", "▚", "☃", /* A - G */ |
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, /* H - O */ |
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, /* P - W */ |
|
|
|
0, 0, 0, 0, 0, 0, 0, " ", /* X - _ */ |
|
|
|
"◆", "▒", "␉", "␌", "␍", "␊", "°", "±", /* ` - g */ |
|
|
|
"", "␋", "┘", "┐", "┌", "└", "┼", "⎺", /* h - o */ |
|
|
|
"⎻", "─", "⎼", "⎽", "├", "┤", "┴", "┬", /* p - w */ |
|
|
|
"│", "≤", "≥", "π", "≠", "£", "·", /* x - ~ */ |
|
|
|
}; |
|
|
|
|
|
|
|
if(c[0] >= 0x41 && c[0] <= 0x7e |
|
|
|
&& vt100_0[c[0] - 0x41]) { |
|
|
|
c = vt100_0[c[0] - 0x41]; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
term.dirty[term.c.y] = 1; |
|
|
|
term.line[term.c.y][term.c.x] = term.c.attr; |
|
|
|
memcpy(term.line[term.c.y][term.c.x].c, c, UTF_SIZ); |
|
|
@ -1177,7 +1198,7 @@ tsetattr(int *attr, int l) { |
|
|
|
switch(attr[i]) { |
|
|
|
case 0: |
|
|
|
term.c.attr.mode &= ~(ATTR_REVERSE | ATTR_UNDERLINE | ATTR_BOLD \ |
|
|
|
| ATTR_ITALIC | ATTR_BLINK | ATTR_GFX); |
|
|
|
| ATTR_ITALIC | ATTR_BLINK); |
|
|
|
term.c.attr.fg = DefaultFG; |
|
|
|
term.c.attr.bg = DefaultBG; |
|
|
|
break; |
|
|
@ -1676,12 +1697,18 @@ tputc(char *c, int len) { |
|
|
|
strhandle(); |
|
|
|
} else if(term.esc & ESC_ALTCHARSET) { |
|
|
|
switch(ascii) { |
|
|
|
case '0': /* Line drawing crap */ |
|
|
|
case '0': /* Line drawing set */ |
|
|
|
term.c.attr.mode |= ATTR_GFX; |
|
|
|
break; |
|
|
|
case 'B': /* Back to regular text */ |
|
|
|
case 'B': /* USASCII */ |
|
|
|
term.c.attr.mode &= ~ATTR_GFX; |
|
|
|
break; |
|
|
|
case 'A': /* UK (IGNORED) */ |
|
|
|
case '<': /* multinational charset (IGNORED) */ |
|
|
|
case '5': /* Finnish (IGNORED) */ |
|
|
|
case 'C': /* Finnish (IGNORED) */ |
|
|
|
case 'K': /* German (IGNORED) */ |
|
|
|
break; |
|
|
|
default: |
|
|
|
fprintf(stderr, "esc unhandled charset: ESC ( %c\n", ascii); |
|
|
|
} |
|
|
@ -1700,10 +1727,14 @@ tputc(char *c, int len) { |
|
|
|
strescseq.type = ascii; |
|
|
|
term.esc |= ESC_STR; |
|
|
|
break; |
|
|
|
case ')': |
|
|
|
case '(': |
|
|
|
case '(': /* set primary charset G0 */ |
|
|
|
term.esc |= ESC_ALTCHARSET; |
|
|
|
break; |
|
|
|
case ')': /* set secondary charset G1 (IGNORED) */ |
|
|
|
case '*': /* set tertiary charset G2 (IGNORED) */ |
|
|
|
case '+': /* set quaternary charset G3 (IGNORED) */ |
|
|
|
term.esc = 0; |
|
|
|
break; |
|
|
|
case 'D': /* IND -- Linefeed */ |
|
|
|
if(term.c.y == term.bot) |
|
|
|
tscrollup(term.top, 1); |
|
|
@ -2067,7 +2098,6 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { |
|
|
|
int winx = BORDER+x*xw.cw, winy = BORDER+y*xw.ch + dc.font.ascent, width = charlen*xw.cw; |
|
|
|
Font *font = &dc.font; |
|
|
|
XGlyphInfo extents; |
|
|
|
int i; |
|
|
|
|
|
|
|
/* only switch default fg/bg if term is in RV mode */ |
|
|
|
if(IS_SET(MODE_REVERSE)) { |
|
|
@ -2093,16 +2123,6 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { |
|
|
|
XSetBackground(xw.dpy, dc.gc, dc.col[bg]); |
|
|
|
XSetForeground(xw.dpy, dc.gc, dc.col[fg]); |
|
|
|
|
|
|
|
if(base.mode & ATTR_GFX) { |
|
|
|
for(i = 0; i < bytelen; i++) { |
|
|
|
char c = gfx[(uint)s[i] % 256]; |
|
|
|
if(c) |
|
|
|
s[i] = c; |
|
|
|
else if(s[i] > 0x5f) |
|
|
|
s[i] -= 0x5f; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
XftTextExtentsUtf8(xw.dpy, font->xft_set, (FcChar8 *)s, bytelen, &extents); |
|
|
|
width = extents.xOff; |
|
|
|
XftDrawRect(xw.xft_draw, &dc.xft_col[bg], winx, winy - font->ascent, width, xw.ch); |
|
|
|