diff --git a/clients/terminal.c b/clients/terminal.c index e1c54289..0b637372 100644 --- a/clients/terminal.c +++ b/clients/terminal.c @@ -461,10 +461,51 @@ terminal_get_attr_row(struct terminal *terminal, int row) return &terminal->data_attr[index * terminal->width]; } -static struct attr -terminal_get_attr(struct terminal *terminal, int row, int col) +struct decoded_attr { + int foreground; + int background; + int bold; + int underline; +}; + +static void +terminal_decode_attr(struct terminal *terminal, int row, int col, + struct decoded_attr *decoded) { - return terminal_get_attr_row(terminal, row)[col]; + struct attr attr; + int foreground, background, tmp; + + /* get the attributes for this character cell */ + attr = terminal_get_attr_row(terminal, row)[col]; + if ((attr.a & ATTRMASK_INVERSE) || + ((terminal->mode & MODE_SHOW_CURSOR) && + terminal->focused && terminal->row == row && + terminal->column == col)) { + foreground = attr.bg; + background = attr.fg; + if (attr.a & ATTRMASK_BOLD) { + if (foreground <= 16) foreground |= 0x08; + if (background <= 16) background &= 0x07; + } + } else { + foreground = attr.fg; + background = attr.bg; + } + + if (terminal->mode & MODE_INVERSE) { + tmp = foreground; + foreground = background; + background = tmp; + if (attr.a & ATTRMASK_BOLD) { + if (foreground <= 16) foreground |= 0x08; + if (background <= 16) background &= 0x07; + } + } + + decoded->foreground = foreground; + decoded->background = background; + decoded->bold = attr.a & (ATTRMASK_BOLD | ATTRMASK_BLINK); + decoded->underline = attr.a & ATTRMASK_UNDERLINE; } static void @@ -711,13 +752,12 @@ terminal_draw_contents(struct terminal *terminal) cairo_font_extents_t extents; int top_margin, side_margin; int row, col; - struct attr attr; union utf8_char *p_row; struct utf8_chars { union utf8_char c; char null; } toShow; - int foreground, background, bold, underline, tmp; + struct decoded_attr attr; int text_x, text_y; cairo_surface_t *surface; double d; @@ -746,36 +786,12 @@ terminal_draw_contents(struct terminal *terminal) p_row = terminal_get_row(terminal, row); for (col = 0; col < terminal->width; col++) { /* get the attributes for this character cell */ - attr = terminal_get_attr(terminal, row, col); - if ((attr.a & ATTRMASK_INVERSE) || - ((terminal->mode & MODE_SHOW_CURSOR) && - terminal->focused && terminal->row == row && - terminal->column == col)) - { - foreground = attr.bg; - background = attr.fg; - if (attr.a & ATTRMASK_BOLD) { - if (foreground <= 16) foreground |= 0x08; - if (background <= 16) background &= 0x07; - } - } else { - foreground = attr.fg; - background = attr.bg; - } - if (terminal->mode & MODE_INVERSE) { - tmp = foreground; - foreground = background; - background = tmp; - if (attr.a & ATTRMASK_BOLD) { - if (foreground <= 16) foreground |= 0x08; - if (background <= 16) background &= 0x07; - } - } + terminal_decode_attr(terminal, row, col, &attr); - if (background == terminal->color_scheme->border) + if (attr.background == terminal->color_scheme->border) continue; - terminal_set_color(terminal, cr, background); + terminal_set_color(terminal, cr, attr.background); cairo_move_to(cr, side_margin + (col * extents.max_x_advance), top_margin + (row * extents.height)); cairo_rel_line_to(cr, extents.max_x_advance, 0); @@ -793,42 +809,16 @@ terminal_draw_contents(struct terminal *terminal) p_row = terminal_get_row(terminal, row); for (col = 0; col < terminal->width; col++) { /* get the attributes for this character cell */ - attr = terminal_get_attr(terminal, row, col); - if ((attr.a & ATTRMASK_INVERSE) || - ((terminal->mode & MODE_SHOW_CURSOR) && - terminal->focused && terminal->row == row && - terminal->column == col)) - { - foreground = attr.bg; - background = attr.fg; - if (attr.a & ATTRMASK_BOLD) { - if (foreground <= 16) foreground |= 0x08; - if (background <= 16) background &= 0x07; - } - } else { - foreground = attr.fg; - background = attr.bg; - } - if (terminal->mode & MODE_INVERSE) { - tmp = foreground; - foreground = background; - background = tmp; - if (attr.a & ATTRMASK_BOLD) { - if (foreground <= 16) foreground |= 0x08; - if (background <= 16) background &= 0x07; - } - } - bold = attr.a & (ATTRMASK_BOLD | ATTRMASK_BLINK); - underline = attr.a & ATTRMASK_UNDERLINE; + terminal_decode_attr(terminal, row, col, &attr); - if (bold) + if (attr.bold) cairo_set_font_face(cr, terminal->font_bold); else cairo_set_font_face(cr, terminal->font_normal); - terminal_set_color(terminal, cr, foreground); + terminal_set_color(terminal, cr, attr.foreground); text_x = side_margin + col * extents.max_x_advance; text_y = top_margin + extents.ascent + row * extents.height; - if (underline) { + if (attr.underline) { cairo_move_to(cr, text_x, (double)text_y + 1.5); cairo_line_to(cr, text_x + extents.max_x_advance, (double) text_y + 1.5); cairo_stroke(cr);