The audit's first tier, in one change: every case found where the interface
asserted something the system did not do.
Twenty-one compositor-owned preferences -- the whole Mouse & Touchpad page,
plus window layout, snapping, dim-inactive and the magnifier -- had the live
half (hyprctl eval) and not the config-time half, so they quietly reverted on
every hyprctl reload. All 70 hypr-backed keys now have a prefs.get() in the
Lua, and hypr-prefs-contract pins both the presence and that the Lua fallback
equals the schema default, which is how the touchpad page misreported natural
scrolling on first boot.
The idle generator fell back from unwritten battery keys to the AC values
while the Power page displayed the schema defaults: a fresh laptop showed
"suspend at 20 minutes" and generated no suspend listener, then discharged to
zero in a bag. Unwritten keys now use the defaults the page shows
(idle-defaults-contract pins generator to schema; idle-config-contract
re-pinned to the new rule with the tradeoff recorded), and change-settings
enables managed idle on any machine with a battery -- without starting
hypridle in whatever session the installer runs under.
The per-app lock-screen notification switches wrote fields nothing read:
hyprlock cannot render notifications. Removed, with the rule model shrunk to
{enabled}, stale stored fields dropped at normalization, and the contract now
forbidding the page from growing lock-screen switches it cannot honor.
The battery warning thresholds were searchable, documented as "Found on
Power & Lock", and rendered nowhere -- and crossing the low threshold changed
only a glyph's color. Both sliders now exist where search was already sending
people, and low battery publishes a real notification at important priority.
Three handoffs opened GNOME panels that are inert in a Hyprland session. The
keyboard handoff is gone (that panel writes gsettings nothing here reads, and
the working controls sat on the same page); Connectivity gains a Wi-Fi row
that opens GNOME's actual Wi-Fi panel -- hidden SSIDs and 802.1X finally have
a road -- beside the network row that legitimately drives NetworkManager; the
universal-access handoff is gone, its few working toggles being controls this
app already owns. And the accessibility page now gives the true reason sticky
keys are missing: each Wayland compositor implements its own and Hyprland
does not yet -- not "an X11 feature with no Wayland equivalent," which sent
people to the wrong conclusion about the platform.
Claude-Session: https://claude.ai/code/session_01Epx9ZC1gwm81K3jm9x9CKh
94 lines
3.8 KiB
QML
94 lines
3.8 KiB
QML
// Accessibility.
|
||
//
|
||
// Pointer size and text scale have to agree across three consumers that share
|
||
// no configuration system -- the compositor, GTK applications, and the shell.
|
||
// Panama's store is the source of truth and services/Accessibility.qml pushes
|
||
// the value to the other two.
|
||
|
||
import QtQuick
|
||
import qs.config
|
||
import qs.services
|
||
|
||
SettingsPage {
|
||
id: root
|
||
|
||
title: "Accessibility"
|
||
lede: "Make the desktop easier to see and easier to hit."
|
||
|
||
SettingsCard {
|
||
title: "Pointer"
|
||
subtitle: "Applied to the compositor and to applications at the same time."
|
||
|
||
SliderRow { setting: "cursorSize" }
|
||
SliderRow { setting: "cursorInactiveTimeout"; zeroLabel: "Never"; divider: false }
|
||
}
|
||
|
||
SettingsCard {
|
||
title: "Text"
|
||
subtitle: "Scales text in applications. The shell's own panels are drawn at their design size, so they are unaffected."
|
||
|
||
SliderRow { setting: "textScale" }
|
||
// Reaches GTK4 applications through the desktop portal, which
|
||
// republishes it as org.freedesktop.appearance contrast. No
|
||
// high-contrast theme is involved, and none is installed here -- older
|
||
// GTK3 applications will not change.
|
||
ToggleRow { setting: "highContrast"; divider: false }
|
||
}
|
||
|
||
SettingsCard {
|
||
title: "Motion"
|
||
subtitle: "Nothing animates while idle. This affects motion you asked for — windows opening, workspaces sliding, panels appearing."
|
||
|
||
ToggleRow { setting: "animationsEnabled"; divider: false }
|
||
}
|
||
|
||
// Zoom, done by the compositor rather than handed to GNOME. Hyprland has a
|
||
// real magnifier (cursor:zoom_factor) that follows the pointer, so there is
|
||
// no reason to send someone to another application for it.
|
||
SettingsCard {
|
||
title: "Magnifier"
|
||
subtitle: "Magnifies the screen around the pointer. Set the magnification to 1× to turn it off."
|
||
|
||
SliderRow { setting: "magnifierFactor"; zeroLabel: "Off" }
|
||
ToggleRow { setting: "magnifierRigid"; divider: false }
|
||
}
|
||
|
||
SettingsCard {
|
||
title: "Contrast"
|
||
subtitle: "Unfocused windows can be faded or darkened to make the focused one obvious, or left alone if that is harder to read."
|
||
|
||
SliderRow { setting: "inactiveOpacity" }
|
||
ToggleRow { setting: "dimInactive" }
|
||
SliderRow { setting: "dimStrength"; divider: false }
|
||
}
|
||
|
||
// What this session genuinely cannot do, said plainly -- and for the
|
||
// right reason. On Wayland there is no protocol for sticky, slow or
|
||
// bounce keys: each compositor implements its own (mutter does, which is
|
||
// how GNOME has them on Wayland), and Hyprland does not yet. An earlier
|
||
// version blamed "X11 feature with no Wayland equivalent", which sent
|
||
// anyone who needs sticky keys to the wrong conclusion about the whole
|
||
// platform. There is also deliberately no handoff to GNOME's
|
||
// universal-access panel: its toggles are applied by GNOME Shell, and
|
||
// the few that work through plain gsettings (cursor size, text scale,
|
||
// high contrast) are owned by the controls above on this very page.
|
||
SettingsCard {
|
||
title: "Keyboard accessibility"
|
||
subtitle: "Sticky, slow and bounce keys are implemented by each Wayland compositor for itself; Hyprland does not implement them yet, so they are unavailable in this session. Offering switches here would store preferences nothing acts on."
|
||
|
||
ActionRow {
|
||
label: "Screen reader"
|
||
detail: "Orca reads the screen aloud and works over the accessibility bus, which does run here"
|
||
action: "Start Orca"
|
||
divider: false
|
||
onTriggered: SystemSettings.openApplication("orca")
|
||
}
|
||
}
|
||
|
||
SettingsCard {
|
||
visible: Accessibility.lastError !== ""
|
||
title: "Could not apply"
|
||
subtitle: Accessibility.lastError
|
||
}
|
||
}
|