config: add tweak.box-drawing-solid-shades=yes|no

When enabled, shades are rendered as solid blocks, using a darker
variant of the current foreground color.

When disabled, shades are instead rendered in a checker box pattern,
using the foreground color unmodified.

Default is enabled.
This commit is contained in:
Daniel Eklöf 2021-05-05 22:24:25 +02:00
parent c0bd152218
commit e7109d6b77
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
4 changed files with 31 additions and 10 deletions

View file

@ -27,9 +27,9 @@ struct buf {
int dpi; int dpi;
float cell_size; float cell_size;
float base_thickness; float base_thickness;
bool solid_shades;
}; };
static const bool solid_shades = true; /* TODO: configurable? */
static const pixman_color_t white = {0xffff, 0xffff, 0xffff, 0xffff}; static const pixman_color_t white = {0xffff, 0xffff, 0xffff, 0xffff};
static void static void
@ -1756,12 +1756,12 @@ draw_light_shade(struct buf *buf)
{ {
pixman_format_code_t fmt = pixman_image_get_format(buf->pix); pixman_format_code_t fmt = pixman_image_get_format(buf->pix);
if (solid_shades && fmt == PIXMAN_a1) if (buf->solid_shades && fmt == PIXMAN_a1)
change_buffer_format(buf, PIXMAN_a8); change_buffer_format(buf, PIXMAN_a8);
else if (!solid_shades && fmt == PIXMAN_a8) else if (!buf->solid_shades && fmt == PIXMAN_a8)
change_buffer_format(buf, PIXMAN_a1); change_buffer_format(buf, PIXMAN_a1);
if (solid_shades) if (buf->solid_shades)
draw_pixman_shade(buf, 0x2000); draw_pixman_shade(buf, 0x2000);
else { else {
for (size_t row = 0; row < buf->height; row += 2) { for (size_t row = 0; row < buf->height; row += 2) {
@ -1779,12 +1779,12 @@ draw_medium_shade(struct buf *buf)
{ {
pixman_format_code_t fmt = pixman_image_get_format(buf->pix); pixman_format_code_t fmt = pixman_image_get_format(buf->pix);
if (solid_shades && fmt == PIXMAN_a1) if (buf->solid_shades && fmt == PIXMAN_a1)
change_buffer_format(buf, PIXMAN_a8); change_buffer_format(buf, PIXMAN_a8);
else if (!solid_shades && fmt == PIXMAN_a8) else if (!buf->solid_shades && fmt == PIXMAN_a8)
change_buffer_format(buf, PIXMAN_a1); change_buffer_format(buf, PIXMAN_a1);
if (solid_shades) if (buf->solid_shades)
draw_pixman_shade(buf, 0x4000); draw_pixman_shade(buf, 0x4000);
else { else {
for (size_t row = 0; row < buf->height; row++) { for (size_t row = 0; row < buf->height; row++) {
@ -1802,12 +1802,12 @@ draw_dark_shade(struct buf *buf)
{ {
pixman_format_code_t fmt = pixman_image_get_format(buf->pix); pixman_format_code_t fmt = pixman_image_get_format(buf->pix);
if (solid_shades && fmt == PIXMAN_a1) if (buf->solid_shades && fmt == PIXMAN_a1)
change_buffer_format(buf, PIXMAN_a8); change_buffer_format(buf, PIXMAN_a8);
else if (!solid_shades && fmt == PIXMAN_a8) else if (!buf->solid_shades && fmt == PIXMAN_a8)
change_buffer_format(buf, PIXMAN_a1); change_buffer_format(buf, PIXMAN_a1);
if (solid_shades) if (buf->solid_shades)
draw_pixman_shade(buf, 0x8000); draw_pixman_shade(buf, 0x8000);
else { else {
for (size_t row = 0; row < buf->height; row++) { for (size_t row = 0; row < buf->height; row++) {
@ -2440,6 +2440,7 @@ box_drawing(const struct terminal *term, wchar_t wc)
.dpi = term->font_dpi, .dpi = term->font_dpi,
.cell_size = sqrt(pow(term->cell_width, 2) + pow(term->cell_height, 2)), .cell_size = sqrt(pow(term->cell_width, 2) + pow(term->cell_height, 2)),
.base_thickness = term->conf->tweak.box_drawing_base_thickness, .base_thickness = term->conf->tweak.box_drawing_base_thickness,
.solid_shades = term->conf->tweak.box_drawing_solid_shades,
}; };
LOG_DBG("LIGHT=%d, HEAVY=%d", LOG_DBG("LIGHT=%d, HEAVY=%d",

View file

@ -1929,6 +1929,14 @@ parse_section_tweak(
conf->tweak.box_drawing_base_thickness); conf->tweak.box_drawing_base_thickness);
} }
else if (strcmp(key, "box-drawing-solid-shades") == 0) {
conf->tweak.box_drawing_solid_shades = str_to_bool(value);
if (!conf->tweak.box_drawing_solid_shades)
LOG_WARN("tweak: box-drawing-solid-shades=%s",
conf->tweak.box_drawing_solid_shades ? "yes" : "no");
}
else { else {
LOG_AND_NOTIFY_ERR("%s:%u: [tweak]: %s: invalid key", path, lineno, key); LOG_AND_NOTIFY_ERR("%s:%u: [tweak]: %s: invalid key", path, lineno, key);
return false; return false;
@ -2396,6 +2404,7 @@ config_load(struct config *conf, const char *conf_path,
.render_timer_log = false, .render_timer_log = false,
.damage_whole_window = false, .damage_whole_window = false,
.box_drawing_base_thickness = 0.04, .box_drawing_base_thickness = 0.04,
.box_drawing_solid_shades = true,
}, },
.notifications = tll_init(), .notifications = tll_init(),

View file

@ -229,6 +229,7 @@ struct config {
uint64_t delayed_render_upper_ns; uint64_t delayed_render_upper_ns;
off_t max_shm_pool_size; off_t max_shm_pool_size;
float box_drawing_base_thickness; float box_drawing_base_thickness;
bool box_drawing_solid_shades;
} tweak; } tweak;
user_notifications_t notifications; user_notifications_t notifications;

View file

@ -809,6 +809,16 @@ any of these options.
larger font (and thus larger cells) result in thicker larger font (and thus larger cells) result in thicker
lines. Default: _0.04_. lines. Default: _0.04_.
*box-drawing-solid-shades*
Boolean. When enabled, box drawing "shades" (e.g. LIGHT SHADE,
MEDIUM SHADE and DARK SHADE) are rendered as solid blocks using a
darker variant of the current foreground color.
When disabled, they are instead rendered as checker box pattern,
using the current foreground color as is.
Default: _yes_.
*delayed-render-lower*, *delayed-render-upper* *delayed-render-lower*, *delayed-render-upper*
These two values control the timeouts (in nanoseconds) that are These two values control the timeouts (in nanoseconds) that are
used to mitigate screen flicker caused by clients writing large, used to mitigate screen flicker caused by clients writing large,