Add a no-animations mode, on by default in VMs (#13550)

A machine without a GPU, like most VMs, renders through llvmpipe on the
CPU, where every animated frame and every translucent window costs. In a
VM, opening and closing a terminal took ~5s of CPU; a panel ~3.4s.

omarchy toggle animations (also under Toggle > Animations) places a Hyprland
flag that turns off animations, blur and shadows and makes windows opaque.
The shell follows Hyprland's animations:enabled, rereading it on every
config reload: its one-shot animations run for Style.duration(ms), which
is then 0, and its spinners, pulses and title marquee hold still. A new
install in a VM starts with the flag in place.

Measured in the ISO test VM (llvmpipe), CPU per interaction:
terminal open+close 5000ms -> 481ms, workspace switch 1670ms -> 409ms,
audio panel 3446ms -> 796ms, volume OSD 2324ms -> 584ms, menu 2028ms ->
1241ms.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
David Heinemeier HanssonandClaude Opus 5.5 authored and GitHub committed 2026-09-28 15:46:05 +02:00
1 parent 97a9fce54f
commit b18ab4952b
41 files changed
+201 -79

No files matched your search

+6 -6
View File
@@ -61,7 +61,7 @@ PanelWindow {
onRightValueChanged: expandScale(rightValue)
Behavior on fullScale {
NumberAnimation { duration: 400; easing.type: Easing.OutCubic }
NumberAnimation { duration: Style.duration(400); easing.type: Easing.OutCubic }
}
// The scrim below is a fixed near-black regardless of theme, so text and
@@ -178,7 +178,7 @@ PanelWindow {
onClicked: root.runAgainRequested()
Behavior on opacity {
NumberAnimation { duration: 240; easing.type: Easing.OutCubic }
NumberAnimation { duration: Style.duration(240); easing.type: Easing.OutCubic }
}
}
@@ -236,13 +236,13 @@ PanelWindow {
opacity: engaged ? 1 : 0.5
Behavior on opacity {
NumberAnimation { duration: 240; easing.type: Easing.OutCubic }
NumberAnimation { duration: Style.duration(240); easing.type: Easing.OutCubic }
}
// Live readings land once a second; glide between them rather than snap.
Behavior on shown {
enabled: !ignition.running
NumberAnimation { duration: 600; easing.type: Easing.OutCubic }
NumberAnimation { duration: Style.duration(600); easing.type: Easing.OutCubic }
}
onValueChanged: {
@@ -257,8 +257,8 @@ PanelWindow {
// the live figures take over.
SequentialAnimation {
id: ignition
NumberAnimation { target: dial; property: "shown"; to: dial.fullScale; duration: 550; easing.type: Easing.InOutCubic }
NumberAnimation { target: dial; property: "shown"; to: 0; duration: 650; easing.type: Easing.OutCubic }
NumberAnimation { target: dial; property: "shown"; to: dial.fullScale; duration: Style.duration(550); easing.type: Easing.InOutCubic }
NumberAnimation { target: dial; property: "shown"; to: 0; duration: Style.duration(650); easing.type: Easing.OutCubic }
onFinished: dial.shown = dial.value
}