aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAurélien Aptel <aurelien.aptel@gmail.com>2011-06-08 12:40:35 +0200
committerAurélien Aptel <aurelien.aptel@gmail.com>2011-06-08 12:40:35 +0200
commit2edb412b6bb482de554e490fd2839da551b4f310 (patch)
tree3e90d6af20a5b8f7a8a577ea13f3e5a463a3bddf
parentbf6a11a4820e29d273a1608d1955f576549ced74 (diff)
downloadst-patched-2edb412b6bb482de554e490fd2839da551b4f310.tar.bz2
st-patched-2edb412b6bb482de554e490fd2839da551b4f310.tar.xz
st-patched-2edb412b6bb482de554e490fd2839da551b4f310.zip
reverse video mode. (thx Bert Münnich)
-rw-r--r--st.c31
-rw-r--r--st.info1
2 files changed, 24 insertions, 8 deletions
diff --git a/st.c b/st.c
index 1d01925..a4aca51 100644
--- a/st.c
+++ b/st.c
@@ -64,7 +64,7 @@ enum { CURSOR_UP, CURSOR_DOWN, CURSOR_LEFT, CURSOR_RIGHT,
64enum { CURSOR_DEFAULT = 0, CURSOR_HIDE = 1, CURSOR_WRAPNEXT = 2 }; 64enum { CURSOR_DEFAULT = 0, CURSOR_HIDE = 1, CURSOR_WRAPNEXT = 2 };
65enum { GLYPH_SET=1, GLYPH_DIRTY=2 }; 65enum { GLYPH_SET=1, GLYPH_DIRTY=2 };
66enum { MODE_WRAP=1, MODE_INSERT=2, MODE_APPKEYPAD=4, MODE_ALTSCREEN=8, 66enum { 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 };
68enum { ESC_START=1, ESC_CSI=2, ESC_OSC=4, ESC_TITLE=8, ESC_ALTCHARSET=16 }; 68enum { ESC_START=1, ESC_CSI=2, ESC_OSC=4, ESC_TITLE=8, ESC_ALTCHARSET=16 };
69enum { WIN_VISIBLE=1, WIN_REDRAW=2, WIN_FOCUSED=4 }; 69enum { 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
1509void 1516void
1510xclear(int x1, int y1, int x2, int y2) { 1517xclear(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
1641void 1648void
1642xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { 1649xdraws(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 }
diff --git a/st.info b/st.info
index 1cc6349..489908f 100644
--- a/st.info
+++ b/st.info
@@ -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,