// Copyright (C) 2026 Danilo M. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as // published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. pragma Singleton import Quickshell import Quickshell.Io import QtQuick import "Logic.js" as Logic // What is capturing: microphone, camera, location, screen. Polled every 2s // from privacy.sh, the same cadence class as the waybar module it replaces. Singleton { id: root property bool mic: false property bool cam: false property bool loc: false property bool scr: false // Theme property names of the active kinds, fixed order. readonly property var roles: Logic.privacyRoles(mic, cam, loc, scr) Process { id: proc command: ["sh", `${Quickshell.shellDir}/island/privacy.sh`] stdout: StdioCollector { onStreamFinished: { const b = text.trim().split(" "); // Anything but four fields is a broken run, not "nothing is // capturing": keep the last good reading. if (b.length !== 4) return; root.mic = b[0] === "1"; root.cam = b[1] === "1"; root.loc = b[2] === "1"; root.scr = b[3] === "1"; } } } Timer { interval: 2000 running: true repeat: true triggeredOnStart: true // A Process already running ignores running = true (AGENTS.md). onTriggered: { proc.running = false; proc.running = true; } } }