/* interprets a 'set attribute' (SGR) CSI escape sequence */ static void interpret_csi_SGR(RoteTerm *rt, int param[], int pcount) { int i; if (pcount == 0) { /* special case: reset attributes */ rt->curattr = 0x70; return; } for (i = 0; i < pcount; i++) { // From http://vt100.net/docs/vt510-rm/SGR table 5-16 // 0 All attributes off // 1 Bold // 4 Underline // 5 Blinking // 7 Negative image // 8 Invisible image // 10 The ASCII character set is the current 7-bit // display character set (default) - SCO Console only. // 11 Map Hex 00-7F of the PC character set codes // to the current 7-bit display character set // - SCO Console only. // 12 Map Hex 80-FF of the current character set to // the current 7-bit display character set - SCO // Console only. // 22 Bold off // 24 Underline off // 25 Blinking off // 27 Negative image off // 28 Invisible image off if (param[i] == 0) rt->curattr = 0x70; else if (param[i] == 1 || param[i] == 2 || param[i] == 4) /* set bold */ ROTE_ATTR_MOD_BOLD(rt->curattr,1); else if (param[i] == 5) /* set blink */ ROTE_ATTR_MOD_BLINK(rt->curattr,1); else if (param[i] == 7 || param[i] == 27) { /* reverse video */ int fg = ROTE_ATTR_FG(rt->curattr); int bg = ROTE_ATTR_BG(rt->curattr); ROTE_ATTR_MOD_FG(rt->curattr, bg); ROTE_ATTR_MOD_BG(rt->curattr, fg); } else if (param[i] == 8) rt->curattr = 0x0; /* invisible */ else if (param[i] == 22 || param[i] == 24) /* bold off */ ROTE_ATTR_MOD_BOLD(rt->curattr,0); else if (param[i] == 25) /* blink off */ ROTE_ATTR_MOD_BLINK(rt->curattr,0); else if (param[i] == 28) /* invisible off */ rt->curattr = 0x70; else if (param[i] >= 30 && param[i] <= 37) /* set fg */ ROTE_ATTR_MOD_FG(rt->curattr, param[i] - 30); else if (param[i] >= 40 && param[i] <= 47) /* set bg */ ROTE_ATTR_MOD_BG(rt->curattr, param[i] - 40); else if (param[i] == 39) /* reset foreground to default */ ROTE_ATTR_MOD_FG(rt->curattr, 7); else if (param[i] == 49) /* reset background to default */ ROTE_ATTR_MOD_BG(rt->curattr, 0); } }
static void default_cur_set_attr(WINDOW *win, unsigned char attr) { int cp = ROTE_ATTR_BG(attr) * 8 + 7 - ROTE_ATTR_FG(attr); if (!cp) wattrset(win, A_NORMAL); else wattrset(win, COLOR_PAIR(cp)); if (ROTE_ATTR_BOLD(attr)) wattron(win, A_BOLD); if (ROTE_ATTR_BLINK(attr)) wattron(win, A_BLINK); }