// Input & Shortcuts. // // The shortcut list is generated from `hyprctl binds -j` rather than typed out // here. The previous version was a hand-maintained array of nineteen entries // against a real keymap of a hundred and thirteen: it could not show the rest, // and it went stale the moment a bind changed. Every bind now carries its own // description in hypr/keybinds.lua, and this page just groups and renders them. // // The hardware settings above the list are real controls. Keyboard layout, // repeat behaviour, and pointer response are Hyprland's, so Panama owns them; // device-specific configuration stays with GNOME. import QtQuick import qs.config import qs.services SettingsPage { id: root title: "Input & Shortcuts" lede: "The Forge mental model, carried forward into native tiling." SettingsCard { title: "Keyboard" SliderRow { setting: "keyRepeatDelay" } SliderRow { setting: "keyRepeatRate" } ToggleRow { setting: "numlockByDefault"; divider: false } } SettingsCard { title: "Pointer" ChoiceRow { setting: "followMouse" } SliderRow { setting: "pointerSensitivity" } SliderRow { setting: "cursorInactiveTimeout"; zeroLabel: "Never"; divider: false } } SettingsCard { title: "Hardware input" ActionRow { label: "Mouse, touchpad, and keyboard devices" detail: "Device-specific settings stay with Fedora's hardware-backed panels" action: "Open keyboard" divider: false onTriggered: SystemSettings.openGnomePanel("keyboard") } } // One card per group, built from what the compositor actually has bound. // // Both Repeaters address their model through an explicit id. Inside a // SettingsCard the surrounding `parent` is the card's internal Column, not // the card, so `parent.modelData` is undefined there and the rows silently // never appear -- the cards render with their heading and nothing under it. Repeater { model: Keybinds.grouped() SettingsCard { id: groupCard required property var modelData title: groupCard.modelData.name subtitle: groupCard.modelData.binds.length === 1 ? "1 shortcut" : `${groupCard.modelData.binds.length} shortcuts` Repeater { id: bindRows model: groupCard.modelData.binds TextRow { required property var modelData required property int index label: modelData.description value: modelData.chord controlWidth: 230 divider: index < bindRows.count - 1 } } } } SettingsCard { visible: Keybinds.lastError !== "" title: "Shortcuts unavailable" subtitle: Keybinds.lastError ActionRow { label: "Read the keymap again" detail: "Shortcuts are read from the running compositor" action: "Retry" divider: false onTriggered: Keybinds.refresh() } } }