mirror of
https://github.com/rkd77/elinks.git
synced 2024-12-04 14:46:47 -05:00
The union of the color and the node_number in the struct screen_char.
The long term goal is good looking of the Python docs in ELinks, especially background colors. Every start tag and every text node would have associated a natural number. Those numbers would be "drawn" in the document instead of colors. Finally, the screen driver would change numbers into colors. This will be done in small steps. The next step is to implement this change in the screen driver.
This commit is contained in:
parent
9c0d7dde79
commit
36070d3277
@ -254,8 +254,8 @@ decode_esc_color(unsigned char *text, int *line_pos, int width,
|
|||||||
|
|
||||||
get_screen_char_color(template, &color, 0, mode);
|
get_screen_char_color(template, &color, 0, mode);
|
||||||
set_term_color(&ch, &color, 0, COLOR_MODE_16);
|
set_term_color(&ch, &color, 0, COLOR_MODE_16);
|
||||||
b1 = background = (ch.color[0] >> 4) & 7;
|
b1 = background = (ch.c.color[0] >> 4) & 7;
|
||||||
f1 = foreground = ch.color[0] & 15;
|
f1 = foreground = ch.c.color[0] & 15;
|
||||||
|
|
||||||
while (tail < end) {
|
while (tail < end) {
|
||||||
unsigned char kod = (unsigned char)strtol(begin, &tail, 10);
|
unsigned char kod = (unsigned char)strtol(begin, &tail, 10);
|
||||||
|
@ -285,7 +285,7 @@ set_term_color16(struct screen_char *schar, enum color_flags flags,
|
|||||||
if (use_inverse(bg, fg)) {
|
if (use_inverse(bg, fg)) {
|
||||||
schar->attr |= SCREEN_ATTR_STANDOUT;
|
schar->attr |= SCREEN_ATTR_STANDOUT;
|
||||||
}
|
}
|
||||||
schar->color[0] = (bg << 4 | fg);
|
schar->c.color[0] = (bg << 4 | fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
color_T
|
color_T
|
||||||
@ -337,32 +337,32 @@ get_screen_char_color(struct screen_char *schar, struct color_pair *pair,
|
|||||||
/* If the desired color mode was not compiled in,
|
/* If the desired color mode was not compiled in,
|
||||||
* use 16 colors. */
|
* use 16 colors. */
|
||||||
case COLOR_MODE_16:
|
case COLOR_MODE_16:
|
||||||
bg = (schar->color[0] >> 4) & 7;
|
bg = (schar->c.color[0] >> 4) & 7;
|
||||||
fg = schar->color[0];
|
fg = schar->c.color[0];
|
||||||
pair->foreground = get_term_color16(fg);
|
pair->foreground = get_term_color16(fg);
|
||||||
pair->background = get_term_color16(bg);
|
pair->background = get_term_color16(bg);
|
||||||
break;
|
break;
|
||||||
#ifdef CONFIG_88_COLORS
|
#ifdef CONFIG_88_COLORS
|
||||||
case COLOR_MODE_88:
|
case COLOR_MODE_88:
|
||||||
pair->foreground = get_term_color88(schar->color[0]);
|
pair->foreground = get_term_color88(schar->c.color[0]);
|
||||||
pair->background = get_term_color88(schar->color[1]);
|
pair->background = get_term_color88(schar->c.color[1]);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_256_COLORS
|
#ifdef CONFIG_256_COLORS
|
||||||
case COLOR_MODE_256:
|
case COLOR_MODE_256:
|
||||||
pair->foreground = get_term_color256(schar->color[0]);
|
pair->foreground = get_term_color256(schar->c.color[0]);
|
||||||
pair->background = get_term_color256(schar->color[1]);
|
pair->background = get_term_color256(schar->c.color[1]);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_TRUE_COLOR
|
#ifdef CONFIG_TRUE_COLOR
|
||||||
case COLOR_MODE_TRUE_COLOR:
|
case COLOR_MODE_TRUE_COLOR:
|
||||||
pair->foreground = ((schar->color[0] << 16)
|
pair->foreground = ((schar->c.color[0] << 16)
|
||||||
| (schar->color[1] << 8)
|
| (schar->c.color[1] << 8)
|
||||||
| schar->color[2]);
|
| schar->c.color[2]);
|
||||||
|
|
||||||
pair->background = ((schar->color[3] << 16)
|
pair->background = ((schar->c.color[3] << 16)
|
||||||
| (schar->color[4] << 8)
|
| (schar->c.color[4] << 8)
|
||||||
| schar->color[5]);
|
| schar->c.color[5]);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case COLOR_MODE_DUMP:
|
case COLOR_MODE_DUMP:
|
||||||
@ -433,12 +433,12 @@ set_term_color(struct screen_char *schar, struct color_pair *pair,
|
|||||||
pair->foreground = (pair->background == 0) ? 0xffffff : 0;
|
pair->foreground = (pair->background == 0) ? 0xffffff : 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
schar->color[0] = (pair->foreground >> 16) & 255; /* r */
|
schar->c.color[0] = (pair->foreground >> 16) & 255; /* r */
|
||||||
schar->color[1] = (pair->foreground >> 8) & 255; /* g */
|
schar->c.color[1] = (pair->foreground >> 8) & 255; /* g */
|
||||||
schar->color[2] = pair->foreground & 255; /* b */
|
schar->c.color[2] = pair->foreground & 255; /* b */
|
||||||
schar->color[3] = (pair->background >> 16) & 255; /* r */
|
schar->c.color[3] = (pair->background >> 16) & 255; /* r */
|
||||||
schar->color[4] = (pair->background >> 8) & 255; /* g */
|
schar->c.color[4] = (pair->background >> 8) & 255; /* g */
|
||||||
schar->color[5] = pair->background & 255; /* b */
|
schar->c.color[5] = pair->background & 255; /* b */
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
case COLOR_MODE_DUMP:
|
case COLOR_MODE_DUMP:
|
||||||
@ -483,8 +483,8 @@ set_term_color(struct screen_char *schar, struct color_pair *pair,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TERM_COLOR_FOREGROUND_256(schar->color) = fg;
|
TERM_COLOR_FOREGROUND_256(schar->c.color) = fg;
|
||||||
TERM_COLOR_BACKGROUND_256(schar->color) = bg;
|
TERM_COLOR_BACKGROUND_256(schar->c.color) = bg;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_TRUE_COLOR
|
#ifdef CONFIG_TRUE_COLOR
|
||||||
|
@ -26,10 +26,10 @@
|
|||||||
|
|
||||||
#if SCREEN_COLOR_SIZE > 1
|
#if SCREEN_COLOR_SIZE > 1
|
||||||
#define clear_screen_char_color(schar) \
|
#define clear_screen_char_color(schar) \
|
||||||
do { memset((schar)->color, 0, SCREEN_COLOR_SIZE); } while (0)
|
do { memset((schar)->c.color, 0, SCREEN_COLOR_SIZE); } while (0)
|
||||||
#else
|
#else
|
||||||
#define clear_screen_char_color(schar) \
|
#define clear_screen_char_color(schar) \
|
||||||
do { (schar)->color[0] = 0; } while (0)
|
do { (schar)->c.color[0] = 0; } while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -25,6 +25,7 @@ struct terminal;
|
|||||||
* XXX: The bold mask is used as part of the color encoding. */
|
* XXX: The bold mask is used as part of the color encoding. */
|
||||||
enum screen_char_attr {
|
enum screen_char_attr {
|
||||||
SCREEN_ATTR_UNSEARCHABLE = 0x01,
|
SCREEN_ATTR_UNSEARCHABLE = 0x01,
|
||||||
|
SCREEN_ATTR_NODE_NUMBER = 0x02,
|
||||||
SCREEN_ATTR_BOLD = 0x08,
|
SCREEN_ATTR_BOLD = 0x08,
|
||||||
SCREEN_ATTR_ITALIC = 0x10,
|
SCREEN_ATTR_ITALIC = 0x10,
|
||||||
SCREEN_ATTR_UNDERLINE = 0x20,
|
SCREEN_ATTR_UNDERLINE = 0x20,
|
||||||
@ -51,8 +52,11 @@ struct screen_char {
|
|||||||
/** Attributes are ::screen_char_attr bits. */
|
/** Attributes are ::screen_char_attr bits. */
|
||||||
unsigned char attr;
|
unsigned char attr;
|
||||||
|
|
||||||
/** The fore- and background color. */
|
union {
|
||||||
unsigned char color[SCREEN_COLOR_SIZE];
|
/** The fore- and background color. */
|
||||||
|
unsigned char color[SCREEN_COLOR_SIZE];
|
||||||
|
unsigned int node_number;
|
||||||
|
} c;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** @relates screen_char */
|
/** @relates screen_char */
|
||||||
|
@ -828,7 +828,7 @@ add_char16(struct string *screen, struct screen_driver *driver,
|
|||||||
add_bytes_to_string(screen, "\033[1m", 4);
|
add_bytes_to_string(screen, "\033[1m", 4);
|
||||||
} else {
|
} else {
|
||||||
/* Force repainting of the other attributes. */
|
/* Force repainting of the other attributes. */
|
||||||
state->color[0] = ch->color[0] + 1;
|
state->color[0] = ch->c.color[0] + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -836,9 +836,9 @@ add_char16(struct string *screen, struct screen_driver *driver,
|
|||||||
#ifdef CONFIG_UTF8
|
#ifdef CONFIG_UTF8
|
||||||
!(driver->opt.utf8_cp && ch->data == UCS_NO_CHAR) &&
|
!(driver->opt.utf8_cp && ch->data == UCS_NO_CHAR) &&
|
||||||
#endif /* CONFIG_UTF8 */
|
#endif /* CONFIG_UTF8 */
|
||||||
!compare_color_16(ch->color, state->color)
|
!compare_color_16(ch->c.color, state->color)
|
||||||
) {
|
) {
|
||||||
copy_color_16(state->color, ch->color);
|
copy_color_16(state->color, ch->c.color);
|
||||||
|
|
||||||
add_bytes_to_string(screen, "\033[0", 3);
|
add_bytes_to_string(screen, "\033[0", 3);
|
||||||
|
|
||||||
@ -852,9 +852,9 @@ add_char16(struct string *screen, struct screen_driver *driver,
|
|||||||
* - An unsupported color mode. Use 16 colors. */
|
* - An unsupported color mode. Use 16 colors. */
|
||||||
if (driver->opt.color_mode != COLOR_MODE_MONO) {
|
if (driver->opt.color_mode != COLOR_MODE_MONO) {
|
||||||
unsigned char code[6] = ";30;40";
|
unsigned char code[6] = ";30;40";
|
||||||
unsigned char bgcolor = TERM_COLOR_BACKGROUND_16(ch->color);
|
unsigned char bgcolor = TERM_COLOR_BACKGROUND_16(ch->c.color);
|
||||||
|
|
||||||
code[2] += TERM_COLOR_FOREGROUND_16(ch->color);
|
code[2] += TERM_COLOR_FOREGROUND_16(ch->c.color);
|
||||||
|
|
||||||
if (!driver->opt.transparent || bgcolor != 0) {
|
if (!driver->opt.transparent || bgcolor != 0) {
|
||||||
code[5] += bgcolor;
|
code[5] += bgcolor;
|
||||||
@ -936,8 +936,8 @@ add_char_color(struct string *screen, const struct string *seq, unsigned char co
|
|||||||
add_bytes_to_string(screen, &seq->source[seq_pos], seq->length - seq_pos);
|
add_bytes_to_string(screen, &seq->source[seq_pos], seq->length - seq_pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define add_background_color(str, seq, chr) add_char_color(str, &(seq)[1], (chr)->color[1])
|
#define add_background_color(str, seq, chr) add_char_color(str, &(seq)[1], (chr)->c.color[1])
|
||||||
#define add_foreground_color(str, seq, chr) add_char_color(str, &(seq)[0], (chr)->color[0])
|
#define add_foreground_color(str, seq, chr) add_char_color(str, &(seq)[0], (chr)->c.color[0])
|
||||||
|
|
||||||
/** Time critical section. */
|
/** Time critical section. */
|
||||||
static inline void
|
static inline void
|
||||||
@ -972,7 +972,7 @@ add_char256(struct string *screen, struct screen_driver *driver,
|
|||||||
add_bytes_to_string(screen, "\033[1m", 4);
|
add_bytes_to_string(screen, "\033[1m", 4);
|
||||||
} else {
|
} else {
|
||||||
/* Force repainting of the other attributes. */
|
/* Force repainting of the other attributes. */
|
||||||
state->color[0] = ch->color[0] + 1;
|
state->color[0] = ch->c.color[0] + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -983,12 +983,12 @@ add_char256(struct string *screen, struct screen_driver *driver,
|
|||||||
#ifdef CONFIG_UTF8
|
#ifdef CONFIG_UTF8
|
||||||
!(driver->opt.utf8_cp && ch->data == UCS_NO_CHAR) &&
|
!(driver->opt.utf8_cp && ch->data == UCS_NO_CHAR) &&
|
||||||
#endif /* CONFIG_UTF8 */
|
#endif /* CONFIG_UTF8 */
|
||||||
!compare_color_256(ch->color, state->color)
|
!compare_color_256(ch->c.color, state->color)
|
||||||
) {
|
) {
|
||||||
copy_color_256(state->color, ch->color);
|
copy_color_256(state->color, ch->c.color);
|
||||||
|
|
||||||
add_foreground_color(screen, driver->opt.color256_seqs, ch);
|
add_foreground_color(screen, driver->opt.color256_seqs, ch);
|
||||||
if (!driver->opt.transparent || ch->color[1] != 0) {
|
if (!driver->opt.transparent || ch->c.color[1] != 0) {
|
||||||
add_background_color(screen, driver->opt.color256_seqs, ch);
|
add_background_color(screen, driver->opt.color256_seqs, ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1015,8 +1015,8 @@ static const struct string color_true_seqs[] = {
|
|||||||
/* foreground: */ TERM_STRING("\033[0;38;2"),
|
/* foreground: */ TERM_STRING("\033[0;38;2"),
|
||||||
/* background: */ TERM_STRING("\033[48;2"),
|
/* background: */ TERM_STRING("\033[48;2"),
|
||||||
};
|
};
|
||||||
#define add_true_background_color(str, seq, chr) add_char_true_color(str, &(seq)[1], &(chr)->color[3])
|
#define add_true_background_color(str, seq, chr) add_char_true_color(str, &(seq)[1], &(chr)->c.color[3])
|
||||||
#define add_true_foreground_color(str, seq, chr) add_char_true_color(str, &(seq)[0], &(chr)->color[0])
|
#define add_true_foreground_color(str, seq, chr) add_char_true_color(str, &(seq)[0], &(chr)->c.color[0])
|
||||||
static inline void
|
static inline void
|
||||||
add_char_true_color(struct string *screen, const struct string *seq, unsigned char *colors)
|
add_char_true_color(struct string *screen, const struct string *seq, unsigned char *colors)
|
||||||
{
|
{
|
||||||
@ -1097,7 +1097,7 @@ add_char_true(struct string *screen, struct screen_driver *driver,
|
|||||||
add_bytes_to_string(screen, "\033[1m", 4);
|
add_bytes_to_string(screen, "\033[1m", 4);
|
||||||
} else {
|
} else {
|
||||||
/* Force repainting of the other attributes. */
|
/* Force repainting of the other attributes. */
|
||||||
state->color[0] = ch->color[0] + 1;
|
state->color[0] = ch->c.color[0] + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1108,12 +1108,12 @@ add_char_true(struct string *screen, struct screen_driver *driver,
|
|||||||
#ifdef CONFIG_UTF8
|
#ifdef CONFIG_UTF8
|
||||||
!(driver->opt.utf8_cp && ch->data == UCS_NO_CHAR) &&
|
!(driver->opt.utf8_cp && ch->data == UCS_NO_CHAR) &&
|
||||||
#endif /* CONFIG_UTF8 */
|
#endif /* CONFIG_UTF8 */
|
||||||
!compare_color_true(ch->color, state->color)
|
!compare_color_true(ch->c.color, state->color)
|
||||||
) {
|
) {
|
||||||
copy_color_true(state->color, ch->color);
|
copy_color_true(state->color, ch->c.color);
|
||||||
|
|
||||||
add_true_foreground_color(screen, color_true_seqs, ch);
|
add_true_foreground_color(screen, color_true_seqs, ch);
|
||||||
if (!driver->opt.transparent || !background_is_black(ch->color)) {
|
if (!driver->opt.transparent || !background_is_black(ch->c.color)) {
|
||||||
add_true_background_color(screen, color_true_seqs, ch);
|
add_true_background_color(screen, color_true_seqs, ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1166,9 +1166,9 @@ add_char_true(struct string *screen, struct screen_driver *driver,
|
|||||||
if (is_last_line && x == xmax) \
|
if (is_last_line && x == xmax) \
|
||||||
break; \
|
break; \
|
||||||
\
|
\
|
||||||
if (compare_bg_color(pos->color, current->color)) { \
|
if (compare_bg_color(pos->c.color, current->c.color)) { \
|
||||||
/* No update for exact match. */ \
|
/* No update for exact match. */ \
|
||||||
if (compare_fg_color(pos->color, current->color)\
|
if (compare_fg_color(pos->c.color, current->c.color)\
|
||||||
&& pos->data == current->data \
|
&& pos->data == current->data \
|
||||||
&& pos->attr == current->attr) \
|
&& pos->attr == current->attr) \
|
||||||
continue; \
|
continue; \
|
||||||
|
@ -68,17 +68,17 @@ DUMP_FUNCTION_SPECIALIZED(struct document *document, struct dump_output *out)
|
|||||||
= document->data[y].chars[x].attr;
|
= document->data[y].chars[x].attr;
|
||||||
#ifdef DUMP_COLOR_MODE_16
|
#ifdef DUMP_COLOR_MODE_16
|
||||||
const unsigned char color1
|
const unsigned char color1
|
||||||
= document->data[y].chars[x].color[0];
|
= document->data[y].chars[x].c.color[0];
|
||||||
#elif defined(DUMP_COLOR_MODE_256)
|
#elif defined(DUMP_COLOR_MODE_256)
|
||||||
const unsigned char color1
|
const unsigned char color1
|
||||||
= document->data[y].chars[x].color[0];
|
= document->data[y].chars[x].c.color[0];
|
||||||
const unsigned char color2
|
const unsigned char color2
|
||||||
= document->data[y].chars[x].color[1];
|
= document->data[y].chars[x].c.color[1];
|
||||||
#elif defined(DUMP_COLOR_MODE_TRUE)
|
#elif defined(DUMP_COLOR_MODE_TRUE)
|
||||||
const unsigned char *const new_foreground
|
const unsigned char *const new_foreground
|
||||||
= &document->data[y].chars[x].color[0];
|
= &document->data[y].chars[x].c.color[0];
|
||||||
const unsigned char *const new_background
|
const unsigned char *const new_background
|
||||||
= &document->data[y].chars[x].color[3];
|
= &document->data[y].chars[x].c.color[3];
|
||||||
#endif /* DUMP_COLOR_MODE_TRUE */
|
#endif /* DUMP_COLOR_MODE_TRUE */
|
||||||
|
|
||||||
c = document->data[y].chars[x].data;
|
c = document->data[y].chars[x].data;
|
||||||
|
@ -271,7 +271,7 @@ draw_current_link(struct session *ses, struct document_view *doc_view)
|
|||||||
|
|
||||||
if (i == cursor_offset) {
|
if (i == cursor_offset) {
|
||||||
int blockable = (!link_is_textinput(link)
|
int blockable = (!link_is_textinput(link)
|
||||||
&& co->color != template->color);
|
&& co->c.color != template->c.color);
|
||||||
|
|
||||||
set_cursor(term, x, y, blockable);
|
set_cursor(term, x, y, blockable);
|
||||||
set_window_ptr(ses->tab, x, y);
|
set_window_ptr(ses->tab, x, y);
|
||||||
|
Loading…
Reference in New Issue
Block a user