mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-13 04:27:47 -05:00
csd: add support for a visible border
When we’re using CSDs, we’ve up until now rendered a 5px invisible border. This border handles interactive resizing. I.e. hovering it changes the mouse cursor, and mouse button events are used to start an interactive resize. This patch makes it possible to color part of (or the entire) border, with a configurable color. To facilitate this, two new options have been added: * csd.border-width * csd.border-color border-width defaults to 0, resulting in the look we’re used to. border-color defaults to the title bar color. If the title bar color hasn’t been set, it defaults to the default foreground color (just like the title bar color does). This means that, setting border-width but not border-color, results in a border that blends with the title bar.
This commit is contained in:
parent
eebec8e38d
commit
5e4de143de
6 changed files with 99 additions and 7 deletions
59
render.c
59
render.c
|
|
@ -1508,7 +1508,8 @@ get_csd_data(const struct terminal *term, enum csd_surface surf_idx)
|
|||
|
||||
/* Only title bar is rendered in maximized mode */
|
||||
const int border_width = !term->window->is_maximized
|
||||
? term->conf->csd.border_width * term->scale : 0;
|
||||
? max(term->conf->csd.border_width,
|
||||
term->conf->csd.border_width_visible) * term->scale : 0;
|
||||
|
||||
const int title_height = term->window->is_fullscreen
|
||||
? 0
|
||||
|
|
@ -1565,12 +1566,12 @@ render_csd_part(struct terminal *term,
|
|||
{
|
||||
xassert(term->window->csd_mode == CSD_YES);
|
||||
|
||||
pixman_image_t *src = pixman_image_create_solid_fill(color);
|
||||
//pixman_image_t *src = pixman_image_create_solid_fill(color);
|
||||
|
||||
pixman_image_fill_rectangles(
|
||||
PIXMAN_OP_SRC, buf->pix[0], color, 1,
|
||||
&(pixman_rectangle16_t){0, 0, buf->width, buf->height});
|
||||
pixman_image_unref(src);
|
||||
//pixman_image_unref(src);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -1729,8 +1730,56 @@ render_csd_border(struct terminal *term, enum csd_surface surf_idx,
|
|||
xassert(info->width % term->scale == 0);
|
||||
xassert(info->height % term->scale == 0);
|
||||
|
||||
pixman_color_t color = color_hex_to_pixman_with_alpha(0, 0);
|
||||
render_csd_part(term, surf, buf, info->width, info->height, &color);
|
||||
{
|
||||
pixman_color_t color = color_hex_to_pixman_with_alpha(0, 0);
|
||||
render_csd_part(term, surf, buf, info->width, info->height, &color);
|
||||
}
|
||||
|
||||
/*
|
||||
* The “visible” border.
|
||||
*/
|
||||
|
||||
int bwidth = term->conf->csd.border_width; /* Full border size */
|
||||
int vwidth = term->conf->csd.border_width_visible; /* Visibls size */
|
||||
|
||||
if (vwidth > 0) {
|
||||
|
||||
const struct config *conf = term->conf;
|
||||
int x = 0, y = 0, w = 0, h = 0;
|
||||
|
||||
switch (surf_idx) {
|
||||
case CSD_SURF_TOP:
|
||||
case CSD_SURF_BOTTOM:
|
||||
x = bwidth - vwidth;
|
||||
y = surf_idx == CSD_SURF_TOP ? info->height - vwidth : 0;
|
||||
w = info->width - 2 * x;
|
||||
h = vwidth;
|
||||
break;
|
||||
|
||||
case CSD_SURF_LEFT:
|
||||
case CSD_SURF_RIGHT:
|
||||
x = surf_idx == CSD_SURF_LEFT ? bwidth - vwidth : 0;
|
||||
y = 0;
|
||||
w = vwidth;
|
||||
h = info->height;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
uint32_t _color =
|
||||
conf->csd.color.border_set ? conf->csd.color.border :
|
||||
conf->csd.color.title_set ? conf->csd.color.title :
|
||||
0xffu << 24 | term->conf->colors.fg;
|
||||
uint16_t alpha = _color >> 24 | (_color >> 24 << 8);
|
||||
pixman_color_t color = color_hex_to_pixman_with_alpha(_color, alpha);
|
||||
|
||||
pixman_image_fill_rectangles(
|
||||
PIXMAN_OP_SRC, buf->pix[0], &color, 1,
|
||||
&(pixman_rectangle16_t){x, y, w, h});
|
||||
}
|
||||
|
||||
csd_commit(term, surf, buf);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue