diff --git a/config/dot/quickshell/config/PreferenceSchema.qml b/config/dot/quickshell/config/PreferenceSchema.qml index fab097c..c708612 100644 --- a/config/dot/quickshell/config/PreferenceSchema.qml +++ b/config/dot/quickshell/config/PreferenceSchema.qml @@ -489,6 +489,42 @@ Singleton { hypr: { path: ["misc", "mouse_move_focuses_monitor"], option: "misc:mouse_move_focuses_monitor", readAs: "bool" } }, + // ── Accessibility ─────────────────────────────────────────────────── + // + // Only what Hyprland can actually deliver. GNOME's sticky keys, slow + // keys, bounce keys and mouse keys are AccessX, an X11 server feature: + // XKB under Wayland has no accessx option group at all (verified + // against evdev.lst), and Hyprland does not implement it. The + // compositor will happily STORE "accessx:enable" as a keyboard option + // and nothing will ever act on it, which is exactly the kind of switch + // this app refuses to ship. + { + key: "magnifierFactor", type: "real", def: 1.0, min: 1.0, max: 5.0, step: 0.1, + group: "accessibility", + label: "Magnifier", + detail: "Magnifies the screen around the pointer. 1.0 is off", + hypr: { path: ["cursor", "zoom_factor"], option: "cursor:zoom_factor", readAs: "float" } + }, + { + key: "magnifierRigid", type: "bool", def: false, group: "accessibility", + label: "Magnifier follows in steps", + detail: "Moves the magnified view in increments rather than gliding with the pointer", + hypr: { path: ["cursor", "zoom_rigid"], option: "cursor:zoom_rigid", readAs: "bool" } + }, + { + key: "dimInactive", type: "bool", def: false, group: "accessibility", + label: "Dim inactive windows", + detail: "Darkens every window except the focused one, so the active window is unmistakable", + hypr: { path: ["decoration", "dim_inactive"], option: "decoration:dim_inactive", readAs: "bool" } + }, + { + key: "dimStrength", type: "real", def: 0.5, min: 0.05, max: 0.9, step: 0.05, + group: "accessibility", + label: "Dim amount", + detail: "How much darker unfocused windows are", + hypr: { path: ["decoration", "dim_strength"], option: "decoration:dim_strength", readAs: "float" } + }, + // ── Night light ───────────────────────────────────────────────────── { key: "nightLightEnabled", type: "bool", def: false, group: "nightLight", diff --git a/config/dot/quickshell/modules/settings/AccessibilityPage.qml b/config/dot/quickshell/modules/settings/AccessibilityPage.qml index 3d5adef..2add626 100644 --- a/config/dot/quickshell/modules/settings/AccessibilityPage.qml +++ b/config/dot/quickshell/modules/settings/AccessibilityPage.qml @@ -37,20 +37,49 @@ SettingsPage { 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: "Contrast" - subtitle: "Unfocused windows can be faded to make the focused one obvious, or left at full strength if that is harder to read." + title: "Magnifier" + subtitle: "Magnifies the screen around the pointer. Set the magnification to 1× to turn it off." - SliderRow { setting: "inactiveOpacity"; divider: false } + SliderRow { setting: "magnifierFactor"; zeroLabel: "Off" } + ToggleRow { setting: "magnifierRigid"; divider: false } } SettingsCard { - title: "System accessibility" - subtitle: "Screen reader, zoom, and on-screen keyboard are provided by GNOME's accessibility stack." + 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: "Opens in GNOME Settings" + detail: "For the parts GNOME's own stack still owns" action: "Open" divider: false onTriggered: SystemSettings.openGnomePanel("universal-access")