aboutsummaryrefslogtreecommitdiff
path: root/st.c
diff options
context:
space:
mode:
authorAurélien Aptel <aurelien.aptel@gmail.com>2010-10-16 20:50:29 +0200
committerAurélien Aptel <aurelien.aptel@gmail.com>2010-10-16 20:50:29 +0200
commit6f87a39444166674daa94860d365e72343e0b882 (patch)
tree1e0803ce8693bf63237c7e2ea4da62f634a1d924 /st.c
parentce27e634910e10c470b2dcb2edcd20f05d25343b (diff)
downloadst-6f87a39444166674daa94860d365e72343e0b882.tar.gz
st-6f87a39444166674daa94860d365e72343e0b882.zip
added LNM mode; re-organized kpress() to handle it.
Diffstat (limited to 'st.c')
-rw-r--r--st.c51
1 files changed, 34 insertions, 17 deletions
diff --git a/st.c b/st.c
index 4f17752..16462c7 100644
--- a/st.c
+++ b/st.c
@@ -55,7 +55,8 @@ enum { CURSOR_UP, CURSOR_DOWN, CURSOR_LEFT, CURSOR_RIGHT,
55 CURSOR_SAVE, CURSOR_LOAD }; 55 CURSOR_SAVE, CURSOR_LOAD };
56enum { CURSOR_DEFAULT = 0, CURSOR_HIDE = 1, CURSOR_WRAPNEXT = 2 }; 56enum { CURSOR_DEFAULT = 0, CURSOR_HIDE = 1, CURSOR_WRAPNEXT = 2 };
57enum { GLYPH_SET=1, GLYPH_DIRTY=2 }; 57enum { GLYPH_SET=1, GLYPH_DIRTY=2 };
58enum { MODE_WRAP=1, MODE_INSERT=2, MODE_APPKEYPAD=4, MODE_ALTSCREEN=8 }; 58enum { MODE_WRAP=1, MODE_INSERT=2, MODE_APPKEYPAD=4, MODE_ALTSCREEN=8,
59 MODE_CRLF=16 };
59enum { ESC_START=1, ESC_CSI=2, ESC_OSC=4, ESC_TITLE=8, ESC_ALTCHARSET=16 }; 60enum { ESC_START=1, ESC_CSI=2, ESC_OSC=4, ESC_TITLE=8, ESC_ALTCHARSET=16 };
60enum { SCREEN_UPDATE, SCREEN_REDRAW }; 61enum { SCREEN_UPDATE, SCREEN_REDRAW };
61enum { WIN_VISIBLE=1, WIN_REDRAW=2, WIN_FOCUSED=4 }; 62enum { WIN_VISIBLE=1, WIN_REDRAW=2, WIN_FOCUSED=4 };
@@ -164,7 +165,7 @@ static void tinsertblank(int);
164static void tinsertblankline(int); 165static void tinsertblankline(int);
165static void tmoveto(int, int); 166static void tmoveto(int, int);
166static void tnew(int, int); 167static void tnew(int, int);
167static void tnewline(void); 168static void tnewline(int);
168static void tputtab(void); 169static void tputtab(void);
169static void tputc(char); 170static void tputc(char);
170static void tputs(char*, int); 171static void tputs(char*, int);
@@ -626,14 +627,13 @@ tscrollup(int orig, int n) {
626} 627}
627 628
628void 629void
629tnewline(void) { 630tnewline(int first_col) {
630 int x = term.c.x+1 < term.col ? term.c.x : 0;
631 int y = term.c.y; 631 int y = term.c.y;
632 if(term.c.y == term.bot) 632 if(y == term.bot)
633 tscrollup(term.top, 1); 633 tscrollup(term.top, 1);
634 else 634 else
635 y++; 635 y++;
636 tmoveto(x, y); 636 tmoveto(first_col ? 0 : term.c.x, y);
637} 637}
638 638
639void 639void
@@ -932,6 +932,9 @@ csihandle(void) {
932 break; 932 break;
933 case 12: /* att610 -- Stop blinking cursor (IGNORED) */ 933 case 12: /* att610 -- Stop blinking cursor (IGNORED) */
934 break; 934 break;
935 case 20:
936 term.mode &= ~MODE_CRLF;
937 break;
935 case 25: 938 case 25:
936 term.c.state |= CURSOR_HIDE; 939 term.c.state |= CURSOR_HIDE;
937 break; 940 break;
@@ -988,6 +991,9 @@ csihandle(void) {
988 case 7: 991 case 7:
989 term.mode |= MODE_WRAP; 992 term.mode |= MODE_WRAP;
990 break; 993 break;
994 case 20:
995 term.mode |= MODE_CRLF;
996 break;
991 case 12: /* att610 -- Start blinking cursor (IGNORED) */ 997 case 12: /* att610 -- Start blinking cursor (IGNORED) */
992 /* fallthrough for xterm cvvis = CSI [ ? 12 ; 25 h */ 998 /* fallthrough for xterm cvvis = CSI [ ? 12 ; 25 h */
993 if(escseq.narg > 1 && escseq.arg[1] != 25) 999 if(escseq.narg > 1 && escseq.arg[1] != 25)
@@ -1116,7 +1122,7 @@ tputc(char c) {
1116 term.esc = 0; 1122 term.esc = 0;
1117 break; 1123 break;
1118 case 'E': /* NEL -- Next line */ 1124 case 'E': /* NEL -- Next line */
1119 tnewline(); 1125 tnewline(1); /* always go to first col */
1120 term.esc = 0; 1126 term.esc = 0;
1121 break; 1127 break;
1122 case 'M': /* RI -- Reverse index */ 1128 case 'M': /* RI -- Reverse index */
@@ -1163,7 +1169,8 @@ tputc(char c) {
1163 tmoveto(0, term.c.y); 1169 tmoveto(0, term.c.y);
1164 break; 1170 break;
1165 case '\n': 1171 case '\n':
1166 tnewline(); 1172 /* go to first col if the mode is set */
1173 tnewline(IS_SET(MODE_CRLF));
1167 break; 1174 break;
1168 case '\a': 1175 case '\a':
1169 if(!(xw.state & WIN_FOCUSED)) 1176 if(!(xw.state & WIN_FOCUSED))
@@ -1175,7 +1182,7 @@ tputc(char c) {
1175 break; 1182 break;
1176 default: 1183 default:
1177 if(IS_SET(MODE_WRAP) && term.c.state & CURSOR_WRAPNEXT) 1184 if(IS_SET(MODE_WRAP) && term.c.state & CURSOR_WRAPNEXT)
1178 tnewline(); 1185 tnewline(1); /* always go to first col */
1179 tsetchar(c); 1186 tsetchar(c);
1180 if(term.c.x+1 < term.col) 1187 if(term.c.x+1 < term.col)
1181 tmoveto(term.c.x+1, term.c.y); 1188 tmoveto(term.c.x+1, term.c.y);
@@ -1560,15 +1567,12 @@ kpress(XEvent *ev) {
1560 meta = e->state & Mod1Mask; 1567 meta = e->state & Mod1Mask;
1561 shift = e->state & ShiftMask; 1568 shift = e->state & ShiftMask;
1562 len = XmbLookupString(xw.xic, e, buf, sizeof(buf), &ksym, &status); 1569 len = XmbLookupString(xw.xic, e, buf, sizeof(buf), &ksym, &status);
1563 1570
1571 /* 1. custom keys from config.h */
1564 if((customkey = kmap(ksym))) 1572 if((customkey = kmap(ksym)))
1565 ttywrite(customkey, strlen(customkey)); 1573 ttywrite(customkey, strlen(customkey));
1566 else if(len > 0) { 1574 /* 2. hardcoded (overrides X lookup) */
1567 buf[sizeof(buf)-1] = '\0'; 1575 else
1568 if(meta && len == 1)
1569 ttywrite("\033", 1);
1570 ttywrite(buf, len);
1571 } else
1572 switch(ksym) { 1576 switch(ksym) {
1573 case XK_Up: 1577 case XK_Up:
1574 case XK_Down: 1578 case XK_Down:
@@ -1581,8 +1585,21 @@ kpress(XEvent *ev) {
1581 if(shift) 1585 if(shift)
1582 selpaste(); 1586 selpaste();
1583 break; 1587 break;
1588 case XK_Return:
1589 if(IS_SET(MODE_CRLF))
1590 ttywrite("\r\n", 2);
1591 else
1592 ttywrite("\r", 1);
1593 break;
1594 /* 3. X lookup */
1584 default: 1595 default:
1585 fprintf(stderr, "errkey: %d\n", (int)ksym); 1596 if(len > 0) {
1597 buf[sizeof(buf)-1] = '\0';
1598 if(meta && len == 1)
1599 ttywrite("\033", 1);
1600 ttywrite(buf, len);
1601 } else /* 4. nothing to send */
1602 fprintf(stderr, "errkey: %d\n", (int)ksym);
1586 break; 1603 break;
1587 } 1604 }
1588} 1605}