diff options
| author | Aurélien Aptel <aurelien.aptel@gmail.com> | 2011-06-08 12:40:35 +0200 |
|---|---|---|
| committer | Aurélien Aptel <aurelien.aptel@gmail.com> | 2011-06-08 12:40:35 +0200 |
| commit | d59f92d6f19a4a914ba99168fdc42d1783eee1ba (patch) | |
| tree | 3e90d6af20a5b8f7a8a577ea13f3e5a463a3bddf | |
| parent | b2db58c2a05168257ee4e4b941f0533c6dde2a10 (diff) | |
| download | st-d59f92d6f19a4a914ba99168fdc42d1783eee1ba.tar.gz st-d59f92d6f19a4a914ba99168fdc42d1783eee1ba.zip | |
reverse video mode. (thx Bert Münnich)
| -rw-r--r-- | st.c | 31 | ||||
| -rw-r--r-- | st.info | 1 |
2 files changed, 24 insertions, 8 deletions
| @@ -64,7 +64,7 @@ enum { CURSOR_UP, CURSOR_DOWN, CURSOR_LEFT, CURSOR_RIGHT, | |||
| 64 | enum { CURSOR_DEFAULT = 0, CURSOR_HIDE = 1, CURSOR_WRAPNEXT = 2 }; | 64 | enum { CURSOR_DEFAULT = 0, CURSOR_HIDE = 1, CURSOR_WRAPNEXT = 2 }; |
| 65 | enum { GLYPH_SET=1, GLYPH_DIRTY=2 }; | 65 | enum { GLYPH_SET=1, GLYPH_DIRTY=2 }; |
| 66 | enum { MODE_WRAP=1, MODE_INSERT=2, MODE_APPKEYPAD=4, MODE_ALTSCREEN=8, | 66 | enum { MODE_WRAP=1, MODE_INSERT=2, MODE_APPKEYPAD=4, MODE_ALTSCREEN=8, |
| 67 | MODE_CRLF=16, MODE_MOUSE=32 }; | 67 | MODE_CRLF=16, MODE_MOUSE=32, MODE_REVERSE=64 }; |
| 68 | enum { ESC_START=1, ESC_CSI=2, ESC_OSC=4, ESC_TITLE=8, ESC_ALTCHARSET=16 }; | 68 | enum { ESC_START=1, ESC_CSI=2, ESC_OSC=4, ESC_TITLE=8, ESC_ALTCHARSET=16 }; |
| 69 | enum { WIN_VISIBLE=1, WIN_REDRAW=2, WIN_FOCUSED=4 }; | 69 | enum { WIN_VISIBLE=1, WIN_REDRAW=2, WIN_FOCUSED=4 }; |
| 70 | 70 | ||
| @@ -1103,7 +1103,11 @@ csihandle(void) { | |||
| 1103 | case 1: | 1103 | case 1: |
| 1104 | term.mode &= ~MODE_APPKEYPAD; | 1104 | term.mode &= ~MODE_APPKEYPAD; |
| 1105 | break; | 1105 | break; |
| 1106 | case 5: /* TODO: DECSCNM -- Remove reverse video */ | 1106 | case 5: /* DECSCNM -- Remove reverse video */ |
| 1107 | if(IS_SET(MODE_REVERSE)) { | ||
| 1108 | term.mode &= ~MODE_REVERSE; | ||
| 1109 | draw(); | ||
| 1110 | } | ||
| 1107 | break; | 1111 | break; |
| 1108 | case 7: | 1112 | case 7: |
| 1109 | term.mode &= ~MODE_WRAP; | 1113 | term.mode &= ~MODE_WRAP; |
| @@ -1167,7 +1171,10 @@ csihandle(void) { | |||
| 1167 | term.mode |= MODE_APPKEYPAD; | 1171 | term.mode |= MODE_APPKEYPAD; |
| 1168 | break; | 1172 | break; |
| 1169 | case 5: /* DECSCNM -- Reverve video */ | 1173 | case 5: /* DECSCNM -- Reverve video */ |
| 1170 | /* TODO: set REVERSE on the whole screen (f) */ | 1174 | if(!IS_SET(MODE_REVERSE)) { |
| 1175 | term.mode |= MODE_REVERSE; | ||
| 1176 | draw(); | ||
| 1177 | } | ||
| 1171 | break; | 1178 | break; |
| 1172 | case 7: | 1179 | case 7: |
| 1173 | term.mode |= MODE_WRAP; | 1180 | term.mode |= MODE_WRAP; |
| @@ -1508,7 +1515,7 @@ xloadcols(void) { | |||
| 1508 | 1515 | ||
| 1509 | void | 1516 | void |
| 1510 | xclear(int x1, int y1, int x2, int y2) { | 1517 | xclear(int x1, int y1, int x2, int y2) { |
| 1511 | XSetForeground(xw.dpy, dc.gc, dc.col[DefaultBG]); | 1518 | XSetForeground(xw.dpy, dc.gc, dc.col[IS_SET(MODE_REVERSE) ? DefaultFG : DefaultBG]); |
| 1512 | XFillRectangle(xw.dpy, xw.buf, dc.gc, | 1519 | XFillRectangle(xw.dpy, xw.buf, dc.gc, |
| 1513 | x1 * xw.cw, y1 * xw.ch, | 1520 | x1 * xw.cw, y1 * xw.ch, |
| 1514 | (x2-x1+1) * xw.cw, (y2-y1+1) * xw.ch); | 1521 | (x2-x1+1) * xw.cw, (y2-y1+1) * xw.ch); |
| @@ -1640,14 +1647,20 @@ xinit(void) { | |||
| 1640 | 1647 | ||
| 1641 | void | 1648 | void |
| 1642 | xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { | 1649 | xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { |
| 1643 | unsigned long xfg, xbg; | 1650 | unsigned long xfg = dc.col[base.fg], xbg = dc.col[base.bg], temp; |
| 1644 | int winx = x*xw.cw, winy = y*xw.ch + dc.font.ascent, width = charlen*xw.cw; | 1651 | int winx = x*xw.cw, winy = y*xw.ch + dc.font.ascent, width = charlen*xw.cw; |
| 1645 | int i; | 1652 | int i; |
| 1653 | |||
| 1654 | /* only switch default fg/bg if term is in RV mode */ | ||
| 1655 | if(IS_SET(MODE_REVERSE)) { | ||
| 1656 | if(base.fg == DefaultFG) | ||
| 1657 | xfg = dc.col[DefaultBG]; | ||
| 1658 | if(base.bg == DefaultBG) | ||
| 1659 | xbg = dc.col[DefaultFG]; | ||
| 1660 | } | ||
| 1646 | 1661 | ||
| 1647 | if(base.mode & ATTR_REVERSE) | 1662 | if(base.mode & ATTR_REVERSE) |
| 1648 | xfg = dc.col[base.bg], xbg = dc.col[base.fg]; | 1663 | temp = xfg, xfg = xbg, xbg = temp; |
| 1649 | else | ||
| 1650 | xfg = dc.col[base.fg], xbg = dc.col[base.bg]; | ||
| 1651 | 1664 | ||
| 1652 | XSetBackground(xw.dpy, dc.gc, xbg); | 1665 | XSetBackground(xw.dpy, dc.gc, xbg); |
| 1653 | XSetForeground(xw.dpy, dc.gc, xfg); | 1666 | XSetForeground(xw.dpy, dc.gc, xfg); |
| @@ -1692,6 +1705,8 @@ xdrawcursor(void) { | |||
| 1692 | /* draw the new one */ | 1705 | /* draw the new one */ |
| 1693 | if(!(term.c.state & CURSOR_HIDE) && (xw.state & WIN_FOCUSED)) { | 1706 | if(!(term.c.state & CURSOR_HIDE) && (xw.state & WIN_FOCUSED)) { |
| 1694 | sl = utf8size(g.c); | 1707 | sl = utf8size(g.c); |
| 1708 | if(IS_SET(MODE_REVERSE)) | ||
| 1709 | g.mode |= ATTR_REVERSE, g.fg = DefaultCS, g.bg = DefaultFG; | ||
| 1695 | xdraws(g.c, g, term.c.x, term.c.y, 1, sl); | 1710 | xdraws(g.c, g, term.c.x, term.c.y, 1, sl); |
| 1696 | oldx = term.c.x, oldy = term.c.y; | 1711 | oldx = term.c.x, oldy = term.c.y; |
| 1697 | } | 1712 | } |
| @@ -33,6 +33,7 @@ st| simpleterm, | |||
| 33 | ed=\E[J, | 33 | ed=\E[J, |
| 34 | el=\E[K, | 34 | el=\E[K, |
| 35 | el1=\E[1K, | 35 | el1=\E[1K, |
| 36 | flash=\E[?5h\E[?5l, | ||
| 36 | fsl=^G, | 37 | fsl=^G, |
| 37 | home=\E[H, | 38 | home=\E[H, |
| 38 | hpa=\E[%i%p1%dG, | 39 | hpa=\E[%i%p1%dG, |
