#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 {
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);
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
ATTR_ITALIC |
ATTR_UNDERLINE |
ATTR_BLINK |
- ATTR_FASTBLINK |
ATTR_REVERSE |
ATTR_INVISIBLE |
ATTR_STRUCK );
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;
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;
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;
}
}
+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] = "?";
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 */
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);
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 */
/* 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;