It is the system settings app for this desktop, so it is named the way one is. The window is "Settings", the titlebar is "Settings", the wordmark above the search field is gone, the sidebar's last row is "About", and the status line reads "Desktop is healthy". Prose followed the same rule. Forty-odd strings explained what "Panama" does -- "Panama never animates while idle", "Restore Panama defaults", "Panama looks in ~/Pictures/Wallpapers" -- which is how a product describes itself, not how a settings panel describes a setting. They now say what happens. No user-visible "Panama" remains anywhere in the app. Two consequences worth naming: The SUPER+I shortcut's description is user-visible, because the Shortcuts page is generated from it, so that is renamed too. Rebindings are keyed by shipped chord rather than description, so no existing override is orphaned by this. Three contracts matched the window by title and one matched that shortcut by description; all four are updated. There are no Hyprland window rules keyed on the title, so nothing about the window's placement changes. The desktop entry is now Name=Settings, but the FILE keeps its panama-settings name, as does the icon: the dock pins applications by desktop id, and renaming the file would silently unpin it. dock-pins-contract covers exactly that. The dated design docs under docs/superpowers keep the old name. They are a record of what was decided when, and editing them to agree with the present would make them lie about the past. Claude-Session: https://claude.ai/code/session_01BRvzt4H8XXLPVH5MyYdk9L
104 lines
3.8 KiB
QML
104 lines
3.8 KiB
QML
// Privacy & Security.
|
|
//
|
|
// GNOME's Privacy panel covers screen lock, camera and microphone access, file
|
|
// history, trash, and device security. Panama covers the parts it genuinely
|
|
// owns and is explicit about the parts it does not.
|
|
//
|
|
// The file-history and trash settings are the notable omission, and the reason
|
|
// is worth stating: those are GNOME preferences enforced by gsd-housekeeping,
|
|
// which is not running in a Hyprland session. Offering switches for them would
|
|
// store a preference, change nothing, and give no sign of it -- the exact
|
|
// failure this codebase keeps designing against. So they are delegated by name
|
|
// rather than reimplemented as controls that lie.
|
|
|
|
import QtQuick
|
|
import qs.config
|
|
import qs.services
|
|
|
|
SettingsPage {
|
|
id: root
|
|
|
|
title: "Privacy & Security"
|
|
lede: DeviceSecurity.scanned && DeviceSecurity.attentionCount === 0
|
|
? "Screen lock, device access, and a machine whose security settings all check out."
|
|
: "Screen lock, which applications can see you, and how this machine is protected."
|
|
|
|
Component.onCompleted: if (!DeviceSecurity.scanned) DeviceSecurity.refresh()
|
|
|
|
SettingsCard {
|
|
title: "Screen lock"
|
|
subtitle: "The same settings as Power & Lock, which is where the idle timings live."
|
|
|
|
SliderRow { setting: "lockMinutes"; zeroLabel: "Never" }
|
|
ToggleRow { setting: "lockOnSleep"; divider: false }
|
|
}
|
|
|
|
SettingsCard {
|
|
title: "Camera & microphone"
|
|
subtitle: PrivacyState.anyActive
|
|
? "In use right now — the bar shows an indicator whenever this is true."
|
|
: "Nothing is using your camera or microphone."
|
|
|
|
TextRow {
|
|
label: "Camera"
|
|
detail: PrivacyState.cameraActive
|
|
? "In use by " + (PrivacyState.cameraApp || "an application")
|
|
: "Not in use"
|
|
value: PrivacyState.cameraActive ? "Active" : "Idle"
|
|
}
|
|
|
|
TextRow {
|
|
label: "Microphone"
|
|
detail: PrivacyState.microphoneActive
|
|
? "In use by " + (PrivacyState.microphoneApp || "an application")
|
|
: "Not in use"
|
|
value: PrivacyState.microphoneActive ? "Active" : "Idle"
|
|
}
|
|
|
|
TextRow {
|
|
label: "Screen sharing"
|
|
detail: PrivacyState.screenSharingActive
|
|
? "Being shared by " + (PrivacyState.screenSharingApp || "an application")
|
|
: "Not being shared"
|
|
value: PrivacyState.screenSharingActive ? "Active" : "Idle"
|
|
divider: false
|
|
}
|
|
}
|
|
|
|
SettingsCard {
|
|
title: "Device security"
|
|
subtitle: DeviceSecurity.attentionCount === 0
|
|
? "Everything below is in its recommended state."
|
|
: DeviceSecurity.attentionCount + " item"
|
|
+ (DeviceSecurity.attentionCount === 1 ? "" : "s") + " below may deserve attention."
|
|
|
|
Repeater {
|
|
model: DeviceSecurity.facts
|
|
|
|
TextRow {
|
|
id: factRow
|
|
required property var modelData
|
|
required property int index
|
|
|
|
label: factRow.modelData.label
|
|
detail: factRow.modelData.detail
|
|
value: factRow.modelData.value
|
|
divider: factRow.index < DeviceSecurity.facts.length - 1
|
|
}
|
|
}
|
|
}
|
|
|
|
SettingsCard {
|
|
title: "Owned by Fedora"
|
|
subtitle: "File history and trash retention are GNOME preferences, applied by a housekeeping service that does not run in a Hyprland session. They are not offered as switches here, because storing that preference would change nothing."
|
|
|
|
ActionRow {
|
|
label: "File history & trash"
|
|
detail: "Opens GNOME Settings, which owns these"
|
|
action: "Open privacy"
|
|
divider: false
|
|
onTriggered: SystemSettings.openGnomePanel("privacy")
|
|
}
|
|
}
|
|
}
|