Two of the three panels still handed to GNOME, having actually checked each rather than repeating that they were not worth owning. Universal Access turned out to be mostly ours already: the magnifier, pointer size, text scale, motion and dimming were all present. High contrast was the real gap. It reaches GTK4 applications through the desktop portal, which republishes GNOME's accessibility setting as org.freedesktop.appearance contrast -- so no high-contrast theme is involved, and none is installed here. Verified end to end: committing the preference drove gsettings and the portal reported contrast 1. Sticky, slow and bounce keys stay absent. There is no Wayland or Hyprland implementation, and the compositor would store the XKB option while nothing ever acted on it. Remote desktop gained port, view-only, and clearing stored credentials. SETTING credentials opens a terminal running grdctl, which prompts for the password itself. That is not a hand-off for lack of effort: grdctl takes the password on a terminal and core-dumps without one, and the only alternative -- passing it as an argument -- would publish it through /proc to every process on this machine. Typed into grdctl directly it never passes through Panama, and a contract now fails if it ever appears on a command line. Color stays with GNOME, and not for lack of effort either. colord runs here with seven profiles and zero devices registered, because the daemons that register displays do not run under this session, and Hyprland exposes no ICC, gamma, or color-management option at all. A Color page could import a profile, attach it to nothing, and change nothing -- the same failure refused for rollback and printer drivers. Claude-Session: https://claude.ai/code/session_01BRvzt4H8XXLPVH5MyYdk9L
100 lines
3.8 KiB
QML
100 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.
|
||
//
|
||
// Sticky keys, slow keys, bounce keys and mouse keys are AccessX, which is
|
||
// an X11 SERVER feature. XKB under Wayland has no accessx option group at
|
||
// all, and Hyprland does not implement one. The compositor will accept
|
||
// "accessx:enable" as a keyboard option and store it, and nothing will ever
|
||
// act on it -- so there is no switch here, and pointing at GNOME's panel
|
||
// would be no better, since the daemon that applies those keys is not
|
||
// running either.
|
||
SettingsCard {
|
||
title: "Keyboard accessibility"
|
||
subtitle: "Sticky, slow and bounce keys are an X11 feature with no Wayland equivalent, so they are unavailable in this session. Offering them here would store a preference that 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"
|
||
onTriggered: SystemSettings.openApplication("orca")
|
||
}
|
||
|
||
ActionRow {
|
||
label: "GNOME accessibility settings"
|
||
detail: "For the parts GNOME's own stack still owns"
|
||
action: "Open"
|
||
divider: false
|
||
onTriggered: SystemSettings.openGnomePanel("universal-access")
|
||
}
|
||
}
|
||
|
||
SettingsCard {
|
||
visible: Accessibility.lastError !== ""
|
||
title: "Could not apply"
|
||
subtitle: Accessibility.lastError
|
||
}
|
||
}
|