degesch: simplify "attribute_printer"
Now that the line wrapper took over some of the state.
This commit is contained in:
parent
b6528c73e3
commit
742d590b8d
62
degesch.c
62
degesch.c
|
@ -2794,15 +2794,13 @@ enum
|
||||||
|
|
||||||
struct attribute_printer
|
struct attribute_printer
|
||||||
{
|
{
|
||||||
struct app_context *ctx; ///< Application context
|
char **attrs; ///< Named attributes
|
||||||
FILE *stream; ///< Output stream
|
FILE *stream; ///< Output stream
|
||||||
bool dirty; ///< Attributes are set
|
bool dirty; ///< Attributes are set
|
||||||
|
|
||||||
int want; ///< Desired attributes
|
|
||||||
int want_foreground; ///< Desired foreground color
|
|
||||||
int want_background; ///< Desired background color
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define ATTRIBUTE_PRINTER_INIT(ctx, stream) { ctx->attrs, stream, true }
|
||||||
|
|
||||||
static void
|
static void
|
||||||
attribute_printer_tputs (struct attribute_printer *self, const char *attr)
|
attribute_printer_tputs (struct attribute_printer *self, const char *attr)
|
||||||
{
|
{
|
||||||
|
@ -2819,31 +2817,18 @@ static void
|
||||||
attribute_printer_reset (struct attribute_printer *self)
|
attribute_printer_reset (struct attribute_printer *self)
|
||||||
{
|
{
|
||||||
if (self->dirty)
|
if (self->dirty)
|
||||||
attribute_printer_tputs (self, self->ctx->attrs[ATTR_RESET]);
|
attribute_printer_tputs (self, self->attrs[ATTR_RESET]);
|
||||||
|
|
||||||
self->dirty = false;
|
self->dirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
attribute_printer_init (struct attribute_printer *self,
|
attribute_printer_apply_named (struct attribute_printer *self, int attribute)
|
||||||
struct app_context *ctx, FILE *stream)
|
|
||||||
{
|
|
||||||
self->ctx = ctx;
|
|
||||||
self->stream = stream;
|
|
||||||
self->dirty = true;
|
|
||||||
|
|
||||||
self->want = 0;
|
|
||||||
self->want_foreground = -1;
|
|
||||||
self->want_background = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
attribute_printer_apply (struct attribute_printer *self, int attribute)
|
|
||||||
{
|
{
|
||||||
attribute_printer_reset (self);
|
attribute_printer_reset (self);
|
||||||
if (attribute != ATTR_RESET)
|
if (attribute != ATTR_RESET)
|
||||||
{
|
{
|
||||||
attribute_printer_tputs (self, self->ctx->attrs[attribute]);
|
attribute_printer_tputs (self, self->attrs[attribute]);
|
||||||
self->dirty = true;
|
self->dirty = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2905,16 +2890,14 @@ attribute_printer_decode_color (int color, bool *is_bright)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
attribute_printer_update (struct attribute_printer *self)
|
attribute_printer_apply (struct attribute_printer *self,
|
||||||
|
int attributes, int want_fg, int want_bg)
|
||||||
{
|
{
|
||||||
bool fg_is_bright;
|
bool fg_is_bright;
|
||||||
int fg = attribute_printer_decode_color
|
int fg = attribute_printer_decode_color (want_fg, &fg_is_bright);
|
||||||
(self->want_foreground, &fg_is_bright);
|
|
||||||
bool bg_is_bright;
|
bool bg_is_bright;
|
||||||
int bg = attribute_printer_decode_color
|
int bg = attribute_printer_decode_color (want_bg, &bg_is_bright);
|
||||||
(self->want_background, &bg_is_bright);
|
|
||||||
|
|
||||||
int attributes = self->want;
|
|
||||||
bool have_inverse = !!(attributes & ATTRIBUTE_INVERSE);
|
bool have_inverse = !!(attributes & ATTRIBUTE_INVERSE);
|
||||||
if (have_inverse)
|
if (have_inverse)
|
||||||
{
|
{
|
||||||
|
@ -3720,14 +3703,8 @@ 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);
|
||||||
|
|
||||||
// TODO: rewrite the sloppily hacked mess around attribute_printer;
|
struct attribute_printer state = ATTRIBUTE_PRINTER_INIT (self->ctx, stream);
|
||||||
// so far I just didn't want to break everything at once
|
struct line_char_attrs attrs = {}; // Won't compare equal to anything
|
||||||
struct attribute_printer state;
|
|
||||||
attribute_printer_init (&state, self->ctx, stream);
|
|
||||||
attribute_printer_reset (&state);
|
|
||||||
|
|
||||||
struct line_char_attrs attrs =
|
|
||||||
{ .fg = -1, .bg = -1, .named = ATTR_RESET, .text = 0 };
|
|
||||||
LIST_FOR_EACH (struct line_char, c, line)
|
LIST_FOR_EACH (struct line_char, c, line)
|
||||||
{
|
{
|
||||||
if (attrs.fg != c->attrs.fg
|
if (attrs.fg != c->attrs.fg
|
||||||
|
@ -3735,17 +3712,12 @@ formatter_flush (struct formatter *self, FILE *stream, int flush_opts)
|
||||||
|| attrs.named != c->attrs.named
|
|| attrs.named != c->attrs.named
|
||||||
|| attrs.text != c->attrs.text)
|
|| attrs.text != c->attrs.text)
|
||||||
{
|
{
|
||||||
if (c->attrs.named != -1)
|
|
||||||
attribute_printer_apply (&state, c->attrs.named);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
state.want = c->attrs.text;
|
|
||||||
state.want_foreground = c->attrs.fg;
|
|
||||||
state.want_background = c->attrs.bg;
|
|
||||||
attribute_printer_reset (&state);
|
|
||||||
attribute_printer_update (&state);
|
|
||||||
}
|
|
||||||
attrs = c->attrs;
|
attrs = c->attrs;
|
||||||
|
if (attrs.named != -1)
|
||||||
|
attribute_printer_apply_named (&state, attrs.named);
|
||||||
|
else
|
||||||
|
attribute_printer_apply (&state,
|
||||||
|
attrs.text, attrs.fg, attrs.bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
fwrite (c->bytes, c->len, 1, stream);
|
fwrite (c->bytes, c->len, 1, stream);
|
||||||
|
|
Loading…
Reference in New Issue