degesch: rename things around terminal attributes

This commit is contained in:
Přemysl Eric Janouch 2016-10-29 18:02:03 +02:00
parent 742d590b8d
commit 37e49b54cf
Signed by: p
GPG Key ID: B715679E3A361BE6
1 changed files with 41 additions and 43 deletions

View File

@ -18,7 +18,6 @@
*/ */
// A table of all attributes we use for output // A table of all attributes we use for output
// FIXME: awful naming, collides with ATTRIBUTE_*
#define ATTR_TABLE(XX) \ #define ATTR_TABLE(XX) \
XX( PROMPT, "prompt", "Terminal attrs for the prompt" ) \ XX( PROMPT, "prompt", "Terminal attrs for the prompt" ) \
XX( RESET, "reset", "String to reset terminal attributes" ) \ XX( RESET, "reset", "String to reset terminal attributes" ) \
@ -2785,24 +2784,24 @@ init_colors (struct app_context *ctx)
enum enum
{ {
ATTRIBUTE_BOLD = 1 << 0, TEXT_BOLD = 1 << 0,
ATTRIBUTE_ITALIC = 1 << 1, TEXT_ITALIC = 1 << 1,
ATTRIBUTE_UNDERLINE = 1 << 2, TEXT_UNDERLINE = 1 << 2,
ATTRIBUTE_INVERSE = 1 << 3, TEXT_INVERSE = 1 << 3,
ATTRIBUTE_BLINK = 1 << 4 TEXT_BLINK = 1 << 4
}; };
struct attribute_printer struct attr_printer
{ {
char **attrs; ///< Named attributes char **attrs; ///< Named attributes
FILE *stream; ///< Output stream FILE *stream; ///< Output stream
bool dirty; ///< Attributes are set bool dirty; ///< Attributes are set
}; };
#define ATTRIBUTE_PRINTER_INIT(ctx, stream) { ctx->attrs, stream, true } #define ATTR_PRINTER_INIT(ctx, stream) { ctx->attrs, stream, true }
static void static void
attribute_printer_tputs (struct attribute_printer *self, const char *attr) attr_printer_tputs (struct attr_printer *self, const char *attr)
{ {
terminal_printer_fn printer = get_attribute_printer (self->stream); terminal_printer_fn printer = get_attribute_printer (self->stream);
if (printer) if (printer)
@ -2814,21 +2813,21 @@ attribute_printer_tputs (struct attribute_printer *self, const char *attr)
} }
static void static void
attribute_printer_reset (struct attribute_printer *self) attr_printer_reset (struct attr_printer *self)
{ {
if (self->dirty) if (self->dirty)
attribute_printer_tputs (self, self->attrs[ATTR_RESET]); attr_printer_tputs (self, self->attrs[ATTR_RESET]);
self->dirty = false; self->dirty = false;
} }
static void static void
attribute_printer_apply_named (struct attribute_printer *self, int attribute) attr_printer_apply_named (struct attr_printer *self, int attribute)
{ {
attribute_printer_reset (self); attr_printer_reset (self);
if (attribute != ATTR_RESET) if (attribute != ATTR_RESET)
{ {
attribute_printer_tputs (self, self->attrs[attribute]); attr_printer_tputs (self, self->attrs[attribute]);
self->dirty = true; self->dirty = true;
} }
} }
@ -2841,7 +2840,7 @@ attribute_printer_apply_named (struct attribute_printer *self, int attribute)
/// Interpolate from the 256-color palette to the 88-color one /// Interpolate from the 256-color palette to the 88-color one
static int static int
attribute_printer_256_to_88 (int color) attr_printer_256_to_88 (int color)
{ {
// These colours are the same everywhere // These colours are the same everywhere
if (color < 16) if (color < 16)
@ -2861,7 +2860,7 @@ attribute_printer_256_to_88 (int color)
} }
static int static int
attribute_printer_decode_color (int color, bool *is_bright) attr_printer_decode_color (int color, bool *is_bright)
{ {
int16_t c16 = color; hard_assert (c16 < 16); int16_t c16 = color; hard_assert (c16 < 16);
int16_t c256 = color >> 16; hard_assert (c256 < 256); int16_t c256 = color >> 16; hard_assert (c256 < 256);
@ -2879,7 +2878,7 @@ attribute_printer_decode_color (int color, bool *is_bright)
return c16; return c16;
case 88: case 88:
return c256 <= 0 ? c16 : attribute_printer_256_to_88 (c256); return c256 <= 0 ? c16 : attr_printer_256_to_88 (c256);
case 256: case 256:
return c256 <= 0 ? c16 : c256; return c256 <= 0 ? c16 : c256;
@ -2890,15 +2889,15 @@ attribute_printer_decode_color (int color, bool *is_bright)
} }
static void static void
attribute_printer_apply (struct attribute_printer *self, attr_printer_apply (struct attr_printer *self,
int attributes, int want_fg, int want_bg) int text_attrs, int wanted_fg, int wanted_bg)
{ {
bool fg_is_bright; bool fg_is_bright;
int fg = attribute_printer_decode_color (want_fg, &fg_is_bright); int fg = attr_printer_decode_color (wanted_fg, &fg_is_bright);
bool bg_is_bright; bool bg_is_bright;
int bg = attribute_printer_decode_color (want_bg, &bg_is_bright); int bg = attr_printer_decode_color (wanted_bg, &bg_is_bright);
bool have_inverse = !!(attributes & ATTRIBUTE_INVERSE); bool have_inverse = !!(text_attrs & TEXT_INVERSE);
if (have_inverse) if (have_inverse)
{ {
bool tmp = fg_is_bright; bool tmp = fg_is_bright;
@ -2913,41 +2912,41 @@ attribute_printer_apply (struct attribute_printer *self,
// to be, and we still can't make both colours bright, so it's more of // to be, and we still can't make both colours bright, so it's more of
// an interesting hack rather than anything else. // an interesting hack rather than anything else.
if (!fg_is_bright && bg_is_bright && have_inverse) if (!fg_is_bright && bg_is_bright && have_inverse)
attributes |= ATTRIBUTE_BOLD; text_attrs |= TEXT_BOLD;
else if (!fg_is_bright && bg_is_bright else if (!fg_is_bright && bg_is_bright
&& !have_inverse && fg >= 0 && bg >= 0) && !have_inverse && fg >= 0 && bg >= 0)
{ {
// As long as none of the colours is the default, we can swap them // As long as none of the colours is the default, we can swap them
int tmp = fg; fg = bg; bg = tmp; int tmp = fg; fg = bg; bg = tmp;
attributes |= ATTRIBUTE_BOLD | ATTRIBUTE_INVERSE; text_attrs |= TEXT_BOLD | TEXT_INVERSE;
} }
else else
{ {
// This is what works on normal, decent terminals // This is what works on normal, decent terminals
if (fg_is_bright) attributes |= ATTRIBUTE_BOLD; if (fg_is_bright) text_attrs |= TEXT_BOLD;
if (bg_is_bright) attributes |= ATTRIBUTE_BLINK; if (bg_is_bright) text_attrs |= TEXT_BLINK;
} }
attribute_printer_reset (self); attr_printer_reset (self);
if (attributes) if (text_attrs)
attribute_printer_tputs (self, tparm (set_attributes, attr_printer_tputs (self, tparm (set_attributes,
0, // standout 0, // standout
attributes & ATTRIBUTE_UNDERLINE, text_attrs & TEXT_UNDERLINE,
attributes & ATTRIBUTE_INVERSE, text_attrs & TEXT_INVERSE,
attributes & ATTRIBUTE_BLINK, text_attrs & TEXT_BLINK,
0, // dim 0, // dim
attributes & ATTRIBUTE_BOLD, text_attrs & TEXT_BOLD,
0, // blank 0, // blank
0, // protect 0, // protect
0)); // acs 0)); // acs
if (enter_italics_mode && (attributes & ATTRIBUTE_ITALIC)) if (enter_italics_mode && (text_attrs & TEXT_ITALIC))
attribute_printer_tputs (self, enter_italics_mode); attr_printer_tputs (self, enter_italics_mode);
if (fg >= 0) if (fg >= 0)
attribute_printer_tputs (self, g_terminal.color_set_fg[fg]); attr_printer_tputs (self, g_terminal.color_set_fg[fg]);
if (bg >= 0) if (bg >= 0)
attribute_printer_tputs (self, g_terminal.color_set_bg[bg]); attr_printer_tputs (self, g_terminal.color_set_bg[bg]);
self->dirty = true; self->dirty = true;
} }
@ -3114,7 +3113,7 @@ formatter_add_item (struct formatter *self, struct formatter_item template_)
#define FORMATTER_ADD_TEXT(self, text_) \ #define FORMATTER_ADD_TEXT(self, text_) \
FORMATTER_ADD_ITEM ((self), TEXT, .text = (text_)) FORMATTER_ADD_ITEM ((self), TEXT, .text = (text_))
#define FORMATTER_ADD_SIMPLE(self, attribute_) \ #define FORMATTER_ADD_SIMPLE(self, attribute_) \
FORMATTER_ADD_ITEM ((self), SIMPLE, .attribute = ATTRIBUTE_ ## attribute_) FORMATTER_ADD_ITEM ((self), SIMPLE, .attribute = TEXT_ ## attribute_)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -3703,7 +3702,7 @@ formatter_flush (struct formatter *self, FILE *stream, int flush_opts)
if (self->ctx->word_wrapping && !(flush_opts & FLUSH_OPT_NOWRAP)) if (self->ctx->word_wrapping && !(flush_opts & FLUSH_OPT_NOWRAP))
line = line_wrap (line, g_terminal.columns); line = line_wrap (line, g_terminal.columns);
struct attribute_printer state = ATTRIBUTE_PRINTER_INIT (self->ctx, stream); struct attr_printer state = ATTR_PRINTER_INIT (self->ctx, stream);
struct line_char_attrs attrs = {}; // Won't compare equal to anything struct line_char_attrs attrs = {}; // Won't compare equal to anything
LIST_FOR_EACH (struct line_char, c, line) LIST_FOR_EACH (struct line_char, c, line)
{ {
@ -3714,16 +3713,15 @@ formatter_flush (struct formatter *self, FILE *stream, int flush_opts)
{ {
attrs = c->attrs; attrs = c->attrs;
if (attrs.named != -1) if (attrs.named != -1)
attribute_printer_apply_named (&state, attrs.named); attr_printer_apply_named (&state, attrs.named);
else else
attribute_printer_apply (&state, attr_printer_apply (&state, attrs.text, attrs.fg, attrs.bg);
attrs.text, attrs.fg, attrs.bg);
} }
fwrite (c->bytes, c->len, 1, stream); fwrite (c->bytes, c->len, 1, stream);
free (c); free (c);
} }
attribute_printer_reset (&state); attr_printer_reset (&state);
} }
// --- Buffers ----------------------------------------------------------------- // --- Buffers -----------------------------------------------------------------