degesch: rename things around terminal attributes
This commit is contained in:
parent
742d590b8d
commit
37e49b54cf
84
degesch.c
84
degesch.c
@ -18,7 +18,6 @@
|
||||
*/
|
||||
|
||||
// A table of all attributes we use for output
|
||||
// FIXME: awful naming, collides with ATTRIBUTE_*
|
||||
#define ATTR_TABLE(XX) \
|
||||
XX( PROMPT, "prompt", "Terminal attrs for the prompt" ) \
|
||||
XX( RESET, "reset", "String to reset terminal attributes" ) \
|
||||
@ -2785,24 +2784,24 @@ init_colors (struct app_context *ctx)
|
||||
|
||||
enum
|
||||
{
|
||||
ATTRIBUTE_BOLD = 1 << 0,
|
||||
ATTRIBUTE_ITALIC = 1 << 1,
|
||||
ATTRIBUTE_UNDERLINE = 1 << 2,
|
||||
ATTRIBUTE_INVERSE = 1 << 3,
|
||||
ATTRIBUTE_BLINK = 1 << 4
|
||||
TEXT_BOLD = 1 << 0,
|
||||
TEXT_ITALIC = 1 << 1,
|
||||
TEXT_UNDERLINE = 1 << 2,
|
||||
TEXT_INVERSE = 1 << 3,
|
||||
TEXT_BLINK = 1 << 4
|
||||
};
|
||||
|
||||
struct attribute_printer
|
||||
struct attr_printer
|
||||
{
|
||||
char **attrs; ///< Named attributes
|
||||
FILE *stream; ///< Output stream
|
||||
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
|
||||
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);
|
||||
if (printer)
|
||||
@ -2814,21 +2813,21 @@ attribute_printer_tputs (struct attribute_printer *self, const char *attr)
|
||||
}
|
||||
|
||||
static void
|
||||
attribute_printer_reset (struct attribute_printer *self)
|
||||
attr_printer_reset (struct attr_printer *self)
|
||||
{
|
||||
if (self->dirty)
|
||||
attribute_printer_tputs (self, self->attrs[ATTR_RESET]);
|
||||
attr_printer_tputs (self, self->attrs[ATTR_RESET]);
|
||||
|
||||
self->dirty = false;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
attribute_printer_tputs (self, self->attrs[attribute]);
|
||||
attr_printer_tputs (self, self->attrs[attribute]);
|
||||
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
|
||||
static int
|
||||
attribute_printer_256_to_88 (int color)
|
||||
attr_printer_256_to_88 (int color)
|
||||
{
|
||||
// These colours are the same everywhere
|
||||
if (color < 16)
|
||||
@ -2861,7 +2860,7 @@ attribute_printer_256_to_88 (int color)
|
||||
}
|
||||
|
||||
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 c256 = color >> 16; hard_assert (c256 < 256);
|
||||
@ -2879,7 +2878,7 @@ attribute_printer_decode_color (int color, bool *is_bright)
|
||||
return c16;
|
||||
|
||||
case 88:
|
||||
return c256 <= 0 ? c16 : attribute_printer_256_to_88 (c256);
|
||||
return c256 <= 0 ? c16 : attr_printer_256_to_88 (c256);
|
||||
case 256:
|
||||
return c256 <= 0 ? c16 : c256;
|
||||
|
||||
@ -2890,15 +2889,15 @@ attribute_printer_decode_color (int color, bool *is_bright)
|
||||
}
|
||||
|
||||
static void
|
||||
attribute_printer_apply (struct attribute_printer *self,
|
||||
int attributes, int want_fg, int want_bg)
|
||||
attr_printer_apply (struct attr_printer *self,
|
||||
int text_attrs, int wanted_fg, int wanted_bg)
|
||||
{
|
||||
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;
|
||||
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)
|
||||
{
|
||||
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
|
||||
// an interesting hack rather than anything else.
|
||||
if (!fg_is_bright && bg_is_bright && have_inverse)
|
||||
attributes |= ATTRIBUTE_BOLD;
|
||||
text_attrs |= TEXT_BOLD;
|
||||
else if (!fg_is_bright && bg_is_bright
|
||||
&& !have_inverse && fg >= 0 && bg >= 0)
|
||||
{
|
||||
// As long as none of the colours is the default, we can swap them
|
||||
int tmp = fg; fg = bg; bg = tmp;
|
||||
attributes |= ATTRIBUTE_BOLD | ATTRIBUTE_INVERSE;
|
||||
text_attrs |= TEXT_BOLD | TEXT_INVERSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
// This is what works on normal, decent terminals
|
||||
if (fg_is_bright) attributes |= ATTRIBUTE_BOLD;
|
||||
if (bg_is_bright) attributes |= ATTRIBUTE_BLINK;
|
||||
if (fg_is_bright) text_attrs |= TEXT_BOLD;
|
||||
if (bg_is_bright) text_attrs |= TEXT_BLINK;
|
||||
}
|
||||
|
||||
attribute_printer_reset (self);
|
||||
attr_printer_reset (self);
|
||||
|
||||
if (attributes)
|
||||
attribute_printer_tputs (self, tparm (set_attributes,
|
||||
if (text_attrs)
|
||||
attr_printer_tputs (self, tparm (set_attributes,
|
||||
0, // standout
|
||||
attributes & ATTRIBUTE_UNDERLINE,
|
||||
attributes & ATTRIBUTE_INVERSE,
|
||||
attributes & ATTRIBUTE_BLINK,
|
||||
text_attrs & TEXT_UNDERLINE,
|
||||
text_attrs & TEXT_INVERSE,
|
||||
text_attrs & TEXT_BLINK,
|
||||
0, // dim
|
||||
attributes & ATTRIBUTE_BOLD,
|
||||
text_attrs & TEXT_BOLD,
|
||||
0, // blank
|
||||
0, // protect
|
||||
0)); // acs
|
||||
if (enter_italics_mode && (attributes & ATTRIBUTE_ITALIC))
|
||||
attribute_printer_tputs (self, enter_italics_mode);
|
||||
if (enter_italics_mode && (text_attrs & TEXT_ITALIC))
|
||||
attr_printer_tputs (self, enter_italics_mode);
|
||||
|
||||
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)
|
||||
attribute_printer_tputs (self, g_terminal.color_set_bg[bg]);
|
||||
attr_printer_tputs (self, g_terminal.color_set_bg[bg]);
|
||||
|
||||
self->dirty = true;
|
||||
}
|
||||
@ -3114,7 +3113,7 @@ formatter_add_item (struct formatter *self, struct formatter_item template_)
|
||||
#define FORMATTER_ADD_TEXT(self, text_) \
|
||||
FORMATTER_ADD_ITEM ((self), TEXT, .text = (text_))
|
||||
#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))
|
||||
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
|
||||
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;
|
||||
if (attrs.named != -1)
|
||||
attribute_printer_apply_named (&state, attrs.named);
|
||||
attr_printer_apply_named (&state, attrs.named);
|
||||
else
|
||||
attribute_printer_apply (&state,
|
||||
attrs.text, attrs.fg, attrs.bg);
|
||||
attr_printer_apply (&state, attrs.text, attrs.fg, attrs.bg);
|
||||
}
|
||||
|
||||
fwrite (c->bytes, c->len, 1, stream);
|
||||
free (c);
|
||||
}
|
||||
attribute_printer_reset (&state);
|
||||
attr_printer_reset (&state);
|
||||
}
|
||||
|
||||
// --- Buffers -----------------------------------------------------------------
|
||||
|
Loading…
Reference in New Issue
Block a user