Implementing line drawing right.

This commit is contained in:
Christoph Lohmann 2012-09-26 20:21:08 +02:00
parent c3b0e2202b
commit 3a095984b0
2 changed files with 36 additions and 24 deletions

View file

@ -79,14 +79,6 @@ static Key key[] = {
/* Set TERM to this */ /* Set TERM to this */
#define TNAME "st-256color" #define TNAME "st-256color"
/* Line drawing characters (sometime specific to each font...) */
static char gfx[] = {
['f'] = 'o',
['g'] = '+',
['i'] = '#',
[255] = 0,
};
/* double-click timeout (in milliseconds) between clicks for selection */ /* double-click timeout (in milliseconds) between clicks for selection */
#define DOUBLECLICK_TIMEOUT 300 #define DOUBLECLICK_TIMEOUT 300
#define TRIPLECLICK_TIMEOUT (2*DOUBLECLICK_TIMEOUT) #define TRIPLECLICK_TIMEOUT (2*DOUBLECLICK_TIMEOUT)

52
st.c
View file

@ -1094,6 +1094,27 @@ tmoveto(int x, int y) {
void void
tsetchar(char *c) { 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.dirty[term.c.y] = 1;
term.line[term.c.y][term.c.x] = term.c.attr; term.line[term.c.y][term.c.x] = term.c.attr;
memcpy(term.line[term.c.y][term.c.x].c, c, UTF_SIZ); 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]) { switch(attr[i]) {
case 0: case 0:
term.c.attr.mode &= ~(ATTR_REVERSE | ATTR_UNDERLINE | ATTR_BOLD \ 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.fg = DefaultFG;
term.c.attr.bg = DefaultBG; term.c.attr.bg = DefaultBG;
break; break;
@ -1676,12 +1697,18 @@ tputc(char *c, int len) {
strhandle(); strhandle();
} else if(term.esc & ESC_ALTCHARSET) { } else if(term.esc & ESC_ALTCHARSET) {
switch(ascii) { switch(ascii) {
case '0': /* Line drawing crap */ case '0': /* Line drawing set */
term.c.attr.mode |= ATTR_GFX; term.c.attr.mode |= ATTR_GFX;
break; break;
case 'B': /* Back to regular text */ case 'B': /* USASCII */
term.c.attr.mode &= ~ATTR_GFX; term.c.attr.mode &= ~ATTR_GFX;
break; break;
case 'A': /* UK (IGNORED) */
case '<': /* multinational charset (IGNORED) */
case '5': /* Finnish (IGNORED) */
case 'C': /* Finnish (IGNORED) */
case 'K': /* German (IGNORED) */
break;
default: default:
fprintf(stderr, "esc unhandled charset: ESC ( %c\n", ascii); fprintf(stderr, "esc unhandled charset: ESC ( %c\n", ascii);
} }
@ -1700,10 +1727,14 @@ tputc(char *c, int len) {
strescseq.type = ascii; strescseq.type = ascii;
term.esc |= ESC_STR; term.esc |= ESC_STR;
break; break;
case ')': case '(': /* set primary charset G0 */
case '(':
term.esc |= ESC_ALTCHARSET; term.esc |= ESC_ALTCHARSET;
break; 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 */ case 'D': /* IND -- Linefeed */
if(term.c.y == term.bot) if(term.c.y == term.bot)
tscrollup(term.top, 1); 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; int winx = BORDER+x*xw.cw, winy = BORDER+y*xw.ch + dc.font.ascent, width = charlen*xw.cw;
Font *font = &dc.font; Font *font = &dc.font;
XGlyphInfo extents; XGlyphInfo extents;
int i;
/* only switch default fg/bg if term is in RV mode */ /* only switch default fg/bg if term is in RV mode */
if(IS_SET(MODE_REVERSE)) { 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]); XSetBackground(xw.dpy, dc.gc, dc.col[bg]);
XSetForeground(xw.dpy, dc.gc, dc.col[fg]); 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); XftTextExtentsUtf8(xw.dpy, font->xft_set, (FcChar8 *)s, bytelen, &extents);
width = extents.xOff; width = extents.xOff;
XftDrawRect(xw.xft_draw, &dc.xft_col[bg], winx, winy - font->ascent, width, xw.ch); XftDrawRect(xw.xft_draw, &dc.xft_col[bg], winx, winy - font->ascent, width, xw.ch);