// doing this twice should be like a nop void invert_screen(termstate_t *term) { int x, y; int fg, bg, in; // swap fg and bg for all chars for (y = 0; y < term->phys_h; y++) for (x = 0; x < term->w; x++) { unpack_attribs(term->attrib[xy2index(term, x, y)], &fg, &bg, &in); term->attrib[xy2index(term, x, y)] = pack_attribs(bg, fg, in); } }
void csi_m(termstate_t * term) { int i; int fg, bg, in; for (i = 0; i <= term->used_par; i++) { switch (term->par[i]) { // more cases here case 0: // clear attributes term->attrib_mode = pack_attribs(DEFAULT_FG, DEFAULT_BG, 1); term->inverse = 0; break; case 1: // bold unpack_attribs(term->attrib_mode, &fg, &bg, &in); term->attrib_mode = pack_attribs(fg, bg, 2); break; case 2: // dimmed unpack_attribs(term->attrib_mode, &fg, &bg, &in); term->attrib_mode = pack_attribs(fg, bg, 0); break; case 5: // blink // we dont support blink, currently // term->blink = 1; break; case 7: // inverse if (term->inverse == 0) { // flip colors unpack_attribs(term->attrib_mode, &fg, &bg, &in); term->attrib_mode = pack_attribs(bg, fg, in); } term->inverse = 1; break; case 21: case 22: // forget bold unpack_attribs(term->attrib_mode, &fg, &bg, &in); term->attrib_mode = pack_attribs(fg, bg, 1); break; case 27: // forget inverse if (term->inverse == 1) { // flip colors back unpack_attribs(term->attrib_mode, &fg, &bg, &in); term->attrib_mode = pack_attribs(bg, fg, in); } term->inverse = 0; break; default: if (term->par[i] >= 30 && term->par[i] <= 37) { unpack_attribs(term->attrib_mode, &fg, &bg, &in); term->attrib_mode = pack_attribs(term->par[i] - 30, bg, in); } else if (term->par[i] >= 40 && term->par[i] <= 47) { unpack_attribs(term->attrib_mode, &fg, &bg, &in); term->attrib_mode = pack_attribs(fg, term->par[i] - 40, in); } break; } } }
/* init. a termstate, does not malloc term->spec, * but term->text and term->attrib. */ int vt100_init(termstate_t * term, int w, int h, int hist) { term->w = w; term->echo = 1; term->autorepeat = 1; term->autowrap = 1; term->term_mode = VT100MODE_COOKED; term->origin_mode = VT100_ORIGIN_GLOBAL; term->insert_mode = 0; term->keylist_next_write= 0; term->keylist_next_read = 0; // term->key_pending = 0; // term->__key_init = 0; vt100_semaphore_init(&term->keysem, 0); vt100_semaphore_init(&term->keybufsem, 1); vt100_semaphore_init(&term->termsem, 1); term->__shift = 0; term->__alt = 0; term->__altgr = 0; term->__ctrl = 0; term->__keydown = 0; term->returns = 0; term->hist_len = 0; term->phys_h = h; term->virt_h = term->phys_h + hist; term->phys_off = 0; term->vis_off = 0; term->cur_x = 0; term->cur_y = 0; term->attrib_mode = pack_attribs(DEFAULT_FG, DEFAULT_BG, 1); term->inverse = 0; term->decscnm = 0; term->esc_state = ESnormal; term->used_par = 0; term->cursor_vis = 1; term->cur_stored_x = 0; term->cur_stored_y = 0; term->cur_stored_attr = term->attrib_mode; term->newline = 1; term->ques = 0; term->scroll_top = 0; term->scroll_bottom = term->phys_h - 1; term->tab_last = -1; #if VT100_USE_SELECT term->select_list = NULL; #endif //LOG("cols:%d, lines:%d, hist:%d", term->w, term->phys_h, hist); free(term->text); term->text = malloc(term->w * term->virt_h); if (! term->text) { return -1; } memset(term->text, ' ', term->w * term->virt_h); free(term->attrib); term->attrib = malloc(term->w * term->virt_h); if (! term->attrib) { free(term->text); return -2; } memset(term->attrib, term->attrib_mode, term->w * term->virt_h); return 0; }