diff options
author | Aurélien Aptel <aurelien.aptel@gmail.com> | 2010-10-16 20:50:29 +0200 |
---|---|---|
committer | Aurélien Aptel <aurelien.aptel@gmail.com> | 2010-10-16 20:50:29 +0200 |
commit | 6f87a39444166674daa94860d365e72343e0b882 (patch) | |
tree | 1e0803ce8693bf63237c7e2ea4da62f634a1d924 /st.c | |
parent | ce27e634910e10c470b2dcb2edcd20f05d25343b (diff) | |
download | st-6f87a39444166674daa94860d365e72343e0b882.tar.gz st-6f87a39444166674daa94860d365e72343e0b882.zip |
added LNM mode; re-organized kpress() to handle it.
Diffstat (limited to 'st.c')
-rw-r--r-- | st.c | 51 |
1 files changed, 34 insertions, 17 deletions
@@ -55,7 +55,8 @@ enum { CURSOR_UP, CURSOR_DOWN, CURSOR_LEFT, CURSOR_RIGHT, | |||
55 | CURSOR_SAVE, CURSOR_LOAD }; | 55 | CURSOR_SAVE, CURSOR_LOAD }; |
56 | enum { CURSOR_DEFAULT = 0, CURSOR_HIDE = 1, CURSOR_WRAPNEXT = 2 }; | 56 | enum { CURSOR_DEFAULT = 0, CURSOR_HIDE = 1, CURSOR_WRAPNEXT = 2 }; |
57 | enum { GLYPH_SET=1, GLYPH_DIRTY=2 }; | 57 | enum { GLYPH_SET=1, GLYPH_DIRTY=2 }; |
58 | enum { MODE_WRAP=1, MODE_INSERT=2, MODE_APPKEYPAD=4, MODE_ALTSCREEN=8 }; | 58 | enum { MODE_WRAP=1, MODE_INSERT=2, MODE_APPKEYPAD=4, MODE_ALTSCREEN=8, |
59 | MODE_CRLF=16 }; | ||
59 | enum { ESC_START=1, ESC_CSI=2, ESC_OSC=4, ESC_TITLE=8, ESC_ALTCHARSET=16 }; | 60 | enum { ESC_START=1, ESC_CSI=2, ESC_OSC=4, ESC_TITLE=8, ESC_ALTCHARSET=16 }; |
60 | enum { SCREEN_UPDATE, SCREEN_REDRAW }; | 61 | enum { SCREEN_UPDATE, SCREEN_REDRAW }; |
61 | enum { WIN_VISIBLE=1, WIN_REDRAW=2, WIN_FOCUSED=4 }; | 62 | enum { WIN_VISIBLE=1, WIN_REDRAW=2, WIN_FOCUSED=4 }; |
@@ -164,7 +165,7 @@ static void tinsertblank(int); | |||
164 | static void tinsertblankline(int); | 165 | static void tinsertblankline(int); |
165 | static void tmoveto(int, int); | 166 | static void tmoveto(int, int); |
166 | static void tnew(int, int); | 167 | static void tnew(int, int); |
167 | static void tnewline(void); | 168 | static void tnewline(int); |
168 | static void tputtab(void); | 169 | static void tputtab(void); |
169 | static void tputc(char); | 170 | static void tputc(char); |
170 | static void tputs(char*, int); | 171 | static void tputs(char*, int); |
@@ -626,14 +627,13 @@ tscrollup(int orig, int n) { | |||
626 | } | 627 | } |
627 | 628 | ||
628 | void | 629 | void |
629 | tnewline(void) { | 630 | tnewline(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 | ||
639 | void | 639 | void |
@@ -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 | } |