mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-11-14 12:53:43 +01:00
An animation that moves a window at one pace all the way looks flat, and the stock Geometry Change has one curve, an exponential ease out. The patched effect reads a Curve setting, the name of one of Qt's easing curves. komorebi's styles are those curves with Ease in front, so the look the backend is asked for names the curve as Qt does, and the effect's settings have it next to the duration. A cubic Bezier, which only a configuration can say, is not one of Qt's curves and is an ease out. With the stock effect every style is that ease out. komorebic gets animation-style, for every animation or the movement of windows alone. vm-features puts two curves a few seconds into a 30 s move of the same window and checks that they are in different places. The animation key of komorebi.json takes a style too, for every kind of animation or for one.
96 lines
4.1 KiB
Markdown
96 lines
4.1 KiB
Markdown
# Animation
|
|
|
|
komorebi can have a window slide to its new place when the layout changes, instead of jumping
|
|
there. It does not animate anything itself: a KWin effect, Geometry Change, animates a window
|
|
that a program or a script moves or resizes, and komorebi tells it how long the animation lasts
|
|
and how it eases.
|
|
Animation is off by default.
|
|
|
|
## Installing the effect
|
|
|
|
The effect is not part of KWin, and KWin finds effects when it starts: log out and in again after
|
|
installing it. On NixOS the flake's module installs it with komorebi, which is what
|
|
`services.komorebi.effects.animation.enable` does (it is on by default); the effect is built so
|
|
that KWin does not load it until komorebi asks.
|
|
[`installation.md`](../installation.md) has the module's options.
|
|
|
|
komorebi loads the effect when animation is turned on, and unloads it when it is turned off or
|
|
komorebi exits. A machine that does not have the effect has no animation: komorebi says so once
|
|
in its log, and windows jump to their places.
|
|
|
|
## Turning it on, and how long it lasts
|
|
|
|
[`komorebic animation`](../cli/animation.md) turns animation on or off, and
|
|
[`komorebic animation-duration`](../cli/animation-duration.md) sets how long it lasts, in
|
|
milliseconds: 250 by default.
|
|
|
|
```sh
|
|
komorebic animation enable
|
|
komorebic animation-duration 400
|
|
komorebic animation disable
|
|
```
|
|
|
|
Both take `--animation-type movement` to set the animation of windows going to their places apart
|
|
from the global setting, which is how the settings of one kind of animation win over the global
|
|
ones. Movement is the only kind there is. A global setting takes the settings of the kinds away.
|
|
|
|
```sh
|
|
komorebic animation enable --animation-type movement
|
|
komorebic animation-duration 600 --animation-type movement
|
|
```
|
|
|
|
[`komorebic animation-fps`](../cli/animation-fps.md) is accepted and does nothing: KWin animates
|
|
at the refresh rate of the screen.
|
|
|
|
## Easing
|
|
|
|
[`komorebic animation-style`](../cli/animation-style.md) sets the curve a window follows to its
|
|
place: `linear` by default, or one of the easings by name (`ease-out-expo`, `ease-in-out-sine`,
|
|
`ease-out-bounce`, ...; `komorebic animation-style --help` lists them). They are Qt's easing
|
|
curves, and a style is Qt's name for the curve with the "Ease" taken off (`EaseInOutSine` is
|
|
`InOutSine`). Like the others, it takes `--animation-type movement`.
|
|
|
|
```sh
|
|
komorebic animation-style --style ease-out-expo
|
|
komorebic animation-style --style ease-in-out-sine --animation-type movement
|
|
```
|
|
|
|
The stock Geometry Change always eases out exponentially. The build the flake installs also reads
|
|
the curve, which is what lets a style other than that one take effect; with the stock effect every
|
|
style looks like an ease out. A cubic Bézier, which only a configuration can name, is not one of
|
|
Qt's curves and is drawn as an ease out too.
|
|
|
|
## In komorebi.json
|
|
|
|
The `animation` key of [`komorebi.json`](configuration.md#animation) has the same settings:
|
|
`enabled`, `duration` and `style`, each either one value for every kind of animation or a value
|
|
for each kind (`{ "movement": true }`), and `fps`.
|
|
|
|
```json
|
|
{
|
|
"animation": {
|
|
"enabled": true,
|
|
"duration": 400,
|
|
"style": "EaseOutExpo"
|
|
}
|
|
}
|
|
```
|
|
|
|
The file sets them when the daemon starts and when the file changes. A file without the key leaves
|
|
the settings as they are, and one with it that leaves out `duration` or `style` leaves that one as
|
|
it is.
|
|
|
|
## What is animated
|
|
|
|
What is painted moves; the window does not. The frame KWin reports for a window, and so the frame
|
|
komorebi reads back, is the final one from the start of the animation, so komorebi never waits for
|
|
an animation to end. The window is not cross-faded as it changes size: it is a move and a resize,
|
|
not a change of what the window shows. An interactive move or resize by the user is not animated.
|
|
While the effect is loaded, windows that other programs move are animated too.
|
|
|
|
## What is put back
|
|
|
|
The effect keeps its settings in the user's `kwinrc`, in the group
|
|
`[Effect-kwin4_effect_geometry_change]`. komorebi writes them when it asks for the animation, and
|
|
when it exits or animation is turned off it puts back what the user had there.
|