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 | 2edb412b6bb482de554e490fd2839da551b4f310 (patch) | |
tree | 3e90d6af20a5b8f7a8a577ea13f3e5a463a3bddf | |
parent | bf6a11a4820e29d273a1608d1955f576549ced74 (diff) | |
download | st-patched-2edb412b6bb482de554e490fd2839da551b4f310.tar.bz2 st-patched-2edb412b6bb482de554e490fd2839da551b4f310.tar.xz st-patched-2edb412b6bb482de554e490fd2839da551b4f310.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, |