Example #1
0
// 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);
        }
}
Example #2
0
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;
        }
    }
}
Example #3
0
/* 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;
}