niri: add custom animations for window opening and resizing

Signed-off-by: faukah <fau@faukah.com>
Change-Id: I6a6a69647336104b507fbba5b82de23684e60291
This commit is contained in:
faukah 2025-07-29 22:40:30 +02:00
commit b37855a6b2
4 changed files with 75 additions and 10 deletions

View file

@ -7,7 +7,7 @@
flag,
}:
let
inherit (lib.meta) getExe;
inherit (lib.meta) getExe getExe';
inherit (builtins) readFile;
in
[
@ -127,11 +127,22 @@ in
])
(plain "animations" [
(flag "off")
(plain "window-close" [
(leaf "duration-ms" 250)
(leaf "curve" "linear")
(leaf "custom-shader" <| readFile ./window-close.glsl)
])
(plain "window-open" [
(leaf "duration-ms" 350)
(leaf "curve" "ease-out-quad")
(leaf "custom-shader" <| readFile ./window-open.glsl)
])
# (plain "window-resize" [
# (leaf "duration-ms" 200)
# (leaf "curve" "ease-out-quad")
# (leaf "custom-shader" <| readFile ./window-resize.glsl)
# ])
])
(plain "window-rule" [
@ -152,58 +163,58 @@ in
(plain "binds" [
(plain "XF86AudioRaiseVolume" [
(leaf "spawn" [
"volumectl"
(getExe' pkgs.avizo "volumectl")
"-u"
"up"
])
])
(plain "XF86AudioLowerVolume" [
(leaf "spawn" [
"volumectl"
(getExe' pkgs.avizo "volumectl")
"-u"
"down"
])
])
(plain "XF86AudioMute" [
(leaf "spawn" [
"volumectl"
(getExe' pkgs.avizo "volumectl")
"toggle-mute"
])
])
(plain "XF86AudioMicMute" [
(leaf "spawn" [
"volumectl"
(getExe' pkgs.avizo "volumectl")
"-m"
"toggle-mute"
])
])
(plain "XF86AudioPlay" [
(leaf "spawn" [
"playerctl"
(getExe' pkgs.avizo "playerctl")
"play-pause"
])
])
(plain "XF86AudioNext" [
(leaf "spawn" [
"playerctl"
(getExe' pkgs.avizo "playerctl")
"next"
])
])
(plain "XF86AudioPrev" [
(leaf "spawn" [
"playerctl"
(getExe' pkgs.avizo "playerctl")
"previous"
])
])
(plain "XF86MonBrightnessUp" [
(leaf "spawn" [
"lightctl"
(getExe' pkgs.avizo "lightctl")
"up"
])
])
(plain "XF86MonBrightnessDown" [
(leaf "spawn" [
"lightctl"
(getExe' pkgs.avizo "lightctl")
"down"
])
])

View file

@ -0,0 +1,24 @@
vec4 fall_and_rotate(vec3 coords_geo, vec3 size_geo) {
float progress = niri_clamped_progress * niri_clamped_progress;
vec2 coords = (coords_geo.xy - vec2(0.5, 1.0)) * size_geo.xy;
coords.y -= progress * 1440.0;
float random = (niri_random_seed - 0.5) / 2.0;
random = sign(random) - random;
float max_angle = 0.5 * random;
float angle = progress * max_angle;
mat2 rotate = mat2(cos(angle), -sin(angle), sin(angle), cos(angle));
coords = rotate * coords;
coords_geo = vec3(coords / size_geo.xy + vec2(0.5, 1.0), 1.0);
vec3 coords_tex = niri_geo_to_tex * coords_geo;
vec4 color = texture2D(niri_tex, coords_tex.st);
return color;
}
vec4 close_color(vec3 coords_geo, vec3 size_geo) {
return fall_and_rotate(coords_geo, size_geo);
}

View file

@ -0,0 +1,25 @@
vec4 expanding_circle(vec3 coords_geo, vec3 size_geo) {
vec3 coords_tex = niri_geo_to_tex * coords_geo;
vec4 color = texture2D(niri_tex, coords_tex.st);
vec2 coords = (coords_geo.xy - vec2(0.5, 0.5)) * size_geo.xy * 2.0;
coords = coords / length(size_geo.xy);
float p = niri_clamped_progress;
if (p * p <= dot(coords, coords))
color = vec4(0.0);
return color;
}
vec4 slider(vec3 coords_geo, vec3 size_geo) {
vec3 coords_tex = niri_geo_to_tex * coords_geo;
vec4 color = texture2D(niri_tex, coords_tex.st);
if(coords_geo.x >= niri_clamped_progress) {
color = vec4(0.0);
}
return color;
}
vec4 open_color(vec3 coords_geo, vec3 size_geo) {
return slider(coords_geo, size_geo);
}

View file

@ -0,0 +1,5 @@
vec4 resize_color(vec3 coords_curr_geo, vec3 size_curr_geo) {
vec3 coords_tex_next = niri_geo_to_tex_next * coords_curr_geo;
vec4 color = texture2D(niri_tex_next, coords_tex_next.st);
return color;
}