X-Git-Url: https://jasonwoof.com/gitweb/?p=st.git;a=blobdiff_plain;f=st.c;h=e0aae9dd63dd959c41f92406215b9948af9d0dbb;hp=6ec4858e5efc2f133c965a9e7a17088cbb889b6f;hb=8de8ae3923b3b91b034077c8c35acba629588233;hpb=da78629cf5fa234204f002ff2c2b597a2bf7e76f diff --git a/st.c b/st.c index 6ec4858..e0aae9d 100644 --- a/st.c +++ b/st.c @@ -89,19 +89,18 @@ char *argv0; #define VT102ID "\033[?6c" enum glyph_attribute { - ATTR_NULL = 0, + ATTR_NULL = 0, ATTR_BOLD = 1, ATTR_FAINT = 2, ATTR_ITALIC = 4, ATTR_UNDERLINE = 8, ATTR_BLINK = 16, - ATTR_FASTBLINK = 32, - ATTR_REVERSE = 64, - ATTR_INVISIBLE = 128, - ATTR_STRUCK = 256, - ATTR_WRAP = 512, - ATTR_WIDE = 1024, - ATTR_WDUMMY = 2048, + ATTR_REVERSE = 32, + ATTR_INVISIBLE = 64, + ATTR_STRUCK = 128, + ATTR_WRAP = 256, + ATTR_WIDE = 512, + ATTR_WDUMMY = 1024, }; enum cursor_movement { @@ -405,6 +404,7 @@ static void ttyread(void); static void ttyresize(void); static void ttysend(char *, size_t); static void ttywrite(const char *, size_t); +static void tstrsequence(uchar c); static void xdraws(char *, Glyph, int, int, int, int); static void xhints(void); @@ -1176,16 +1176,15 @@ execsh(void) { void sigchld(int a) { - int stat = 0; + int stat, ret; if(waitpid(pid, &stat, 0) < 0) die("Waiting for pid %hd failed: %s\n", pid, strerror(errno)); - if(WIFEXITED(stat)) { - exit(WEXITSTATUS(stat)); - } else { - exit(EXIT_FAILURE); - } + ret = WIFEXITED(stat) ? WEXITSTATUS(stat) : EXIT_FAILURE; + if (ret != EXIT_SUCCESS) + die("child finished with error '%d'\n", stat); + exit(EXIT_SUCCESS); } void @@ -1554,6 +1553,7 @@ tsetchar(char *c, Glyph *attr, int x, int y) { void tclearregion(int x1, int y1, int x2, int y2) { int x, y, temp; + Glyph *gp; if(x1 > x2) temp = x1, x1 = x2, x2 = temp; @@ -1568,10 +1568,13 @@ tclearregion(int x1, int y1, int x2, int y2) { for(y = y1; y <= y2; y++) { term.dirty[y] = 1; for(x = x1; x <= x2; x++) { + gp = &term.line[y][x]; if(selected(x, y)) selclear(NULL); - term.line[y][x] = term.c.attr; - memcpy(term.line[y][x].c, " ", 2); + gp->fg = term.c.attr.fg; + gp->bg = term.c.attr.bg; + gp->mode = 0; + memcpy(gp->c, " ", 2); } } } @@ -1683,7 +1686,6 @@ tsetattr(int *attr, int l) { ATTR_ITALIC | ATTR_UNDERLINE | ATTR_BLINK | - ATTR_FASTBLINK | ATTR_REVERSE | ATTR_INVISIBLE | ATTR_STRUCK ); @@ -1703,10 +1705,9 @@ tsetattr(int *attr, int l) { term.c.attr.mode |= ATTR_UNDERLINE; break; case 5: /* slow blink */ - term.c.attr.mode |= ATTR_BLINK; - break; + /* FALLTHROUGH */ case 6: /* rapid blink */ - term.c.attr.mode |= ATTR_FASTBLINK; + term.c.attr.mode |= ATTR_BLINK; break; case 7: term.c.attr.mode |= ATTR_REVERSE; @@ -1717,11 +1718,8 @@ tsetattr(int *attr, int l) { case 9: term.c.attr.mode |= ATTR_STRUCK; break; - case 21: - term.c.attr.mode &= ~ATTR_BOLD; - break; case 22: - term.c.attr.mode &= ~ATTR_FAINT; + term.c.attr.mode &= ~(ATTR_BOLD | ATTR_FAINT); break; case 23: term.c.attr.mode &= ~ATTR_ITALIC; @@ -1732,9 +1730,6 @@ tsetattr(int *attr, int l) { case 25: term.c.attr.mode &= ~ATTR_BLINK; break; - case 26: - term.c.attr.mode &= ~ATTR_FASTBLINK; - break; case 27: term.c.attr.mode &= ~ATTR_REVERSE; break; @@ -2348,6 +2343,30 @@ tdeftran(char ascii) { } void +tstrsequence(uchar c) { + if (c & 0x80) { + switch (c) { + case 0x90: /* DCS -- Device Control String */ + c = 'P'; + break; + case 0x9f: /* APC -- Application Program Command */ + c = '_'; + break; + case 0x9e: /* PM -- Privacy Message */ + c = '^'; + break; + case 0x9d: /* OSC -- Operating System Command */ + c = ']'; + break; + } + } + strreset(); + strescseq.type = c; + term.esc |= ESC_STR; + return; +} + +void tcontrolcode(uchar ascii) { static char question[UTF_SIZ] = "?"; @@ -2411,7 +2430,6 @@ tcontrolcode(uchar ascii) { case 0x8d: /* TODO: RI */ case 0x8e: /* TODO: SS2 */ case 0x8f: /* TODO: SS3 */ - case 0x90: /* TODO: DCS */ case 0x98: /* TODO: SOS */ break; case 0x9a: /* DECID -- Identify Terminal */ @@ -2419,10 +2437,13 @@ tcontrolcode(uchar ascii) { break; case 0x9b: /* TODO: CSI */ case 0x9c: /* TODO: ST */ - case 0x9d: /* TODO: OSC */ - case 0x9e: /* TODO: PM */ - case 0x9f: /* TODO: APC */ break; + case 0x90: /* DCS -- Device Control String */ + case 0x9f: /* APC -- Application Program Command */ + case 0x9e: /* PM -- Privacy Message */ + case 0x9d: /* OSC -- Operating System Command */ + tstrsequence(ascii); + return; } /* only CAN, SUB, \a and C1 chars interrupt a sequence */ term.esc &= ~(ESC_STR_END|ESC_STR); @@ -2538,9 +2559,7 @@ tputc(char *c, int len) { case '^': /* PM -- Privacy Message */ case ']': /* OSC -- Operating System Command */ case 'k': /* old title set compatibility */ - strreset(); - strescseq.type = ascii; - term.esc |= ESC_STR; + tstrsequence(ascii); return; case '(': /* set primary charset G0 */ case ')': /* set secondary charset G1 */ @@ -3761,6 +3780,8 @@ run(void) { /* Waiting for window mapping */ while(1) { XNextEvent(xw.dpy, &ev); + if(XFilterEvent(&ev, None)) + continue; if(ev.type == ConfigureNotify) { w = ev.xconfigure.width; h = ev.xconfigure.height;