Fix background_tint not applying to window margins and padding

Fixes #3933
This commit is contained in:
Kovid Goyal 2022-10-03 19:16:56 +05:30
parent 1402c5bbfa
commit cf22729dfa
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
6 changed files with 30 additions and 15 deletions

View File

@ -46,6 +46,8 @@ Detailed list of changes
- Tab bar: Improve empty space management when some tabs have short titles, allocate the saved space to the active tab (:iss:`5548`) - Tab bar: Improve empty space management when some tabs have short titles, allocate the saved space to the active tab (:iss:`5548`)
- Fix :opt:`background_tint` not applying to window margins and padding (:iss:`3933`)
0.26.3 [2022-09-22] 0.26.3 [2022-09-22]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -1,8 +1,7 @@
#version GLSL_VERSION #version GLSL_VERSION
uniform float background_opacity; in vec4 color;
in vec3 color;
out vec4 final_color; out vec4 final_color;
void main() { void main() {
final_color = vec4(color * background_opacity, background_opacity); final_color = color;
} }

View File

@ -6,9 +6,11 @@ uniform vec3 inactive_border_color;
uniform vec3 bell_border_color; uniform vec3 bell_border_color;
uniform vec3 tab_bar_bg; uniform vec3 tab_bar_bg;
uniform vec3 tab_bar_margin_color; uniform vec3 tab_bar_margin_color;
uniform float background_opacity;
uniform float tint_opacity, tint_premult;
in vec4 rect; // left, top, right, bottom in vec4 rect; // left, top, right, bottom
in uint rect_color; in uint rect_color;
out vec3 color; out vec4 color;
// indices into the rect vector // indices into the rect vector
const int LEFT = 0; const int LEFT = 0;
@ -35,5 +37,9 @@ void main() {
gl_Position = vec4(rect[pos.x], rect[pos.y], 0, 1); gl_Position = vec4(rect[pos.x], rect[pos.y], 0, 1);
int rc = int(rect_color); int rc = int(rect_color);
vec3 window_bg = vec3(to_color(rect_color >> 24), to_color(rect_color >> 16), to_color(rect_color >> 8)); vec3 window_bg = vec3(to_color(rect_color >> 24), to_color(rect_color >> 16), to_color(rect_color >> 8));
color = W(0, default_bg) + W(1, active_border_color) + W(2, inactive_border_color) + W(3, window_bg) + W(4, bell_border_color) + W(5, tab_bar_bg) + W(6, tab_bar_margin_color); vec3 color3 = W(0, default_bg) + W(1, active_border_color) + W(2, inactive_border_color) + W(3, window_bg) + W(4, bell_border_color) + W(5, tab_bar_bg) + W(6, tab_bar_margin_color);
float is_default_bg = float(rc & 1);
float final_opacity = is_default_bg * tint_opacity + (1 - is_default_bg) * background_opacity;
float final_premult_opacity = is_default_bg * tint_premult + (1 - is_default_bg) * background_opacity;
color = vec4(color3 * final_premult_opacity, final_opacity);
} }

View File

@ -86,7 +86,7 @@ class Borders:
draw_minimal_borders = opts.draw_minimal_borders and max(opts.window_margin_width) < 1 draw_minimal_borders = opts.draw_minimal_borders and max(opts.window_margin_width) < 1
add_borders_rect(self.os_window_id, self.tab_id, 0, 0, 0, 0, BorderColor.default_bg) add_borders_rect(self.os_window_id, self.tab_id, 0, 0, 0, 0, BorderColor.default_bg)
has_background_image = os_window_has_background_image(self.os_window_id) has_background_image = os_window_has_background_image(self.os_window_id)
if not has_background_image: if not has_background_image or opts.background_tint > 0.0:
for br in current_layout.blank_rects: for br in current_layout.blank_rects:
add_borders_rect(self.os_window_id, self.tab_id, *br, BorderColor.default_bg) add_borders_rect(self.os_window_id, self.tab_id, *br, BorderColor.default_bg)
for tbr in tab_bar_rects: for tbr in tab_bar_rects:

View File

@ -1310,11 +1310,10 @@ this option by reloading the config is not supported.
opt('background_tint', '0.0', opt('background_tint', '0.0',
option_type='unit_float', ctype='float', option_type='unit_float', ctype='float',
long_text=''' long_text='''
How much to tint the background image by the background color. The tint is How much to tint the background image by the background color. This option
applied only under the text area, not margin/borders. This option makes it makes it easier to read the text. Tinting is done using the current background
easier to read the text. Tinting is done using the current background color for color for each window. This option applies only if :opt:`background_opacity` is
each window. This option applies only if :opt:`background_opacity` is set and set and transparent windows are supported or :opt:`background_image` is set.
transparent windows are supported or :opt:`background_image` is set.
''' '''
) )

View File

@ -707,7 +707,7 @@ draw_cells_interleaved(ssize_t vao_idx, ssize_t gvao_idx, Screen *screen, OSWind
glUniform1ui(cell_program_layouts[CELL_BG_PROGRAM].draw_bg_bitfield_location, 3); glUniform1ui(cell_program_layouts[CELL_BG_PROGRAM].draw_bg_bitfield_location, 3);
glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, screen->lines * screen->columns); glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, screen->lines * screen->columns);
} else if (OPT(background_tint) > 0) { } else if (OPT(background_tint) > 0) {
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE); BLEND_ONTO_OPAQUE;
draw_tint(false, screen, crd); draw_tint(false, screen, crd);
BLEND_ONTO_OPAQUE; BLEND_ONTO_OPAQUE;
} }
@ -924,7 +924,7 @@ draw_cells(ssize_t vao_idx, ssize_t gvao_idx, const ScreenRenderData *srd, float
// }}} // }}}
// Borders {{{ // Borders {{{
enum BorderUniforms { BORDER_viewport, BORDER_background_opacity, BORDER_default_bg, BORDER_active_border_color, BORDER_inactive_border_color, BORDER_bell_border_color, BORDER_tab_bar_bg, BORDER_tab_bar_margin_color, NUM_BORDER_UNIFORMS }; enum BorderUniforms { BORDER_viewport, BORDER_background_opacity, BORDER_tint_opacity, BORDER_tint_premult, BORDER_default_bg, BORDER_active_border_color, BORDER_inactive_border_color, BORDER_bell_border_color, BORDER_tab_bar_bg, BORDER_tab_bar_margin_color, NUM_BORDER_UNIFORMS };
static GLint border_uniform_locations[NUM_BORDER_UNIFORMS] = {0}; static GLint border_uniform_locations[NUM_BORDER_UNIFORMS] = {0};
static void static void
@ -932,6 +932,8 @@ init_borders_program(void) {
#define SET_LOC(which) border_uniform_locations[BORDER_##which] = get_uniform_location(BORDERS_PROGRAM, #which); #define SET_LOC(which) border_uniform_locations[BORDER_##which] = get_uniform_location(BORDERS_PROGRAM, #which);
SET_LOC(viewport) SET_LOC(viewport)
SET_LOC(background_opacity) SET_LOC(background_opacity)
SET_LOC(tint_opacity)
SET_LOC(tint_premult)
SET_LOC(default_bg) SET_LOC(default_bg)
SET_LOC(active_border_color) SET_LOC(active_border_color)
SET_LOC(inactive_border_color) SET_LOC(inactive_border_color)
@ -956,12 +958,17 @@ create_border_vao(void) {
void void
draw_borders(ssize_t vao_idx, unsigned int num_border_rects, BorderRect *rect_buf, bool rect_data_is_dirty, uint32_t viewport_width, uint32_t viewport_height, color_type active_window_bg, unsigned int num_visible_windows, bool all_windows_have_same_bg, OSWindow *w) { draw_borders(ssize_t vao_idx, unsigned int num_border_rects, BorderRect *rect_buf, bool rect_data_is_dirty, uint32_t viewport_width, uint32_t viewport_height, color_type active_window_bg, unsigned int num_visible_windows, bool all_windows_have_same_bg, OSWindow *w) {
float background_opacity = w->is_semi_transparent ? w->background_opacity: 1.0f;
float tint_opacity = background_opacity;
float tint_premult = background_opacity;
if (has_bgimage(w)) { if (has_bgimage(w)) {
glEnable(GL_BLEND); glEnable(GL_BLEND);
BLEND_ONTO_OPAQUE; BLEND_ONTO_OPAQUE;
draw_bg(w); draw_bg(w);
BLEND_ONTO_OPAQUE; BLEND_ONTO_OPAQUE;
background_opacity = 1.0f;
tint_opacity = OPT(background_tint);
tint_premult = 1.0f;
} }
if (num_border_rects) { if (num_border_rects) {
@ -974,7 +981,9 @@ draw_borders(ssize_t vao_idx, unsigned int num_border_rects, BorderRect *rect_bu
unmap_vao_buffer(vao_idx, 0); unmap_vao_buffer(vao_idx, 0);
} }
#define CV3(x) (((float)((x >> 16) & 0xff))/255.f), (((float)((x >> 8) & 0xff))/255.f), (((float)(x & 0xff))/255.f) #define CV3(x) (((float)((x >> 16) & 0xff))/255.f), (((float)((x >> 8) & 0xff))/255.f), (((float)(x & 0xff))/255.f)
glUniform1f(border_uniform_locations[BORDER_background_opacity], w->is_semi_transparent ? w->background_opacity: 1.0f); glUniform1f(border_uniform_locations[BORDER_background_opacity], background_opacity);
glUniform1f(border_uniform_locations[BORDER_tint_opacity], tint_opacity);
glUniform1f(border_uniform_locations[BORDER_tint_premult], tint_premult);
glUniform3f(border_uniform_locations[BORDER_active_border_color], CV3(OPT(active_border_color))); glUniform3f(border_uniform_locations[BORDER_active_border_color], CV3(OPT(active_border_color)));
glUniform3f(border_uniform_locations[BORDER_inactive_border_color], CV3(OPT(inactive_border_color))); glUniform3f(border_uniform_locations[BORDER_inactive_border_color], CV3(OPT(inactive_border_color)));
glUniform3f(border_uniform_locations[BORDER_bell_border_color], CV3(OPT(bell_border_color))); glUniform3f(border_uniform_locations[BORDER_bell_border_color], CV3(OPT(bell_border_color)));