From 1432d75bb61f6e715594e515142761e949dcf1fd Mon Sep 17 00:00:00 2001 From: Aiden Gerbrandt Date: Tue, 17 Feb 2026 21:43:15 -0600 Subject: [PATCH] update --- .../plugins/privacy-indicator/BarWidget.qml | 172 +---------- .../plugins/privacy-indicator/Main.qml | 282 ++++++++++++++++++ .../plugins/privacy-indicator/Panel.qml | 169 +++++++++++ .../plugins/privacy-indicator/i18n/de.json | 27 +- .../plugins/privacy-indicator/i18n/en.json | 16 +- .../plugins/privacy-indicator/i18n/es.json | 27 +- .../plugins/privacy-indicator/i18n/fr.json | 27 +- .../plugins/privacy-indicator/i18n/hu.json | 27 +- .../plugins/privacy-indicator/i18n/it.json | 27 +- .../plugins/privacy-indicator/i18n/ja.json | 27 +- .../plugins/privacy-indicator/i18n/ku.json | 27 +- .../plugins/privacy-indicator/i18n/nl.json | 27 +- .../plugins/privacy-indicator/i18n/pl.json | 27 +- .../plugins/privacy-indicator/i18n/pt.json | 27 +- .../plugins/privacy-indicator/i18n/ru.json | 27 +- .../plugins/privacy-indicator/i18n/tr.json | 27 +- .../plugins/privacy-indicator/i18n/uk-UA.json | 27 +- .../plugins/privacy-indicator/i18n/zh-CN.json | 27 +- .../plugins/privacy-indicator/i18n/zh-TW.json | 27 +- .../plugins/privacy-indicator/manifest.json | 12 +- .../plugins/privacy-indicator/preview.png | Bin 22671 -> 26449 bytes home/aiden/.config/noctalia/settings.json | 275 +++++++++++++---- 22 files changed, 1088 insertions(+), 243 deletions(-) create mode 100644 home/aiden/.config/noctalia/plugins/privacy-indicator/Main.qml create mode 100644 home/aiden/.config/noctalia/plugins/privacy-indicator/Panel.qml diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/BarWidget.qml b/home/aiden/.config/noctalia/plugins/privacy-indicator/BarWidget.qml index dbe1fd2..393c521 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/BarWidget.qml +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/BarWidget.qml @@ -2,10 +2,7 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts import Quickshell -import Quickshell.Io -import Quickshell.Services.Pipewire import qs.Commons -import qs.Modules.Bar.Extras import qs.Services.UI import qs.Widgets @@ -26,12 +23,15 @@ Item { readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screenName) readonly property real barFontSize: Style.getBarFontSizeForScreen(screenName) - property bool micActive: false - property bool camActive: false - property bool scrActive: false - property var micApps: [] - property var camApps: [] - property var scrApps: [] + // Access main instance for state + readonly property var mainInstance: pluginApi?.mainInstance + + property bool micActive: mainInstance ? mainInstance.micActive : false + property bool camActive: mainInstance ? mainInstance.camActive : false + property bool scrActive: mainInstance ? mainInstance.scrActive : false + property var micApps: mainInstance ? mainInstance.micApps : [] + property var camApps: mainInstance ? mainInstance.camApps : [] + property var scrApps: mainInstance ? mainInstance.scrApps : [] property var cfg: pluginApi?.pluginSettings || ({}) property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({}) @@ -63,156 +63,6 @@ Item { visible: root.isVisible opacity: root.isVisible ? 1.0 : 0.0 - PwObjectTracker { - objects: Pipewire.ready ? Pipewire.nodes.values : [] - } - - Process { - id: cameraCheckProcess - running: false - - command: ["sh", "-c", "for dev in /dev/video*; do [ -e \"$dev\" ] && [ -n \"$(find /proc/[0-9]*/fd/ -lname \"$dev\" 2>/dev/null | head -n1)\" ] && echo \"active\" && exit 0; done; exit 1"] - - onExited: (code, status) => { - var isActive = code === 0; - root.camActive = isActive; - - if (isActive) { - cameraAppsProcess.running = true; - } else { - root.camApps = []; - } - } - } - - Process { - id: cameraAppsProcess - running: false - - command: ["sh", "-c", "for dev in /dev/video*; do [ -e \"$dev\" ] && for fd in /proc/[0-9]*/fd/*; do [ -L \"$fd\" ] && [ \"$(readlink \"$fd\" 2>/dev/null)\" = \"$dev\" ] && ps -p \"$(echo \"$fd\" | cut -d/ -f3)\" -o comm= 2>/dev/null; done; done | sort -u | tr '\\n' ',' | sed 's/,$//'"] - - onExited: (code, status) => { - if (stdout) { - var appsString = stdout.trim(); - var apps = appsString.length > 0 ? appsString.split(',') : []; - root.camApps = apps; - } else { - root.camApps = []; - } - } - } - - Timer { - interval: 1000 - repeat: true - running: true - triggeredOnStart: true - onTriggered: updatePrivacyState() - } - - function hasNodeLinks(node, links) { - for (var i = 0; i < links.length; i++) { - var link = links[i]; - if (link && (link.source === node || link.target === node)) { - return true; - } - } - return false; - } - - function getAppName(node) { - return node.properties["application.name"] || node.nickname || node.name || ""; - } - - function updateMicrophoneState(nodes, links) { - var appNames = []; - var isActive = false; - - for (var i = 0; i < nodes.length; i++) { - var node = nodes[i]; - if (!node || !node.isStream || !node.audio || node.isSink) continue; - if (!hasNodeLinks(node, links) || !node.properties) continue; - - var mediaClass = node.properties["media.class"] || ""; - if (mediaClass === "Stream/Input/Audio") { - if (node.properties["stream.capture.sink"] === "true") { - continue; - } - - isActive = true; - var appName = getAppName(node); - if (appName && appNames.indexOf(appName) === -1) { - appNames.push(appName); - } - } - } - - root.micActive = isActive; - root.micApps = appNames; - } - - function updateCameraState() { - cameraCheckProcess.running = true; - } - - function isScreenShareNode(node) { - if (!node.properties) { - return false; - } - - var mediaClass = node.properties["media.class"] || ""; - - if (mediaClass.indexOf("Audio") >= 0) { - return false; - } - - if (mediaClass.indexOf("Video") === -1) { - return false; - } - - var mediaName = (node.properties["media.name"] || "").toLowerCase(); - - if (mediaName.match(/^(xdph-streaming|gsr-default|game capture|screen|desktop|display|cast|webrtc|v4l2)/) || - mediaName === "gsr-default_output" || - mediaName.match(/screen-cast|screen-capture|desktop-capture|monitor-capture|window-capture|game-capture/i)) { - return true; - } - - return false; - } - - function updateScreenShareState(nodes, links) { - var appNames = []; - var isActive = false; - - for (var i = 0; i < nodes.length; i++) { - var node = nodes[i]; - if (!node || !hasNodeLinks(node, links) || !node.properties) continue; - - if (isScreenShareNode(node)) { - isActive = true; - var appName = getAppName(node); - if (appName && appNames.indexOf(appName) === -1) { - appNames.push(appName); - } - } - } - - root.scrActive = isActive; - root.scrApps = appNames; - } - - function updatePrivacyState() { - if (!Pipewire.ready) return; - - var nodes = Pipewire.nodes.values || []; - var links = Pipewire.links.values || []; - - updateMicrophoneState(nodes, links); - updateCameraState(); - updateScreenShareState(nodes, links); - } - function buildTooltip() { var parts = []; @@ -301,12 +151,14 @@ Item { MouseArea { anchors.fill: parent - acceptedButtons: Qt.RightButton + acceptedButtons: Qt.RightButton | Qt.LeftButton hoverEnabled: true onClicked: function (mouse) { if (mouse.button === Qt.RightButton) { PanelService.showContextMenu(contextMenu, root, screen); + } else if (mouse.button === Qt.LeftButton) { + if (pluginApi) pluginApi.openPanel(root.screen, root); } } diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/Main.qml b/home/aiden/.config/noctalia/plugins/privacy-indicator/Main.qml new file mode 100644 index 0000000..64d618e --- /dev/null +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/Main.qml @@ -0,0 +1,282 @@ +import QtQuick +import Quickshell +import Quickshell.Io +import Quickshell.Services.Pipewire +import qs.Commons +import qs.Services.UI + +Item { + id: root + property var pluginApi: null + + // --- Logic extracted from BarWidget.qml --- + + property bool micActive: false + property bool camActive: false + property bool scrActive: false + property var micApps: [] + property var camApps: [] + property var scrApps: [] + + property var accessHistory: [] + + // Previous states for history tracking + property var _prevMicApps: [] + property var _prevCamApps: [] + property var _prevScrApps: [] + + PwObjectTracker { + objects: Pipewire.ready ? Pipewire.nodes.values : [] + } + + Process { + id: cameraDetectionProcess + running: false + command: ["sh", "-c", "for dev in /sys/class/video4linux/video*; do [ -e \"$dev/name\" ] && grep -qv 'Metadata' \"$dev/name\" && dev_name=$(basename \"$dev\") && find /proc/[0-9]*/fd -lname \"/dev/$dev_name\" 2>/dev/null; done | cut -d/ -f3 | xargs -r ps -o comm= -p | sort -u | tr '\\n' ',' | sed 's/,$//'"] + stdout: StdioCollector { + onStreamFinished: { + var appsString = this.text.trim(); + var apps = appsString.length > 0 ? appsString.split(',') : []; + root.camApps = apps; + root.camActive = apps.length > 0; + } + } + } + + + Timer { + interval: 1000 + repeat: true + running: true + triggeredOnStart: true + onTriggered: updatePrivacyState() + } + + function hasNodeLinks(node, links) { + for (var i = 0; i < links.length; i++) { + var link = links[i]; + if (link && (link.source === node || link.target === node)) return true; + } + return false; + } + + function getAppName(node) { + return node.properties["application.name"] || node.nickname || node.name || ""; + } + + function updateMicrophoneState(nodes, links) { + var appNames = []; + var isActive = false; + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + if (!node || !node.isStream || !node.audio || node.isSink) continue; + if (!hasNodeLinks(node, links) || !node.properties) continue; + var mediaClass = node.properties["media.class"] || ""; + if (mediaClass === "Stream/Input/Audio") { + if (node.properties["stream.capture.sink"] === "true") continue; + isActive = true; + var appName = getAppName(node); + if (appName && appNames.indexOf(appName) === -1) appNames.push(appName); + } + } + root.micActive = isActive; + root.micApps = appNames; + } + + function updateCameraState() { + cameraDetectionProcess.running = true; + } + + function isScreenShareNode(node) { + if (!node.properties) return false; + var mediaClass = node.properties["media.class"] || ""; + if (mediaClass.indexOf("Audio") >= 0) return false; + if (mediaClass.indexOf("Video") === -1) return false; + var mediaName = (node.properties["media.name"] || "").toLowerCase(); + if (mediaName.match(/^(xdph-streaming|gsr-default|game capture|screen|desktop|display|cast|webrtc|v4l2)/) || + mediaName === "gsr-default_output" || + mediaName.match(/screen-cast|screen-capture|desktop-capture|monitor-capture|window-capture|game-capture/i)) { + return true; + } + return false; + } + + function updateScreenShareState(nodes, links) { + var appNames = []; + var isActive = false; + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + if (!node || !hasNodeLinks(node, links) || !node.properties) continue; + if (isScreenShareNode(node)) { + isActive = true; + var appName = getAppName(node); + if (appName && appNames.indexOf(appName) === -1) appNames.push(appName); + } + } + root.scrActive = isActive; + root.scrApps = appNames; + } + + function updatePrivacyState() { + if (!Pipewire.ready) return; + var nodes = Pipewire.nodes.values || []; + var links = Pipewire.links.values || []; + updateMicrophoneState(nodes, links); + updateCameraState(); + updateScreenShareState(nodes, links); + } + + // --- History Persistence --- + + property string stateFile: "" + property bool isLoaded: false + + Component.onCompleted: { + // Setup state file path + Qt.callLater(() => { + if (typeof Settings !== 'undefined' && Settings.cacheDir) { + stateFile = Settings.cacheDir + "privacy-history.json"; + historyFileView.path = stateFile; + } + }); + } + + FileView { + id: historyFileView + printErrors: false + watchChanges: false + + adapter: JsonAdapter { + id: adapter + property var history: [] + } + + onLoaded: { + root.isLoaded = true; + if (adapter.history) { + // Restore history + root.accessHistory = adapter.history; + } + } + + onLoadFailed: error => { + // If file doesn't exist (error 2), we are ready to save new data + if (error === 2) { + root.isLoaded = true; + } else { + console.error("PrivacyIndicator: Failed to load history file:", error); + root.isLoaded = true; // Try to continue anyway + } + } + } + + function saveHistory() { + if (!stateFile || !isLoaded) return; + + adapter.history = root.accessHistory; + + // Ensure cache directory exists and save + try { + Quickshell.execDetached(["mkdir", "-p", Settings.cacheDir]); + Qt.callLater(() => { + try { + historyFileView.writeAdapter(); + } catch (e) { + console.error("PrivacyIndicator: Failed to save history", e); + } + }); + } catch (e) { + console.error("PrivacyIndicator: Failed to save history", e); + } + } + + function addToHistory(app, type, icon, colorKey, action) { + var time = new Date().toLocaleTimeString(Qt.locale(), Locale.ShortFormat); + var entry = { + "appName": app, + "type": type, + "icon": icon, + "colorKey": colorKey, + "time": time, + "timestamp": Date.now(), + "action": action // "started" or "stopped" + }; + var newHistory = [entry].concat(accessHistory); + if (newHistory.length > 50) newHistory = newHistory.slice(0, 50); // Increased limit as we have more entries now + accessHistory = newHistory; + saveHistory(); + } + + function clearHistory() { + accessHistory = []; + saveHistory(); + } + + function checkAppChanges(newApps, oldApps, type, icon, colorKey) { + if (!newApps && !oldApps) return; + + // Check for new apps (Started) + if (newApps) { + for (var i = 0; i < newApps.length; i++) { + var app = newApps[i]; + if (!oldApps || oldApps.indexOf(app) === -1) { + addToHistory(app, type, icon, colorKey, "started"); + } + } + } + + // Check for removed apps (Stopped) + if (oldApps) { + for (var j = 0; j < oldApps.length; j++) { + var oldApp = oldApps[j]; + if (!newApps || newApps.indexOf(oldApp) === -1) { + addToHistory(oldApp, type, icon, colorKey, "stopped"); + } + } + } + } + + // Get active color from settings or default + property var cfg: pluginApi?.pluginSettings || ({}) + property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({}) + property string activeColorKey: cfg.activeColor ?? defaults.activeColor ?? "primary" + + onMicAppsChanged: { + checkAppChanges(micApps, _prevMicApps, "Microphone", "microphone", activeColorKey); + _prevMicApps = micApps; + } + // Helper to detect activation edge + property bool oldMicActive: false + onMicActiveChanged: { + if (micActive && (!oldMicActive)) { + ToastService.showNotice(pluginApi?.tr("toast.mic-on") || "Microphone is active", "", "microphone"); + } + oldMicActive = micActive + } + + property bool oldCamActive: false + onCamActiveChanged: { + if (camActive && !oldCamActive) { + ToastService.showNotice(pluginApi?.tr("toast.cam-on") || "Camera is active", "", "camera"); + } + oldCamActive = camActive + } + onCamAppsChanged: { + checkAppChanges(camApps, _prevCamApps, "Camera", "camera", activeColorKey); + _prevCamApps = camApps; + } + + property bool oldScrActive: false + onScrActiveChanged: { + if (scrActive && !oldScrActive) { + ToastService.showNotice(pluginApi?.tr("toast.screen-on") || "Screen sharing is active", "", "screen-share"); + } + oldScrActive = scrActive + } + onScrAppsChanged: { + checkAppChanges(scrApps, _prevScrApps, "Screen", "screen-share", activeColorKey); + _prevScrApps = scrApps; + } + + +} diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/Panel.qml b/home/aiden/.config/noctalia/plugins/privacy-indicator/Panel.qml new file mode 100644 index 0000000..4b16bc7 --- /dev/null +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/Panel.qml @@ -0,0 +1,169 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import Quickshell +import qs.Commons +import qs.Widgets + +Item { + id: root + + property var pluginApi: null + + // Standard panel properties + readonly property var geometryPlaceholder: panelContainer + property real contentPreferredWidth: 320 * Style.uiScaleRatio + property real contentPreferredHeight: 450 * Style.uiScaleRatio + + readonly property var mainInstance: pluginApi?.mainInstance + + Rectangle { + id: panelContainer + anchors.fill: parent + color: "transparent" + + ColumnLayout { + anchors.fill: parent + anchors.margins: Style.marginM + spacing: Style.marginM + + // Header Box + NBox { + Layout.fillWidth: true + Layout.preferredHeight: headerRow.implicitHeight + Style.marginM * 2 + + RowLayout { + id: headerRow + anchors.fill: parent + anchors.margins: Style.marginM + spacing: Style.marginS + + NIcon { + icon: "shield-check" + color: Color.mPrimary + pointSize: Style.fontSizeL + } + + NText { + Layout.fillWidth: true + text: pluginApi?.tr("history.title") || "Access History" + font.weight: Style.fontWeightBold + pointSize: Style.fontSizeL + color: Color.mOnSurface + } + + NIconButton { + icon: "trash" + baseSize: Style.baseWidgetSize * 0.8 + onClicked: { + if (mainInstance) mainInstance.clearHistory(); + } + } + } + } + + + Item { + Layout.fillWidth: true + Layout.fillHeight: true + + NScrollView { + id: scrollView + anchors.fill: parent + horizontalPolicy: ScrollBar.AlwaysOff + verticalPolicy: ScrollBar.AsNeeded + + ColumnLayout { + width: scrollView.availableWidth + spacing: Style.marginS + + Repeater { + model: mainInstance ? mainInstance.accessHistory : [] + + delegate: Rectangle { + Layout.fillWidth: true + implicitHeight: 56 * Style.uiScaleRatio + radius: Style.radiusM + color: Color.mSurfaceVariant + + RowLayout { + anchors.fill: parent + anchors.margins: Style.marginM + spacing: Style.marginM + + Rectangle { + width: 32 * Style.uiScaleRatio + height: 32 * Style.uiScaleRatio + radius: width/2 + color: Qt.alpha(iconColor, 0.1) + + readonly property color iconColor: Color.resolveColorKey(modelData.colorKey || "primary") + + NIcon { + anchors.centerIn: parent + icon: modelData.icon + color: parent.iconColor + pointSize: Style.fontSizeM + } + } + + ColumnLayout { + Layout.fillWidth: true + spacing: 0 + + NText { + Layout.fillWidth: true + text: modelData.appName + elide: Text.ElideRight + font.weight: Style.fontWeightBold + pointSize: Style.fontSizeM + } + + RowLayout { + Layout.fillWidth: true + spacing: Style.marginS + + NText { + text: modelData.time + color: Qt.alpha(Color.mOnSurface, 0.7) + pointSize: Style.fontSizeS + } + + NText { + text: "•" + color: Qt.alpha(Color.mOnSurface, 0.3) + pointSize: Style.fontSizeS + } + + NText { + text: { + const action = modelData.action || "started"; + return pluginApi?.tr("history.action." + action) || action; + } + color: (modelData.action || "started") === "stopped" ? Color.resolveColorKey("error") : Color.resolveColorKey("primary") + font.weight: Style.fontWeightBold + pointSize: Style.fontSizeS + } + } + } + } + } + } + + // Empty state + NText { + Layout.alignment: Qt.AlignHCenter + visible: (!mainInstance || mainInstance.accessHistory.length === 0) + text: pluginApi?.tr("history.empty") || "No recent access" + color: Qt.alpha(Color.mOnSurface, 0.5) + pointSize: Style.fontSizeM + Layout.topMargin: Style.marginL + } + + Item { Layout.fillHeight: true } // spacer + } + } + } + } + } +} diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/de.json b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/de.json index 1b89c25..ddbecfe 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/de.json +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/de.json @@ -11,11 +11,36 @@ "removeMargins": { "desc": "Alle äußeren Ränder des Widgets entfernen.", "label": "Ränder entfernen" + }, + "activeColor": { + "desc": "Farbe der Symbole, wenn sie aktiv sind.", + "label": "Aktive Farbsymbol" + }, + "inactiveColor": { + "desc": "Farbe der Symbole, wenn sie inaktiv sind.", + "label": "Inaktive Farbsymbol" } }, "tooltip": { "cam-on": "Kamera: {apps}", "mic-on": "Mikrofon: {apps}", "screen-on": "Bildschirmfreigabe: {apps}" + }, + "toast": { + "cam-on": "Kamera ist aktiv", + "mic-on": "Mikrofon ist aktiv", + "screen-on": "Bildschirmfreigabe ist aktiv" + }, + "menu": { + "settings": "Widget-Einstellungen" + }, + "history": { + "title": "Zugriffsverlauf", + "empty": "Kein kürzlicher Zugriff", + "clear": "Leeren", + "action": { + "started": "Gestartet", + "stopped": "Beendet" + } } -} +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/en.json b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/en.json index 33366fe..932724e 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/en.json +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/en.json @@ -28,5 +28,19 @@ "cam-on": "Camera: {apps}", "mic-on": "Microphone: {apps}", "screen-on": "Screen sharing: {apps}" + }, + "toast": { + "cam-on": "Camera is active", + "mic-on": "Microphone is active", + "screen-on": "Screen sharing is active" + }, + "history": { + "title": "Access History", + "empty": "No recent access", + "clear": "Clear", + "action": { + "started": "Started", + "stopped": "Stopped" + } } -} +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/es.json b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/es.json index 46d1c86..93a48a7 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/es.json +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/es.json @@ -11,11 +11,36 @@ "removeMargins": { "desc": "Quita todos los márgenes externos del widget.", "label": "Quitar márgenes" + }, + "activeColor": { + "desc": "Color de los iconos cuando están activos.", + "label": "Color de icono activo" + }, + "inactiveColor": { + "desc": "Color de los iconos cuando están inactivos.", + "label": "Color de icono inactivo" } }, "tooltip": { "cam-on": "Cámara: {apps}", "mic-on": "Micrófono: {apps}", "screen-on": "Compartir pantalla: {apps}" + }, + "toast": { + "cam-on": "La cámara está activa", + "mic-on": "El micrófono está activo", + "screen-on": "Compartir pantalla está activo" + }, + "menu": { + "settings": "Configuración del widget" + }, + "history": { + "title": "Historial de acceso", + "empty": "Sin accesos recientes", + "clear": "Borrar", + "action": { + "started": "Iniciado", + "stopped": "Detenido" + } } -} +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/fr.json b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/fr.json index 50a1af0..ab9de44 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/fr.json +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/fr.json @@ -11,11 +11,36 @@ "removeMargins": { "desc": "Supprime toutes les marges extérieures du widget.", "label": "Supprimer les marges" + }, + "activeColor": { + "desc": "Couleur des icônes lorsqu'elles sont actives.", + "label": "Couleur d'icône active" + }, + "inactiveColor": { + "desc": "Couleur des icônes lorsqu'elles sont inactives.", + "label": "Couleur d'icône inactive" } }, "tooltip": { "cam-on": "Caméra: {apps}", "mic-on": "Microphone: {apps}", "screen-on": "Partage d'écran: {apps}" + }, + "toast": { + "cam-on": "La caméra est active", + "mic-on": "Le microphone est actif", + "screen-on": "Le partage d'écran est actif" + }, + "menu": { + "settings": "Paramètres du widget" + }, + "history": { + "title": "Historique d'accès", + "empty": "Aucun accès récent", + "clear": "Effacer", + "action": { + "started": "Démarré", + "stopped": "Arrêté" + } } -} +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/hu.json b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/hu.json index 59606eb..4a7ba8c 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/hu.json +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/hu.json @@ -11,11 +11,36 @@ "removeMargins": { "desc": "Távolítsd el a widget összes külső margóját.", "label": "Margók eltávolítása" + }, + "activeColor": { + "desc": "Az ikonok színe, amikor aktívak.", + "label": "Aktív ikon színe" + }, + "inactiveColor": { + "desc": "Az ikonok színe, amikor inaktívak.", + "label": "Inaktív ikon színe" } }, "tooltip": { "cam-on": "Kamera: {apps}", "mic-on": "Mikrofon: {apps}", "screen-on": "Képernyőmegosztás: {apps}" + }, + "toast": { + "cam-on": "A kamera aktív", + "mic-on": "A mikrofon aktív", + "screen-on": "Képernyőmegosztás aktív" + }, + "menu": { + "settings": "Widget beállítások" + }, + "history": { + "title": "Hozzáférési előzmények", + "empty": "Nincs nemrégiben történt hozzáférés", + "clear": "Törlés", + "action": { + "started": "Elindítva", + "stopped": "Leállítva" + } } -} +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/it.json b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/it.json index 87fb44f..d0eee79 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/it.json +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/it.json @@ -11,11 +11,36 @@ "removeMargins": { "desc": "Rimuove tutti i margini esterni del widget.", "label": "Rimuovi margini" + }, + "activeColor": { + "desc": "Colore delle icone quando sono attive.", + "label": "Colore icona attiva" + }, + "inactiveColor": { + "desc": "Colore delle icone quando sono inattive.", + "label": "Colore icona inattiva" } }, "tooltip": { "cam-on": "Kamera: {apps}", "mic-on": "Mikrofonoa: {apps}", "screen-on": "Ekran-partaĝado: {apps}" + }, + "toast": { + "cam-on": "La fotocamera è attiva", + "mic-on": "Il microfono è attivo", + "screen-on": "La condivisione dello schermo è attiva" + }, + "menu": { + "settings": "Impostazioni widget" + }, + "history": { + "title": "Cronologia accessi", + "empty": "Nessun accesso recente", + "clear": "Pulisci", + "action": { + "started": "Iniziato", + "stopped": "Terminato" + } } -} +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/ja.json b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/ja.json index ffec145..ba61aeb 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/ja.json +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/ja.json @@ -11,11 +11,36 @@ "removeMargins": { "desc": "ウィジェットの外側の余白をすべて削除します。", "label": "余白を削除" + }, + "activeColor": { + "desc": "アクティブ時のアイコンの色。", + "label": "アクティブ時の色" + }, + "inactiveColor": { + "desc": "非アクティブ時のアイコンの色。", + "label": "非アクティブ時の色" } }, "tooltip": { "cam-on": "カメラ: {apps}", "mic-on": "マイク: {apps}", "screen-on": "画面共有: {apps}" + }, + "toast": { + "cam-on": "カメラがアクティブです", + "mic-on": "マイクがアクティブです", + "screen-on": "画面共有がアクティブです" + }, + "menu": { + "settings": "ウィジェット設定" + }, + "history": { + "title": "アクセス履歴", + "empty": "最近のアクセスはありません", + "clear": "クリア", + "action": { + "started": "開始", + "stopped": "停止" + } } -} +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/ku.json b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/ku.json index aa0c8b7..6a58f84 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/ku.json +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/ku.json @@ -11,11 +11,36 @@ "removeMargins": { "desc": "Hemû marjînalên derveyî yên widgetê rake.", "label": "Derdestên derxînin" + }, + "activeColor": { + "desc": "Color of the icons when active.", + "label": "Active icon color" + }, + "inactiveColor": { + "desc": "Color of the icons when inactive.", + "label": "Inactive icon color" } }, "tooltip": { "cam-on": "Kamera: {apps}", "mic-on": "Mîkrofon: {apps}", "screen-on": "Parvekirina ekranê: {apps}" + }, + "toast": { + "cam-on": "Kamera çalak e", + "mic-on": "Mîkrofon çalak e", + "screen-on": "Parvekirina ekranê çalak e" + }, + "menu": { + "settings": "Widget settings" + }, + "history": { + "title": "Access History", + "empty": "No recent access", + "clear": "Clear", + "action": { + "started": "Started", + "stopped": "Stopped" + } } -} +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/nl.json b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/nl.json index d486d0a..d0b031d 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/nl.json +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/nl.json @@ -11,11 +11,36 @@ "removeMargins": { "desc": "Verwijdert alle buitenste marges van de widget.", "label": "Marges verwijderen" + }, + "activeColor": { + "desc": "Kleur van de pictogrammen wanneer ze actief zijn.", + "label": "Actieve pictogramkleur" + }, + "inactiveColor": { + "desc": "Kleur van de pictogrammen wanneer ze inactief zijn.", + "label": "Inactieve pictogramkleur" } }, "tooltip": { "cam-on": "Camera: {apps}", "mic-on": "Microfoon: {apps}", "screen-on": "Schermdeling: {apps}" + }, + "toast": { + "cam-on": "Camera is actief", + "mic-on": "Microfoon is actief", + "screen-on": "Scherm delen is actief" + }, + "menu": { + "settings": "Widget instellingen" + }, + "history": { + "title": "Toegangsgeschiedenis", + "empty": "Geen recente toegang", + "clear": "Wissen", + "action": { + "started": "Gestart", + "stopped": "Gestopt" + } } -} +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/pl.json b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/pl.json index b24a019..9e05d3a 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/pl.json +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/pl.json @@ -11,11 +11,36 @@ "removeMargins": { "desc": "Usuń wszystkie zewnętrzne marginesy widżetu.", "label": "Usuń marginesy" + }, + "activeColor": { + "desc": "Kolor ikon, gdy są aktywne.", + "label": "Kolor aktywnej ikony" + }, + "inactiveColor": { + "desc": "Kolor ikon, gdy są nieaktywne.", + "label": "Kolor nieaktywnej ikony" } }, "tooltip": { "cam-on": "Kamera: {apps}", "mic-on": "Mikrofon: {apps}", "screen-on": "Udostępnianie ekranu: {apps}" + }, + "toast": { + "cam-on": "Kamera jest aktywna", + "mic-on": "Mikrofon jest aktywny", + "screen-on": "Udostępnianie ekranu jest aktywne" + }, + "menu": { + "settings": "Ustawienia widżetu" + }, + "history": { + "title": "Historia dostępu", + "empty": "Brak ostatnich dostępów", + "clear": "Wyczyść", + "action": { + "started": "Rozpoczęto", + "stopped": "Zatrzymano" + } } -} +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/pt.json b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/pt.json index 0efffde..068a528 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/pt.json +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/pt.json @@ -11,11 +11,36 @@ "removeMargins": { "desc": "Remove todas as margens externas do widget.", "label": "Remover margens" + }, + "activeColor": { + "desc": "Cor dos ícones quando ativos.", + "label": "Cor do ícone ativo" + }, + "inactiveColor": { + "desc": "Cor dos ícones quando inativos.", + "label": "Cor do ícone inativo" } }, "tooltip": { "cam-on": "Câmera: {apps}", "mic-on": "Microfone: {apps}", "screen-on": "Compartilhamento de tela: {apps}" + }, + "toast": { + "cam-on": "A câmera está ativa", + "mic-on": "O microfone está ativo", + "screen-on": "O compartilhamento de tela está ativo" + }, + "menu": { + "settings": "Configurações do widget" + }, + "history": { + "title": "Histórico de acesso", + "empty": "Sem acessos recentes", + "clear": "Limpar", + "action": { + "started": "Iniciado", + "stopped": "Interrompido" + } } -} +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/ru.json b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/ru.json index 4011d0f..152e7d8 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/ru.json +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/ru.json @@ -11,11 +11,36 @@ "removeMargins": { "desc": "Удаляет все внешние отступы виджета.", "label": "Убрать отступы" + }, + "activeColor": { + "desc": "Цвет иконок при активации.", + "label": "Цвет активной иконки" + }, + "inactiveColor": { + "desc": "Цвет иконок в спокойном состоянии.", + "label": "Цвет неактивной иконки" } }, "tooltip": { "cam-on": "Камера: {apps}", "mic-on": "Микрофон: {apps}", "screen-on": "Демонстрация экрана: {apps}" + }, + "toast": { + "cam-on": "Камера активна", + "mic-on": "Микрофон активен", + "screen-on": "Демонстрация экрана активна" + }, + "menu": { + "settings": "Настройки виджета" + }, + "history": { + "title": "История доступа", + "empty": "Нет недавних доступов", + "clear": "Очистить", + "action": { + "started": "Начато", + "stopped": "Остановлено" + } } -} +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/tr.json b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/tr.json index 900edfb..016f1be 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/tr.json +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/tr.json @@ -11,11 +11,36 @@ "removeMargins": { "desc": "Widget’ın tüm dış kenar boşluklarını kaldırır.", "label": "Kenarlıkları kaldır" + }, + "activeColor": { + "desc": "Aktif olduğunda simgelerin rengi.", + "label": "Aktif simge rengi" + }, + "inactiveColor": { + "desc": "Devre dışı olduğunda simgelerin rengi.", + "label": "Pasif simge rengi" } }, "tooltip": { "cam-on": "Kamera: {apps}", "mic-on": "Mikrofon: {apps}", "screen-on": "Ekran paylaşımı: {apps}" + }, + "toast": { + "cam-on": "Kamera aktif", + "mic-on": "Mikrofon aktif", + "screen-on": "Ekran paylaşımı aktif" + }, + "menu": { + "settings": "Bileşen ayarları" + }, + "history": { + "title": "Erişim Geçmişi", + "empty": "Yakın zamanda erişim yok", + "clear": "Temizle", + "action": { + "started": "Başlatıldı", + "stopped": "Durduruldu" + } } -} +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/uk-UA.json b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/uk-UA.json index 7c78f93..5b872a7 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/uk-UA.json +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/uk-UA.json @@ -11,11 +11,36 @@ "removeMargins": { "desc": "Видаляє всі зовнішні відступи віджета.", "label": "Прибрати відступи" + }, + "activeColor": { + "desc": "Колір іконок при активації.", + "label": "Колір активної іконки" + }, + "inactiveColor": { + "desc": "Колір іконок у спокійному стані.", + "label": "Колір неактивної іконки" } }, "tooltip": { "cam-on": "Камера: {apps}", "mic-on": "Мікрофон: {apps}", "screen-on": "Демонстрація екрана: {apps}" + }, + "toast": { + "cam-on": "Камера активна", + "mic-on": "Мікрофон активний", + "screen-on": "Демонстрація екрана активна" + }, + "menu": { + "settings": "Налаштування віджета" + }, + "history": { + "title": "Історія доступу", + "empty": "Немає недавніх доступів", + "clear": "Очистити", + "action": { + "started": "Розпочато", + "stopped": "Зупинено" + } } -} +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/zh-CN.json b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/zh-CN.json index 1defede..5665d78 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/zh-CN.json +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/zh-CN.json @@ -11,11 +11,36 @@ "removeMargins": { "desc": "移除小部件所有外部边距。", "label": "移除边距" + }, + "activeColor": { + "desc": "激活图标的颜色。", + "label": "激活图标颜色" + }, + "inactiveColor": { + "desc": "未激活图标的颜色。", + "label": "未激活图标颜色" } }, "tooltip": { "cam-on": "摄像头: {apps}", "mic-on": "麦克风: {apps}", "screen-on": "屏幕共享: {apps}" + }, + "toast": { + "cam-on": "摄像头已激活", + "mic-on": "麦克风已激活", + "screen-on": "屏幕共享已激活" + }, + "menu": { + "settings": "小部件设置" + }, + "history": { + "title": "访问历史", + "empty": "无最近访问", + "clear": "清除", + "action": { + "started": "已开始", + "stopped": "已停止" + } } -} +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/zh-TW.json b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/zh-TW.json index 3c1addb..febeadc 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/zh-TW.json +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/zh-TW.json @@ -11,11 +11,36 @@ "removeMargins": { "desc": "移除小工具外面的所有邊距", "label": "移除邊距" + }, + "activeColor": { + "desc": "圖示啟用時的顏色。", + "label": "啟用圖示顏色" + }, + "inactiveColor": { + "desc": "圖示未啟用時的顏色。", + "label": "未啟用圖示顏色" } }, "tooltip": { "cam-on": "攝影機: {apps}", "mic-on": "麥克風: {apps}", "screen-on": "螢幕分享: {apps}" + }, + "toast": { + "cam-on": "攝影機已啟用", + "mic-on": "麥克風已啟用", + "screen-on": "螢幕分享已啟用" + }, + "menu": { + "settings": "小工具設定" + }, + "history": { + "title": "存取紀錄", + "empty": "無最近存取", + "clear": "清除", + "action": { + "started": "已開始", + "stopped": "已停止" + } } -} +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/manifest.json b/home/aiden/.config/noctalia/plugins/privacy-indicator/manifest.json index d998742..e6e68ed 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/manifest.json +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/manifest.json @@ -1,16 +1,22 @@ { "id": "privacy-indicator", "name": "Privacy Indicator", - "version": "1.1.0", + "version": "1.2.4", "minNoctaliaVersion": "3.6.0", "author": "Noctalia Team", "official": true, "license": "MIT", "repository": "https://github.com/noctalia-dev/noctalia-plugins", "description": "A privacy indicator widget that shows when microphone, camera or screen sharing is active.", - "tags": ["Bar", "Privacy", "Indicator"], + "tags": [ + "Bar", + "Privacy", + "Indicator" + ], "entryPoints": { + "main": "Main.qml", "barWidget": "BarWidget.qml", + "panel": "Panel.qml", "settings": "Settings.qml" }, "dependencies": { @@ -24,4 +30,4 @@ "inactiveColor": "none" } } -} +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/preview.png b/home/aiden/.config/noctalia/plugins/privacy-indicator/preview.png index 6d862e5cd3f043cbf61880b11034cca409aa5f4a..0db7b7c736fcbc63fd1abca3c6df14d60fd51e56 100644 GIT binary patch literal 26449 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