opt: avoid opacity flickering in focus animation when open new window

This commit is contained in:
DreamMaoMao 2026-02-04 09:45:26 +08:00
parent 8c6e19c41e
commit 3cb7616db1
3 changed files with 25 additions and 34 deletions

View file

@ -926,20 +926,11 @@ void client_set_focused_opacity_animation(Client *c) {
sizeof(c->opacity_animation.target_border_color));
c->opacity_animation.target_opacity = c->focused_opacity;
c->opacity_animation.time_started = get_now_in_ms();
if (c->opacity_animation.running) {
memcpy(c->opacity_animation.initial_border_color,
c->opacity_animation.current_border_color,
sizeof(c->opacity_animation.initial_border_color));
c->opacity_animation.initial_opacity =
c->opacity_animation.current_opacity;
} else {
memcpy(c->opacity_animation.initial_border_color, bordercolor,
sizeof(c->opacity_animation.initial_border_color));
memcpy(c->opacity_animation.current_border_color, bordercolor,
sizeof(c->opacity_animation.current_border_color));
c->opacity_animation.initial_opacity = c->unfocused_opacity;
c->opacity_animation.current_opacity = c->unfocused_opacity;
}
memcpy(c->opacity_animation.initial_border_color,
c->opacity_animation.current_border_color,
sizeof(c->opacity_animation.initial_border_color));
c->opacity_animation.initial_opacity = c->opacity_animation.current_opacity;
c->opacity_animation.running = true;
}
@ -959,20 +950,10 @@ void client_set_unfocused_opacity_animation(Client *c) {
c->opacity_animation.target_opacity = c->unfocused_opacity;
c->opacity_animation.time_started = get_now_in_ms();
if (c->opacity_animation.running) {
memcpy(c->opacity_animation.initial_border_color,
c->opacity_animation.current_border_color,
sizeof(c->opacity_animation.initial_border_color));
c->opacity_animation.initial_opacity =
c->opacity_animation.current_opacity;
} else {
memcpy(c->opacity_animation.initial_border_color, border_color,
sizeof(c->opacity_animation.initial_border_color));
memcpy(c->opacity_animation.current_border_color, border_color,
sizeof(c->opacity_animation.current_border_color));
c->opacity_animation.initial_opacity = c->focused_opacity;
c->opacity_animation.current_opacity = c->focused_opacity;
}
memcpy(c->opacity_animation.initial_border_color,
c->opacity_animation.current_border_color,
sizeof(c->opacity_animation.initial_border_color));
c->opacity_animation.initial_opacity = c->opacity_animation.current_opacity;
c->opacity_animation.running = true;
}
@ -1007,6 +988,10 @@ bool client_apply_focus_opacity(Client *c) {
if (target_opacity > opacity) {
target_opacity = opacity;
}
memcpy(c->opacity_animation.current_border_color,
c->opacity_animation.target_border_color,
sizeof(c->opacity_animation.current_border_color));
c->opacity_animation.current_opacity = target_opacity;
client_set_opacity(c, target_opacity);
client_set_border_color(c, c->opacity_animation.target_border_color);
} else if (animations && c->opacity_animation.running) {

View file

@ -877,12 +877,12 @@ FuncType parse_func_name(char *func_name, Arg *arg, char *arg_value,
char *arg_value5) {
FuncType func = NULL;
(*arg).i = 0;
(*arg).i2 = 0;
(*arg).f = 0.0f;
(*arg).f2 = 0.0f;
(*arg).ui = 0;
(*arg).ui2 = 0;
(*arg).i = 0;
(*arg).i2 = 0;
(*arg).f = 0.0f;
(*arg).f2 = 0.0f;
(*arg).ui = 0;
(*arg).ui2 = 0;
(*arg).v = NULL;
(*arg).v2 = NULL;
(*arg).v3 = NULL;

View file

@ -3744,6 +3744,12 @@ void init_client_properties(Client *c) {
c->stack_proportion = 0.0f;
c->next_in_stack = NULL;
c->prev_in_stack = NULL;
memcpy(c->opacity_animation.initial_border_color, bordercolor,
sizeof(c->opacity_animation.initial_border_color));
memcpy(c->opacity_animation.current_border_color, bordercolor,
sizeof(c->opacity_animation.current_border_color));
c->opacity_animation.initial_opacity = c->unfocused_opacity;
c->opacity_animation.current_opacity = c->unfocused_opacity;
}
void // old fix to 0.5