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

+5 -5
View File
@@ -79,13 +79,13 @@ Rectangle {
// The dragged row follows the pointer one-to-one; the others ease aside.
Behavior on y {
enabled: !row.dragged
NumberAnimation { duration: 130; easing.type: Easing.OutCubic }
NumberAnimation { duration: Style.duration(130); easing.type: Easing.OutCubic }
}
}
]
z: dragged ? 2 : 0
opacity: dragged ? 0.9 : 1
Behavior on opacity { NumberAnimation { duration: 120 } }
Behavior on opacity { NumberAnimation { duration: Style.duration(120) } }
HoverHandler { id: rowHover }
@@ -219,7 +219,7 @@ Rectangle {
spacing: Style.spacing.sm
opacity: parent.greeting ? 0 : 1
visible: opacity > 0
Behavior on opacity { NumberAnimation { duration: 110 } }
Behavior on opacity { NumberAnimation { duration: Style.duration(110) } }
Caption {
text: row.ready ? row.rowData.date : "\u2026"
@@ -242,7 +242,7 @@ Rectangle {
spacing: Style.space(5)
opacity: parent.greeting ? 1 : 0
visible: opacity > 0
Behavior on opacity { NumberAnimation { duration: 110 } }
Behavior on opacity { NumberAnimation { duration: Style.duration(110) } }
// Non-Latin scripts fall back per character through fontconfig.
Caption {
@@ -304,7 +304,7 @@ Rectangle {
// Shown on the keyboard's pick too, so Delete's target is plain.
opacity: row.removable && row.lit ? 1 : 0
visible: opacity > 0
Behavior on opacity { NumberAnimation { duration: 120 } }
Behavior on opacity { NumberAnimation { duration: Style.duration(120) } }
onClicked: row.panel.removeCityAt(row.index)
}