diff options
| -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 | } |
