This commit is contained in:
2026-03-13 17:23:49 -05:00
parent 1432d75bb6
commit 381b5700bd
32 changed files with 814 additions and 424 deletions

View File

@@ -4,6 +4,7 @@
[[ $- != *i* ]] && return [[ $- != *i* ]] && return
alias ls='ls --color=auto' alias ls='ls --color=auto'
alias ip='ip -c=always'
PS1='[\u@\h \W]\$ ' PS1='[\u@\h \W]\$ '
alias update='~/update.sh' alias update='~/update.sh'

View File

@@ -7,6 +7,7 @@ environment {
QT_QPA_PLATFORMTHEME "gtk3" QT_QPA_PLATFORMTHEME "gtk3"
} }
include "workspaces.kdl"
include "startup.kdl" include "startup.kdl"
include "input.kdl" include "input.kdl"
include "outputs.kdl" include "outputs.kdl"

View File

@@ -11,29 +11,12 @@ spawn-at-startup "/usr/bin/nextcloud"
spawn-at-startup "/usr/bin/swayidle" "-w" spawn-at-startup "/usr/bin/swayidle" "-w"
spawn-at-startup "~/.local/bin/niri-sidebar" "listen" spawn-at-startup "~/.local/bin/niri-sidebar" "listen"
spawn-at-startup "/usr/bin/niri-float-sticky" spawn-at-startup "/usr/bin/niri-float-sticky"
spawn-at-startup "/usr/bin/flatpak" "--user" "run" "com.github.wwmm.easyeffects" "-w"
workspace "chat" { spawn-at-startup "/usr/bin/flatpak" "--user" "run" "im.nheko.Nheko"
open-on-output "DP-3"
}
window-rule {
match app-id="nheko"
open-on-workspace "chat"
}
spawn-at-startup "/usr/bin/flatpak" "run" "im.nheko.Nheko"
window-rule {
match app-id="Element"
open-on-workspace "chat"
}
//spawn-at-startup "/usr/bin/element-desktop" //spawn-at-startup "/usr/bin/element-desktop"
//"--enable-features=UseOzonePlatform" "--ozone-platform=wayland" //"--enable-features=UseOzonePlatform" "--ozone-platform=wayland"
window-rule {
match app-id="discord"
open-on-workspace "chat"
}
//spawn-at-startup "/usr/bin/flatpak" "run" "--socket=wayland" "com.discordapp.Discord" "--enable-features=UseOzonePlatform" "--ozone-platform=wayland" //spawn-at-startup "/usr/bin/flatpak" "run" "--socket=wayland" "com.discordapp.Discord" "--enable-features=UseOzonePlatform" "--ozone-platform=wayland"
//spawn-at-startup "/usr/local/bin/discord-delay.sh" //spawn-at-startup "/usr/local/bin/discord-delay.sh"
//window-rule {
// match app-id="srain"
// open-on-workspace "chat"
//}
//spawn-at-startup "/usr/bin/srain" //spawn-at-startup "/usr/bin/srain"

View File

@@ -0,0 +1,33 @@
// WORKSAPCE: chat
workspace "chat" {
open-on-output "Acer Technologies G246HYL LZ5AA0012413"
}
window-rule {
match app-id="nheko"
open-on-workspace "chat"
}
window-rule {
match app-id="Element"
open-on-workspace "chat"
}
window-rule {
match app-id="discord"
open-on-workspace "chat"
}
//window-rule {
// match app-id="srain"
// open-on-workspace "chat"
//}
// WORKSAPCE: VM
workspace "VM" {
open-on-output "LG Electronics LG ULTRAGEAR 101NTLELA752"
}
window-rule {
match app-id="virt-manager"
open-on-workspace "VM"
}
window-rule {
match app-id="VirtualBox Manager"
open-on-workspace "VM"
}

View File

@@ -1,34 +1,90 @@
{ {
"dark": { "dark": {
"mPrimary": "#b58fff", "mPrimary": "#b58fff",
"mOnPrimary": "#000000", "mOnPrimary": "#000000",
"mSecondary": "#c79aff", "mSecondary": "#c79aff",
"mOnSecondary": "#000000", "mOnSecondary": "#000000",
"mTertiary": "#d8b4ff", "mTertiary": "#d8b4ff",
"mOnTertiary": "#000000", "mOnTertiary": "#000000",
"mError": "#ff6f9b", "mError": "#ff6f9b",
"mOnError": "#000000", "mOnError": "#000000",
"mSurface": "#000000", "mSurface": "#000000",
"mOnSurface": "#e8d8ff", "mOnSurface": "#e8d8ff",
"mSurfaceVariant": "#110d1a", "mSurfaceVariant": "#110d1a",
"mOnSurfaceVariant": "#b58fff", "mOnSurfaceVariant": "#b58fff",
"mOutline": "#4c3a70", "mOutline": "#4c3a70",
"mShadow": "#000000" "mShadow": "#000000",
"terminal": {
"foreground": "#e8d8ff",
"background": "#000000",
"selectionFg": "#e8d8ff",
"selectionBg": "#4c3a70",
"cursorText": "#000000",
"cursor": "#e8d8ff",
"normal": {
"black": "#000000",
"red": "#ff6f9b",
"green": "#a8e6cf",
"yellow": "#d8b4ff",
"blue": "#b58fff",
"magenta": "#c79aff",
"cyan": "#e0c1ff",
"white": "#e8d8ff"
},
"bright": {
"black": "#4c3a70",
"red": "#ff8cb3",
"green": "#b8f0d8",
"yellow": "#e6d1ff",
"blue": "#c9a8ff",
"magenta": "#d4b8ff",
"cyan": "#f0e0ff",
"white": "#f5f0ff"
}
}
}, },
"light": { "light": {
"mPrimary": "#8a56d4", "mPrimary": "#8a56d4",
"mOnPrimary": "#ffffff", "mOnPrimary": "#ffffff",
"mSecondary": "#a074ff", "mSecondary": "#a074ff",
"mOnSecondary": "#ffffff", "mOnSecondary": "#ffffff",
"mTertiary": "#c79aff", "mTertiary": "#c79aff",
"mOnTertiary": "#ffffff", "mOnTertiary": "#ffffff",
"mError": "#ff6f9b", "mError": "#ff6f9b",
"mOnError": "#ffffff", "mOnError": "#ffffff",
"mSurface": "#fbf8ff", "mSurface": "#fbf8ff",
"mOnSurface": "#1a1428", "mOnSurface": "#1a1428",
"mSurfaceVariant": "#e8e0f8", "mSurfaceVariant": "#e8e0f8",
"mOnSurfaceVariant": "#8a56d4", "mOnSurfaceVariant": "#8a56d4",
"mOutline": "#9b85c2", "mOutline": "#9b85c2",
"mShadow": "#e2d8f5" "mShadow": "#e2d8f5",
"terminal": {
"foreground": "#1a1428",
"background": "#fbf8ff",
"selectionFg": "#1a1428",
"selectionBg": "#e8e0f8",
"cursorText": "#fbf8ff",
"cursor": "#1a1428",
"normal": {
"black": "#6b5b95",
"red": "#ff6f9b",
"green": "#6fb58f",
"yellow": "#c79aff",
"blue": "#8a56d4",
"magenta": "#a074ff",
"cyan": "#b89fff",
"white": "#1a1428"
},
"bright": {
"black": "#9b85c2",
"red": "#ff8cb3",
"green": "#85d7a8",
"yellow": "#e0c1ff",
"blue": "#b58fff",
"magenta": "#c79aff",
"cyan": "#d8b4ff",
"white": "#120f1f"
}
}
} }
} }

View File

@@ -15,7 +15,35 @@
"mOutline": "#44415a", "mOutline": "#44415a",
"mShadow": "#232136", "mShadow": "#232136",
"mHover": "#56526e", "mHover": "#56526e",
"mOnHover": "#e0def4" "mOnHover": "#e0def4",
"terminal": {
"foreground": "#e0def4",
"background": "#232136",
"normal": {
"black": "#393552",
"red": "#eb6f92",
"green": "#3e8fb0",
"yellow": "#f6c177",
"blue": "#9ccfd8",
"magenta": "#c4a7e7",
"cyan": "#ea9a97",
"white": "#e0def4"
},
"bright": {
"black": "#6e6a86",
"red": "#eb6f92",
"green": "#3e8fb0",
"yellow": "#f6c177",
"blue": "#9ccfd8",
"magenta": "#c4a7e7",
"cyan": "#ea9a97",
"white": "#e0def4"
},
"cursor": "#e0def4",
"cursorText": "#232136",
"selectionFg": "#e0def4",
"selectionBg": "#6e6a86"
}
}, },
"light": { "light": {
"mPrimary": "#d7827e", "mPrimary": "#d7827e",
@@ -33,6 +61,34 @@
"mOutline": "#dfdad9", "mOutline": "#dfdad9",
"mShadow": "#faf4ed", "mShadow": "#faf4ed",
"mHover": "#cecacd", "mHover": "#cecacd",
"mOnHover": "#575279" "mOnHover": "#575279",
"terminal": {
"foreground": "#575279",
"background": "#faf4ed",
"normal": {
"black": "#f2e9e1",
"red": "#b4637a",
"green": "#286983",
"yellow": "#ea9d34",
"blue": "#56949f",
"magenta": "#907aa9",
"cyan": "#d7827e",
"white": "#575279"
},
"bright": {
"black": "#9893a5",
"red": "#b4637a",
"green": "#286983",
"yellow": "#ea9d34",
"blue": "#56949f",
"magenta": "#907aa9",
"cyan": "#d7827e",
"white": "#575279"
},
"cursor": "#575279",
"cursorText": "#faf4ed",
"selectionFg": "#575279",
"selectionBg": "#9893a5"
}
} }
} }

View File

@@ -1,38 +1,94 @@
{ {
"dark": { "dark": {
"mPrimary": "#7a88cf", "mPrimary": "#7a88cf",
"mOnPrimary": "#1f2335", "mOnPrimary": "#1f2335",
"mSecondary": "#d7729f", "mSecondary": "#d7729f",
"mOnSecondary": "#1f2335", "mOnSecondary": "#1f2335",
"mTertiary": "#9cd58a", "mTertiary": "#9cd58a",
"mOnTertiary": "#1f2335", "mOnTertiary": "#1f2335",
"mError": "#f7768e", "mError": "#f7768e",
"mOnError": "#1f2335", "mOnError": "#1f2335",
"mSurface": "#1f2335", "mSurface": "#1f2335",
"mOnSurface": "#a9b1d6", "mOnSurface": "#a9b1d6",
"mSurfaceVariant": "#2c314a", "mSurfaceVariant": "#2c314a",
"mOnSurfaceVariant": "#8289a6", "mOnSurfaceVariant": "#c0caf5",
"mOutline": "#4b517a", "mOutline": "#4b517a",
"mShadow": "#181b2a", "mShadow": "#181b2a",
"mHover": "#9cd58a", "mHover": "#9cd58a",
"mOnHover": "#1f2335" "mOnHover": "#1f2335",
}, "terminal": {
"light": { "foreground": "#a9b1d6",
"mPrimary": "#4e70c2", "background": "#1f2335",
"mOnPrimary": "#f0f2f7", "selectionFg": "#a9b1d6",
"mSecondary": "#85539c", "selectionBg": "#4b517a",
"mOnSecondary": "#f0f2f7", "cursorText": "#1f2335",
"mTertiary": "#4c663b", "cursor": "#a9b1d6",
"mOnTertiary": "#f0f2f7", "normal": {
"mError": "#e55561", "black": "#1f2335",
"mOnError": "#f0f2f7", "red": "#f7768e",
"mSurface": "#f0f2f7", "green": "#9cd58a",
"mOnSurface": "#4e70c2", "yellow": "#e6c384",
"mSurfaceVariant": "#dbdfea", "blue": "#7a88cf",
"mOnSurfaceVariant": "#6a708a", "magenta": "#d7729f",
"mOutline": "#c8ccd8", "cyan": "#7bb0c0",
"mShadow": "#a4a8b7", "white": "#8289a6"
"mHover": "#4c663b", },
"mOnHover": "#f0f2f7" "bright": {
"black": "#545c7e",
"red": "#f7768e",
"green": "#9cd58a",
"yellow": "#e6c384",
"blue": "#7a88cf",
"magenta": "#d7729f",
"cyan": "#7bb0c0",
"white": "#a9b1d6"
}
} }
},
"light": {
"mPrimary": "#4e70c2",
"mOnPrimary": "#f0f2f7",
"mSecondary": "#85539c",
"mOnSecondary": "#f0f2f7",
"mTertiary": "#4c663b",
"mOnTertiary": "#f0f2f7",
"mError": "#e55561",
"mOnError": "#f0f2f7",
"mSurface": "#f0f2f7",
"mOnSurface": "#4e70c2",
"mSurfaceVariant": "#dbdfea",
"mOnSurfaceVariant": "#444b6a",
"mOutline": "#c8ccd8",
"mShadow": "#a4a8b7",
"mHover": "#4c663b",
"mOnHover": "#f0f2f7",
"terminal": {
"foreground": "#4e70c2",
"background": "#f0f2f7",
"selectionFg": "#4e70c2",
"selectionBg": "#c8ccd8",
"cursorText": "#f0f2f7",
"cursor": "#4e70c2",
"normal": {
"black": "#f0f2f7",
"red": "#e55561",
"green": "#4c663b",
"yellow": "#9e8c6b",
"blue": "#4e70c2",
"magenta": "#85539c",
"cyan": "#569b9f",
"white": "#6a708a"
},
"bright": {
"black": "#939ab7",
"red": "#d26e7a",
"green": "#5e7250",
"yellow": "#9e8c6b",
"blue": "#5e7bba",
"magenta": "#85539c",
"cyan": "#569b9f",
"white": "#6a708a"
}
}
}
} }

View File

@@ -36,12 +36,12 @@ Item {
property var cfg: pluginApi?.pluginSettings || ({}) property var cfg: pluginApi?.pluginSettings || ({})
property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({}) property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({})
property bool hideInactive: cfg.hideInactive ?? defaults.hideInactive property bool hideInactive: cfg.hideInactive ?? defaults.hideInactive ?? false
property bool removeMargins: cfg.removeMargins ?? defaults.removeMargins property bool enableToast: cfg.enableToast ?? defaults.enableToast ?? true
property int iconSpacing: cfg.iconSpacing || Style.marginXS property bool removeMargins: cfg.removeMargins ?? defaults.removeMargins ?? false
property int iconSpacing: cfg.iconSpacing ?? defaults.iconSpacing ?? 4
property string activeColorKey: cfg.activeColor ?? defaults.activeColor property string activeColorKey: cfg.activeColor ?? defaults.activeColor ?? "primary"
property string inactiveColorKey: cfg.inactiveColor ?? defaults.inactiveColor property string inactiveColorKey: cfg.inactiveColor ?? defaults.inactiveColor ?? "none"
readonly property color activeColor: Color.resolveColorKey(activeColorKey) readonly property color activeColor: Color.resolveColorKey(activeColorKey)
readonly property color inactiveColor: inactiveColorKey === "none" ? Qt.alpha(Color.mOnSurfaceVariant, 0.3) : Color.resolveColorKey(inactiveColorKey) readonly property color inactiveColor: inactiveColorKey === "none" ? Qt.alpha(Color.mOnSurfaceVariant, 0.3) : Color.resolveColorKey(inactiveColorKey)

View File

@@ -25,6 +25,12 @@ Item {
property var _prevCamApps: [] property var _prevCamApps: []
property var _prevScrApps: [] property var _prevScrApps: []
// Get active color from settings or default
property var cfg: pluginApi?.pluginSettings || ({})
property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({})
property bool enableToast: cfg.enableToast ?? defaults.enableToast ?? true
property string activeColorKey: cfg.activeColor ?? defaults.activeColor ?? "primary"
PwObjectTracker { PwObjectTracker {
objects: Pipewire.ready ? Pipewire.nodes.values : [] objects: Pipewire.ready ? Pipewire.nodes.values : []
} }
@@ -236,10 +242,6 @@ Item {
} }
} }
// 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: { onMicAppsChanged: {
checkAppChanges(micApps, _prevMicApps, "Microphone", "microphone", activeColorKey); checkAppChanges(micApps, _prevMicApps, "Microphone", "microphone", activeColorKey);
@@ -248,7 +250,7 @@ Item {
// Helper to detect activation edge // Helper to detect activation edge
property bool oldMicActive: false property bool oldMicActive: false
onMicActiveChanged: { onMicActiveChanged: {
if (micActive && (!oldMicActive)) { if (enableToast && micActive && !oldMicActive) {
ToastService.showNotice(pluginApi?.tr("toast.mic-on") || "Microphone is active", "", "microphone"); ToastService.showNotice(pluginApi?.tr("toast.mic-on") || "Microphone is active", "", "microphone");
} }
oldMicActive = micActive oldMicActive = micActive
@@ -256,7 +258,7 @@ Item {
property bool oldCamActive: false property bool oldCamActive: false
onCamActiveChanged: { onCamActiveChanged: {
if (camActive && !oldCamActive) { if (enableToast && camActive && !oldCamActive) {
ToastService.showNotice(pluginApi?.tr("toast.cam-on") || "Camera is active", "", "camera"); ToastService.showNotice(pluginApi?.tr("toast.cam-on") || "Camera is active", "", "camera");
} }
oldCamActive = camActive oldCamActive = camActive
@@ -268,7 +270,7 @@ Item {
property bool oldScrActive: false property bool oldScrActive: false
onScrActiveChanged: { onScrActiveChanged: {
if (scrActive && !oldScrActive) { if (enableToast && scrActive && !oldScrActive) {
ToastService.showNotice(pluginApi?.tr("toast.screen-on") || "Screen sharing is active", "", "screen-share"); ToastService.showNotice(pluginApi?.tr("toast.screen-on") || "Screen sharing is active", "", "screen-share");
} }
oldScrActive = scrActive oldScrActive = scrActive

View File

@@ -11,11 +11,12 @@ ColumnLayout {
property var cfg: pluginApi?.pluginSettings || ({}) property var cfg: pluginApi?.pluginSettings || ({})
property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({}) property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({})
property bool hideInactive: cfg.hideInactive ?? defaults.hideInactive property bool hideInactive: cfg.hideInactive ?? defaults.hideInactive ?? false
property bool removeMargins: cfg.removeMargins ?? defaults.removeMargins property bool enableToast: cfg.enableToast ?? defaults.enableToast ?? true
property int iconSpacing: cfg.iconSpacing || Style.marginXS property bool removeMargins: cfg.removeMargins ?? defaults.removeMargins ?? false
property string activeColor: cfg.activeColor ?? defaults.activeColor property int iconSpacing: cfg.iconSpacing ?? defaults.iconSpacing ?? 4
property string inactiveColor: cfg.inactiveColor ?? defaults.inactiveColor property string activeColor: cfg.activeColor ?? defaults.activeColor ?? "primary"
property string inactiveColor: cfg.inactiveColor ?? defaults.inactiveColor ?? "none"
spacing: Style.marginL spacing: Style.marginL
@@ -32,35 +33,45 @@ ColumnLayout {
description: pluginApi?.tr("settings.hideInactive.desc") description: pluginApi?.tr("settings.hideInactive.desc")
checked: root.hideInactive checked: root.hideInactive
onToggled: function (checked) { onToggled: checked => {
root.hideInactive = checked; root.hideInactive = checked;
} }
} }
NToggle {
label: pluginApi?.tr("settings.enableToast.label")
description: pluginApi?.tr("settings.enableToast.desc")
checked: root.enableToast
onToggled: checked => {
root.enableToast = checked;
}
}
NToggle { NToggle {
label: pluginApi?.tr("settings.removeMargins.label") label: pluginApi?.tr("settings.removeMargins.label")
description: pluginApi?.tr("settings.removeMargins.desc") description: pluginApi?.tr("settings.removeMargins.desc")
checked: root.removeMargins checked: root.removeMargins
onToggled: function (checked) { onToggled: checked => {
root.removeMargins = checked; root.removeMargins = checked;
} }
} }
NComboBox { NColorChoice {
label: pluginApi?.tr("settings.activeColor.label") label: pluginApi?.tr("settings.activeColor.label")
description: pluginApi?.tr("settings.activeColor.desc") description: pluginApi?.tr("settings.activeColor.desc")
model: Color.colorKeyModel
currentKey: root.activeColor currentKey: root.activeColor
onSelected: key => root.activeColor = key onSelected: key => root.activeColor = key
} }
NComboBox { NColorChoice {
label: pluginApi?.tr("settings.inactiveColor.label") label: pluginApi?.tr("settings.inactiveColor.label")
description: pluginApi?.tr("settings.inactiveColor.desc") description: pluginApi?.tr("settings.inactiveColor.desc")
model: Color.colorKeyModel
currentKey: root.inactiveColor currentKey: root.inactiveColor
onSelected: key => root.inactiveColor = key onSelected: key => root.inactiveColor = key
noneColor: Qt.alpha(Color.mOnSurfaceVariant, 0.3)
noneOnColor: Qt.alpha(Color.mOnSurface, 0.7)
} }
NComboBox { NComboBox {
@@ -96,6 +107,7 @@ ColumnLayout {
} }
pluginApi.pluginSettings.hideInactive = root.hideInactive; pluginApi.pluginSettings.hideInactive = root.hideInactive;
pluginApi.pluginSettings.enableToast = root.enableToast;
pluginApi.pluginSettings.iconSpacing = root.iconSpacing; pluginApi.pluginSettings.iconSpacing = root.iconSpacing;
pluginApi.pluginSettings.removeMargins = root.removeMargins; pluginApi.pluginSettings.removeMargins = root.removeMargins;
pluginApi.pluginSettings.activeColor = root.activeColor; pluginApi.pluginSettings.activeColor = root.activeColor;

View File

@@ -11,6 +11,10 @@
"desc": "Hide microphone, camera, and screen icons when there are inactive.", "desc": "Hide microphone, camera, and screen icons when there are inactive.",
"label": "Hide inactive states" "label": "Hide inactive states"
}, },
"enableToast": {
"desc": "Show toast messages when one of the states changes.",
"label": "Enable toast notifications"
},
"inactiveColor": { "inactiveColor": {
"desc": "Color of the icons when inactive.", "desc": "Color of the icons when inactive.",
"label": "Inactive icon color" "label": "Inactive icon color"

View File

@@ -1,7 +1,7 @@
{ {
"id": "privacy-indicator", "id": "privacy-indicator",
"name": "Privacy Indicator", "name": "Privacy Indicator",
"version": "1.2.4", "version": "1.2.5",
"minNoctaliaVersion": "3.6.0", "minNoctaliaVersion": "3.6.0",
"author": "Noctalia Team", "author": "Noctalia Team",
"official": true, "official": true,
@@ -25,7 +25,9 @@
"metadata": { "metadata": {
"defaultSettings": { "defaultSettings": {
"hideInactive": false, "hideInactive": false,
"enableToast": true,
"removeMargins": false, "removeMargins": false,
"iconSpacing": 4,
"activeColor": "primary", "activeColor": "primary",
"inactiveColor": "none" "inactiveColor": "none"
} }

View File

@@ -4,6 +4,7 @@ import Quickshell.Io
import qs.Commons import qs.Commons
import qs.Services.UI import qs.Services.UI
import qs.Services.System import qs.Services.System
import qs.Services.Compositor
Item { Item {
id: root id: root
@@ -15,6 +16,8 @@ Item {
property bool hasActiveRecording: false property bool hasActiveRecording: false
property string outputPath: "" property string outputPath: ""
property bool isAvailable: false property bool isAvailable: false
property string detectedMonitor: ""
property bool usePrimeRun: false
// Single reusable Process object // Single reusable Process object
Process { Process {
@@ -36,19 +39,19 @@ Item {
function toggle() { function toggle() {
if (root.isAvailable) { if (root.isAvailable) {
root.toggleRecording() root.toggleRecording();
} }
} }
function start() { function start() {
if (root.isAvailable && !root.isRecording && !root.isPending) { if (root.isAvailable && !root.isRecording && !root.isPending) {
root.startRecording() root.startRecording();
} }
} }
function stop() { function stop() {
if (root.isRecording || root.isPending) { if (root.isRecording || root.isPending) {
root.stopRecording() root.stopRecording();
} }
} }
} }
@@ -58,6 +61,7 @@ Item {
readonly property string directory: pluginApi?.pluginSettings?.directory || "" readonly property string directory: pluginApi?.pluginSettings?.directory || ""
readonly property string filenamePattern: pluginApi?.pluginSettings?.filenamePattern || "recording_yyyyMMdd_HHmmss" readonly property string filenamePattern: pluginApi?.pluginSettings?.filenamePattern || "recording_yyyyMMdd_HHmmss"
readonly property string frameRate: pluginApi?.pluginSettings?.frameRate || "60" readonly property string frameRate: pluginApi?.pluginSettings?.frameRate || "60"
readonly property string customFrameRate: pluginApi?.pluginSettings?.customFrameRate || "60"
readonly property string audioCodec: pluginApi?.pluginSettings?.audioCodec || "opus" readonly property string audioCodec: pluginApi?.pluginSettings?.audioCodec || "opus"
readonly property string videoCodec: pluginApi?.pluginSettings?.videoCodec || "h264" readonly property string videoCodec: pluginApi?.pluginSettings?.videoCodec || "h264"
readonly property string quality: pluginApi?.pluginSettings?.quality || "very_high" readonly property string quality: pluginApi?.pluginSettings?.quality || "very_high"
@@ -70,77 +74,74 @@ Item {
function buildTooltip() { function buildTooltip() {
if (!isAvailable) { if (!isAvailable) {
return pluginApi.tr("messages.not-installed") return pluginApi.tr("messages.not-installed");
} }
if (isPending) { if (isPending) {
pluginApi.tr("messages.started") pluginApi.tr("messages.started");
} }
if (isRecording) { if (isRecording) {
return pluginApi.tr("messages.stop-recording") return pluginApi.tr("messages.stop-recording");
} }
return pluginApi.tr("messages.start-recording") return pluginApi.tr("messages.start-recording");
} }
// Start or Stop recording // Start or Stop recording
function toggleRecording() { function toggleRecording() {
(isRecording || isPending) ? stopRecording() : startRecording() (isRecording || isPending) ? stopRecording() : startRecording();
} }
// Open recording file // Open recording file
function openFile(path) { function openFile(path) {
if (!path) { if (!path) {
return return;
} }
Quickshell.execDetached(["xdg-open", path]) Quickshell.execDetached(["xdg-open", path]);
} }
// Copy file to clipboard as file reference // Copy file to clipboard as file reference
function copyFileToClipboard(filePath) { function copyFileToClipboard(filePath) {
if (!filePath) { if (!filePath) {
return return;
} }
// Convert path to file:// URI format for copying as file reference // Convert path to file:// URI format for copying as file reference
const fileUri = "file://" + filePath.replace(/ /g, "%20").replace(/'/g, "%27").replace(/"/g, "%22") const fileUri = "file://" + filePath.replace(/ /g, "%20").replace(/'/g, "%27").replace(/"/g, "%22");
const escapedUri = fileUri.replace(/'/g, "'\\''") const escapedUri = fileUri.replace(/'/g, "'\\''");
const command = "printf '%s' '" + escapedUri + "' | wl-copy --type text/uri-list" const command = "printf '%s' '" + escapedUri + "' | wl-copy --type text/uri-list";
copyToClipboardProcess.exec({ copyToClipboardProcess.exec({
"command": ["sh", "-c", command] "command": ["sh", "-c", command]
}) });
} }
// Start screen recording // Start screen recording
function startRecording() { function startRecording() {
if (!isAvailable) { if (!isAvailable) {
return return;
} }
if (isRecording || isPending) { if (isRecording || isPending) {
return return;
} }
isPending = true isPending = true;
hasActiveRecording = false hasActiveRecording = false;
// Close any opened panel // Close any opened panel
if ((PanelService.openedPanel !== null) && !PanelService.openedPanel.isClosing) { if ((PanelService.openedPanel !== null) && !PanelService.openedPanel.isClosing) {
PanelService.openedPanel.close() PanelService.openedPanel.close();
} }
// First, ensure xdg-desktop-portal and a compositor portal are running // First, ensure xdg-desktop-portal and a compositor portal are running
portalCheckProcess.exec({ portalCheckProcess.exec({
"command": ["sh", "-c", "command": ["sh", "-c", "pidof xdg-desktop-portal >/dev/null 2>&1 && (pidof xdg-desktop-portal-wlr >/dev/null 2>&1 || pidof xdg-desktop-portal-hyprland >/dev/null 2>&1 || pidof xdg-desktop-portal-gnome >/dev/null 2>&1 || pidof xdg-desktop-portal-kde >/dev/null 2>&1)"]
"pidof xdg-desktop-portal >/dev/null 2>&1 && (pidof xdg-desktop-portal-wlr >/dev/null 2>&1 || pidof xdg-desktop-portal-hyprland >/dev/null 2>&1 || pidof xdg-desktop-portal-gnome >/dev/null 2>&1 || pidof xdg-desktop-portal-kde >/dev/null 2>&1)"] });
})
} }
function expandFilenamePattern(pattern) { function expandFilenamePattern(pattern) {
var now = new Date() var now = new Date();
// Known Qt date/time format tokens sorted by length (longest first to match greedily) // Known Qt date/time format tokens sorted by length (longest first to match greedily)
var tokens = ['unix', 'MMMM', 'dddd', 'yyyy', 'MMM', 'ddd', 'zzz', 'HH', 'hh', 'mm', 'ss', var tokens = ['unix', 'MMMM', 'dddd', 'yyyy', 'MMM', 'ddd', 'zzz', 'HH', 'hh', 'mm', 'ss', 'yy', 'MM', 'dd', 'AP', 'ap', 'M', 'd', 'H', 'h', 'm', 's', 'z', 'A', 'a', 't'];
'yy', 'MM', 'dd', 'AP', 'ap', 'M', 'd', 'H', 'h', 'm', 's', 'z', 'A', 'a', 't'];
// Escape literal text by wrapping non-token sequences in single quotes // Escape literal text by wrapping non-token sequences in single quotes
var escaped = ""; var escaped = "";
@@ -199,89 +200,103 @@ Item {
} }
// Use Qt's I18n.locale.toString for proper date/time formatting // Use Qt's I18n.locale.toString for proper date/time formatting
var expanded = I18n.locale.toString(now, escaped) var expanded = I18n.locale.toString(now, escaped);
return expanded + ".mp4" return expanded + ".mp4";
} }
function launchRecorder() { function launchRecorder() {
var pattern = filenamePattern || "recording_yyyyMMdd_HHmmss" // If focused-monitor is selected, detect monitor first
var filename = expandFilenamePattern(pattern) if (videoSource === "focused-monitor" && CompositorService.isHyprland) {
var videoDir = Settings.preprocessPath(directory) var script = 'set -euo pipefail\n' + 'pos=$(hyprctl cursorpos)\n' + 'cx=${pos%,*}; cy=${pos#*,}\n' + 'mon=$(hyprctl monitors -j | jq -r --argjson cx "$cx" --argjson cy "$cy" ' + "'.[] | select(($cx>=.x) and ($cx<(.x+.width)) and ($cy>=.y) and ($cy<(.y+.height))) | .name' " + '| head -n1)\n' + '[ -n "${mon:-}" ] || { echo "MONITOR_NOT_FOUND"; exit 1; }\n' + 'use_prime=0\n' + 'for v in /sys/class/drm/card*/device/vendor; do\n' + ' [ -f "$v" ] || continue\n' + ' if grep -qi "0x10de" "$v"; then\n' + ' card="$(basename "$(dirname "$(dirname "$v")")")"\n' + ' [ -e "/sys/class/drm/${card}-${mon}" ] && use_prime=1 && break\n' + ' fi\n' + 'done\n' + 'echo "${mon}:${use_prime}"';
monitorDetectProcess.exec({
"command": ["sh", "-c", script]
});
return;
}
launchRecorderWithSource(videoSource, false);
}
function launchRecorderWithSource(source, primeRun) {
var pattern = filenamePattern || "recording_yyyyMMdd_HHmmss";
var filename = expandFilenamePattern(pattern);
var videoDir = Settings.preprocessPath(directory);
if (!videoDir) { if (!videoDir) {
videoDir = Quickshell.env("HOME") + "/Videos" videoDir = Quickshell.env("HOME") + "/Videos";
} }
if (videoDir && !videoDir.endsWith("/")) { if (videoDir && !videoDir.endsWith("/")) {
videoDir += "/" videoDir += "/";
} }
outputPath = videoDir + filename outputPath = videoDir + filename;
const audioFlags = (() => { const audioFlags = (() => {
if (audioSource === "none") { if (audioSource === "none") {
return "" return "";
} }
if (audioSource === "both") { if (audioSource === "both") {
return `-ac ${audioCodec} -a "default_output|default_input"` return `-ac ${audioCodec} -a "default_output|default_input"`;
} }
return `-ac ${audioCodec} -a ${audioSource}` return `-ac ${audioCodec} -a ${audioSource}`;
})() })();
var resolutionFlag = (resolution !== "original") ? `-s ${resolution}` : "" var actualFrameRate = (frameRate === "custom") ? customFrameRate : frameRate;
var flags = `-w ${videoSource} -f ${frameRate} -k ${videoCodec} ${audioFlags} -q ${quality} -cursor ${showCursor ? "yes" : "no"} -cr ${colorRange} ${resolutionFlag} -o "${outputPath}"` var resolutionFlag = (resolution !== "original") ? `-s ${resolution}` : "";
var flags = `-w ${source} -f ${actualFrameRate} -k ${videoCodec} ${audioFlags} -q ${quality} -cursor ${showCursor ? "yes" : "no"} -cr ${colorRange} ${resolutionFlag} -o "${outputPath}"`;
var primePrefix = primeRun ? "prime-run " : "";
var command = ` var command = `
_gpuscreenrecorder_flatpak_installed() { _gpuscreenrecorder_flatpak_installed() {
flatpak list --app | grep -q "com.dec05eba.gpu_screen_recorder" flatpak list --app | grep -q "com.dec05eba.gpu_screen_recorder"
} }
if command -v gpu-screen-recorder >/dev/null 2>&1; then if command -v gpu-screen-recorder >/dev/null 2>&1; then
gpu-screen-recorder ${flags} ${primePrefix}gpu-screen-recorder ${flags}
elif command -v flatpak >/dev/null 2>&1 && _gpuscreenrecorder_flatpak_installed; then elif command -v flatpak >/dev/null 2>&1 && _gpuscreenrecorder_flatpak_installed; then
flatpak run --command=gpu-screen-recorder --file-forwarding com.dec05eba.gpu_screen_recorder ${flags} ${primePrefix}flatpak run --command=gpu-screen-recorder --file-forwarding com.dec05eba.gpu_screen_recorder ${flags}
else else
echo "GPU_SCREEN_RECORDER_NOT_INSTALLED" echo "GPU_SCREEN_RECORDER_NOT_INSTALLED"
fi` fi`;
// Use Process to monitor it and read stderr // Use Process to monitor it and read stderr
recorderProcess.exec({ recorderProcess.exec({
"command": ["sh", "-c", command] "command": ["sh", "-c", command]
}) });
// Start monitoring - if process ends quickly, it was likely cancelled // Start monitoring - if process ends quickly, it was likely cancelled
pendingTimer.running = true pendingTimer.running = true;
} }
// Stop recording // Stop recording
function stopRecording() { function stopRecording() {
if (!isRecording && !isPending) { if (!isRecording && !isPending) {
return return;
} }
ToastService.showNotice(pluginApi.tr("messages.stopping"), outputPath, "video") ToastService.showNotice(pluginApi.tr("messages.stopping"), outputPath, "video");
Quickshell.execDetached(["sh", "-c", "pkill -SIGINT -f 'gpu-screen-recorder' || pkill -SIGINT -f 'com.dec05eba.gpu_screen_recorder'"]) Quickshell.execDetached(["sh", "-c", "pkill -SIGINT -f 'gpu-screen-recorder' || pkill -SIGINT -f 'com.dec05eba.gpu_screen_recorder'"]);
isRecording = false isRecording = false;
isPending = false isPending = false;
pendingTimer.running = false pendingTimer.running = false;
monitorTimer.running = false monitorTimer.running = false;
hasActiveRecording = false hasActiveRecording = false;
// Just in case, force kill after 3 seconds // Just in case, force kill after 3 seconds
killTimer.running = true killTimer.running = true;
} }
// Helper function to truncate text for toast display // Helper function to truncate text for toast display
function truncateForToast(text, maxLength = 128) { function truncateForToast(text, maxLength = 128) {
if (text.length <= maxLength) return text if (text.length <= maxLength)
return text.substring(0, maxLength) + "…" return text;
return text.substring(0, maxLength) + "…";
} }
// Helper function to check if output indicates user cancellation // Helper function to check if output indicates user cancellation
function isCancelledByUser(stdoutText, stderrText) { function isCancelledByUser(stdoutText, stderrText) {
const stdout = String(stdoutText || "").toLowerCase() const stdout = String(stdoutText || "").toLowerCase();
const stderr = String(stderrText || "").toLowerCase() const stderr = String(stderrText || "").toLowerCase();
const combined = stdout + " " + stderr const combined = stdout + " " + stderr;
return combined.includes("canceled by") || combined.includes("cancelled by") || return combined.includes("canceled by") || combined.includes("cancelled by") || combined.includes("canceled by user") || combined.includes("cancelled by user") || combined.includes("canceled by the user") || combined.includes("cancelled by the user");
combined.includes("canceled by user") || combined.includes("cancelled by user") ||
combined.includes("canceled by the user") || combined.includes("cancelled by the user")
} }
// Process to run and monitor gpu-screen-recorder // Process to run and monitor gpu-screen-recorder
@@ -290,59 +305,59 @@ Item {
stdout: StdioCollector {} stdout: StdioCollector {}
stderr: StdioCollector {} stderr: StdioCollector {}
onExited: function (exitCode, exitStatus) { onExited: function (exitCode, exitStatus) {
const stdout = String(recorderProcess.stdout.text || "").trim() const stdout = String(recorderProcess.stdout.text || "").trim();
const stderr = String(recorderProcess.stderr.text || "").trim() const stderr = String(recorderProcess.stderr.text || "").trim();
const wasCancelled = isCancelledByUser(stdout, stderr) const wasCancelled = isCancelledByUser(stdout, stderr);
if (isPending) { if (isPending) {
// Process ended while we were pending - likely cancelled or error // Process ended while we were pending - likely cancelled or error
isPending = false isPending = false;
pendingTimer.running = false pendingTimer.running = false;
// Check if gpu-screen-recorder is not installed // Check if gpu-screen-recorder is not installed
if (stdout === "GPU_SCREEN_RECORDER_NOT_INSTALLED") { if (stdout === "GPU_SCREEN_RECORDER_NOT_INSTALLED") {
ToastService.showError(pluginApi.tr("messages.not-installed"), pluginApi.tr("messages.not-installed-desc")) ToastService.showError(pluginApi.tr("messages.not-installed"), pluginApi.tr("messages.not-installed-desc"));
return return;
} }
// If it failed to start, show a clear error toast with stderr // If it failed to start, show a clear error toast with stderr
// But don't show error if user intentionally cancelled via portal // But don't show error if user intentionally cancelled via portal
if (exitCode !== 0) { if (exitCode !== 0) {
if (stderr.length > 0 && !wasCancelled) { if (stderr.length > 0 && !wasCancelled) {
ToastService.showError(pluginApi.tr("messages.failed-start"), truncateForToast(stderr)) ToastService.showError(pluginApi.tr("messages.failed-start"), truncateForToast(stderr));
Logger.e("ScreenRecorder", stderr) Logger.e("ScreenRecorder", stderr);
} }
} }
} else if (isRecording || hasActiveRecording) { } else if (isRecording || hasActiveRecording) {
// Process ended normally while recording // Process ended normally while recording
isRecording = false isRecording = false;
monitorTimer.running = false monitorTimer.running = false;
if (exitCode === 0) { if (exitCode === 0) {
// ToastService.showNotice(pluginApi.tr("messages.saved"), outputPath, "video") // ToastService.showNotice(pluginApi.tr("messages.saved"), outputPath, "video")
ToastService.showNotice(pluginApi.tr("messages.saved"), outputPath, "video", 3000, pluginApi.tr("messages.open-file"), () => openFile(outputPath)) ToastService.showNotice(pluginApi.tr("messages.saved"), outputPath, "video", 3000, pluginApi.tr("messages.open-file"), () => openFile(outputPath));
if (copyToClipboard) { if (copyToClipboard) {
copyFileToClipboard(outputPath) copyFileToClipboard(outputPath);
} }
} else { } else {
// Don't show error if user intentionally cancelled // Don't show error if user intentionally cancelled
if (!wasCancelled) { if (!wasCancelled) {
if (stderr.length > 0) { if (stderr.length > 0) {
ToastService.showError(pluginApi.tr("messages.failed-start"), truncateForToast(stderr)) ToastService.showError(pluginApi.tr("messages.failed-start"), truncateForToast(stderr));
Logger.e("ScreenRecorder", stderr) Logger.e("ScreenRecorder", stderr);
} else { } else {
ToastService.showError(pluginApi.tr("messages.failed-start"), pluginApi.tr("messages.failed-general")) ToastService.showError(pluginApi.tr("messages.failed-start"), pluginApi.tr("messages.failed-general"));
} }
} }
} }
hasActiveRecording = false hasActiveRecording = false;
} else if (!isPending && exitCode === 0 && outputPath) { } else if (!isPending && exitCode === 0 && outputPath) {
// Fallback: if process exited successfully with an outputPath, handle it // Fallback: if process exited successfully with an outputPath, handle it
// ToastService.showNotice(pluginApi.tr("messages.saved"), outputPath, "video") // ToastService.showNotice(pluginApi.tr("messages.saved"), outputPath, "video")
ToastService.showNotice(pluginApi.tr("messages.saved"), outputPath, "video", 3000, pluginApi.tr("messages.open-file"), () => openFile(outputPath)) ToastService.showNotice(pluginApi.tr("messages.saved"), outputPath, "video", 3000, pluginApi.tr("messages.open-file"), () => openFile(outputPath));
if (copyToClipboard) { if (copyToClipboard) {
copyFileToClipboard(outputPath) copyFileToClipboard(outputPath);
} }
} }
} }
@@ -354,21 +369,49 @@ Item {
onExited: function (exitCode, exitStatus) { onExited: function (exitCode, exitStatus) {
if (exitCode === 0) { if (exitCode === 0) {
// Portals available, proceed to launch // Portals available, proceed to launch
launchRecorder() launchRecorder();
} else { } else {
isPending = false isPending = false;
hasActiveRecording = false hasActiveRecording = false;
ToastService.showError(pluginApi.tr("messages.no-portals"), pluginApi.tr("messages.no-portals-desc")) ToastService.showError(pluginApi.tr("messages.no-portals"), pluginApi.tr("messages.no-portals-desc"));
} }
} }
} }
// Detect focused monitor on Hyprland
Process {
id: monitorDetectProcess
stdout: StdioCollector {}
stderr: StdioCollector {}
onExited: function (exitCode, exitStatus) {
const output = String(monitorDetectProcess.stdout.text || "").trim();
if (exitCode !== 0 || output === "MONITOR_NOT_FOUND" || !output) {
isPending = false;
hasActiveRecording = false;
ToastService.showError(pluginApi.tr("messages.failed-start"), pluginApi.tr("messages.monitor-not-found"));
return;
}
// Parse "MONITOR_NAME:USE_PRIME" format
const parts = output.split(":");
const monitorName = parts[0];
const primeRun = parts.length > 1 && parts[1] === "1";
detectedMonitor = monitorName;
usePrimeRun = primeRun;
Logger.i("ScreenRecorder", "Detected monitor: " + monitorName + (primeRun ? " (prime-run)" : ""));
launchRecorderWithSource(monitorName, primeRun);
}
}
// Process to copy file to clipboard // Process to copy file to clipboard
Process { Process {
id: copyToClipboardProcess id: copyToClipboardProcess
onExited: function (exitCode, exitStatus) { onExited: function (exitCode, exitStatus) {
if (exitCode !== 0) { if (exitCode !== 0) {
Logger.e("ScreenRecorder", "Failed to copy file to clipboard, exit code:", exitCode) Logger.e("ScreenRecorder", "Failed to copy file to clipboard, exit code:", exitCode);
} }
} }
} }
@@ -381,13 +424,13 @@ Item {
onTriggered: { onTriggered: {
if (isPending && recorderProcess.running) { if (isPending && recorderProcess.running) {
// Process is still running after 2 seconds - assume recording started successfully // Process is still running after 2 seconds - assume recording started successfully
isPending = false isPending = false;
isRecording = true isRecording = true;
hasActiveRecording = true hasActiveRecording = true;
monitorTimer.running = true monitorTimer.running = true;
} else if (isPending) { } else if (isPending) {
// Process not running anymore - was cancelled or failed // Process not running anymore - was cancelled or failed
isPending = false isPending = false;
} }
} }
} }
@@ -400,8 +443,8 @@ Item {
repeat: true repeat: true
onTriggered: { onTriggered: {
if (!recorderProcess.running && isRecording) { if (!recorderProcess.running && isRecording) {
isRecording = false isRecording = false;
running = false running = false;
} }
} }
} }
@@ -412,7 +455,7 @@ Item {
running: false running: false
repeat: false repeat: false
onTriggered: { onTriggered: {
Quickshell.execDetached(["sh", "-c", "pkill -9 -f 'gpu-screen-recorder' 2>/dev/null || pkill -9 -f 'com.dec05eba.gpu_screen_recorder' 2>/dev/null || true"]) Quickshell.execDetached(["sh", "-c", "pkill -9 -f 'gpu-screen-recorder' 2>/dev/null || pkill -9 -f 'com.dec05eba.gpu_screen_recorder' 2>/dev/null || true"]);
} }
} }
} }

View File

@@ -1,9 +1,11 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import Quickshell import Quickshell
import Quickshell.Io
import qs.Commons import qs.Commons
import qs.Widgets import qs.Widgets
import qs.Services.UI import qs.Services.UI
import qs.Services.Compositor
ColumnLayout { ColumnLayout {
id: root id: root
@@ -11,80 +13,56 @@ ColumnLayout {
property var pluginApi: null property var pluginApi: null
property bool editHideInactive: property bool editHideInactive: pluginApi?.pluginSettings?.hideInactive ?? pluginApi?.manifest?.metadata?.defaultSettings?.hideInactive ?? false
pluginApi?.pluginSettings?.hideInactive ??
pluginApi?.manifest?.metadata?.defaultSettings?.hideInactive ??
false
property string editIconColor: property string editIconColor: pluginApi?.pluginSettings?.iconColor ?? pluginApi?.manifest?.metadata?.defaultSettings?.iconColor ?? "none"
pluginApi?.pluginSettings?.iconColor ??
pluginApi?.manifest?.metadata?.defaultSettings?.iconColor ??
"none"
property string editDirectory: property string editDirectory: pluginApi?.pluginSettings?.directory || pluginApi?.manifest?.metadata?.defaultSettings?.directory || ""
pluginApi?.pluginSettings?.directory ||
pluginApi?.manifest?.metadata?.defaultSettings?.directory ||
""
property string editFilenamePattern: property string editFilenamePattern: pluginApi?.pluginSettings?.filenamePattern || pluginApi?.manifest?.metadata?.defaultSettings?.filenamePattern || "recording_yyyyMMdd_HHmmss"
pluginApi?.pluginSettings?.filenamePattern ||
pluginApi?.manifest?.metadata?.defaultSettings?.filenamePattern ||
"recording_yyyyMMdd_HHmmss"
property string editFrameRate: // Migrate legacy frame rates to "custom"
readonly property var _validFrameRates: ["30", "60", "120", "custom"]
readonly property string _rawFrameRate:
pluginApi?.pluginSettings?.frameRate || pluginApi?.pluginSettings?.frameRate ||
pluginApi?.manifest?.metadata?.defaultSettings?.frameRate || pluginApi?.manifest?.metadata?.defaultSettings?.frameRate ||
"60" "60"
property string editFrameRate:
_validFrameRates.includes(_rawFrameRate) ? _rawFrameRate : "custom"
property string editCustomFrameRate:
_validFrameRates.includes(_rawFrameRate)
? (pluginApi?.pluginSettings?.customFrameRate ||
pluginApi?.manifest?.metadata?.defaultSettings?.customFrameRate ||
"60")
: _rawFrameRate
property string editAudioCodec: property string editAudioCodec:
pluginApi?.pluginSettings?.audioCodec || pluginApi?.pluginSettings?.audioCodec ||
pluginApi?.manifest?.metadata?.defaultSettings?.audioCodec || pluginApi?.manifest?.metadata?.defaultSettings?.audioCodec ||
"opus" "opus"
property string editVideoCodec: property string editVideoCodec: pluginApi?.pluginSettings?.videoCodec || pluginApi?.manifest?.metadata?.defaultSettings?.videoCodec || "h264"
pluginApi?.pluginSettings?.videoCodec ||
pluginApi?.manifest?.metadata?.defaultSettings?.videoCodec ||
"h264"
property string editQuality: property string editQuality: pluginApi?.pluginSettings?.quality || pluginApi?.manifest?.metadata?.defaultSettings?.quality || "very_high"
pluginApi?.pluginSettings?.quality ||
pluginApi?.manifest?.metadata?.defaultSettings?.quality ||
"very_high"
property string editColorRange: property string editColorRange: pluginApi?.pluginSettings?.colorRange || pluginApi?.manifest?.metadata?.defaultSettings?.colorRange || "limited"
pluginApi?.pluginSettings?.colorRange ||
pluginApi?.manifest?.metadata?.defaultSettings?.colorRange ||
"limited"
property bool editShowCursor: property bool editShowCursor: pluginApi?.pluginSettings?.showCursor ?? pluginApi?.manifest?.metadata?.defaultSettings?.showCursor ?? true
pluginApi?.pluginSettings?.showCursor ??
pluginApi?.manifest?.metadata?.defaultSettings?.showCursor ??
true
property bool editCopyToClipboard: property bool editCopyToClipboard: pluginApi?.pluginSettings?.copyToClipboard ?? pluginApi?.manifest?.metadata?.defaultSettings?.copyToClipboard ?? false
pluginApi?.pluginSettings?.copyToClipboard ??
pluginApi?.manifest?.metadata?.defaultSettings?.copyToClipboard ??
false
property string editAudioSource: property string editAudioSource: pluginApi?.pluginSettings?.audioSource || pluginApi?.manifest?.metadata?.defaultSettings?.audioSource || "default_output"
pluginApi?.pluginSettings?.audioSource ||
pluginApi?.manifest?.metadata?.defaultSettings?.audioSource ||
"default_output"
property string editVideoSource: property string editVideoSource: pluginApi?.pluginSettings?.videoSource || pluginApi?.manifest?.metadata?.defaultSettings?.videoSource || "portal"
pluginApi?.pluginSettings?.videoSource ||
pluginApi?.manifest?.metadata?.defaultSettings?.videoSource ||
"portal"
property string editResolution: property string editResolution: pluginApi?.pluginSettings?.resolution || pluginApi?.manifest?.metadata?.defaultSettings?.resolution || "original"
pluginApi?.pluginSettings?.resolution ||
pluginApi?.manifest?.metadata?.defaultSettings?.resolution ||
"original"
function saveSettings() { function saveSettings() {
if (!pluginApi) { if (!pluginApi) {
Logger.e("ScreenRecorder", "Cannot save: pluginApi is null") Logger.e("ScreenRecorder", "Cannot save: pluginApi is null");
return return;
} }
pluginApi.pluginSettings.hideInactive = root.editHideInactive pluginApi.pluginSettings.hideInactive = root.editHideInactive
@@ -92,6 +70,7 @@ ColumnLayout {
pluginApi.pluginSettings.directory = root.editDirectory pluginApi.pluginSettings.directory = root.editDirectory
pluginApi.pluginSettings.filenamePattern = root.editFilenamePattern pluginApi.pluginSettings.filenamePattern = root.editFilenamePattern
pluginApi.pluginSettings.frameRate = root.editFrameRate pluginApi.pluginSettings.frameRate = root.editFrameRate
pluginApi.pluginSettings.customFrameRate = root.editCustomFrameRate
pluginApi.pluginSettings.audioCodec = root.editAudioCodec pluginApi.pluginSettings.audioCodec = root.editAudioCodec
pluginApi.pluginSettings.videoCodec = root.editVideoCodec pluginApi.pluginSettings.videoCodec = root.editVideoCodec
pluginApi.pluginSettings.quality = root.editQuality pluginApi.pluginSettings.quality = root.editQuality
@@ -102,9 +81,9 @@ ColumnLayout {
pluginApi.pluginSettings.videoSource = root.editVideoSource pluginApi.pluginSettings.videoSource = root.editVideoSource
pluginApi.pluginSettings.resolution = root.editResolution pluginApi.pluginSettings.resolution = root.editResolution
pluginApi.saveSettings() pluginApi.saveSettings();
Logger.i("ScreenRecorder", "Settings saved successfully") Logger.i("ScreenRecorder", "Settings saved successfully");
} }
// Icon Color // Icon Color
NComboBox { NComboBox {
@@ -181,16 +160,25 @@ ColumnLayout {
NComboBox { NComboBox {
label: pluginApi.tr("settings.video.source") label: pluginApi.tr("settings.video.source")
description: pluginApi.tr("settings.video.source-desc") description: pluginApi.tr("settings.video.source-desc")
model: [ model: {
{ let options = [
"key": "portal", {
"name": pluginApi.tr("settings.video.sources-portal") "key": "portal",
}, "name": pluginApi.tr("settings.video.sources-portal")
{ },
"key": "screen", {
"name": pluginApi.tr("settings.video.sources-screen") "key": "screen",
"name": pluginApi.tr("settings.video.sources-screen")
}
];
if (CompositorService.isHyprland) {
options.push({
"key": "focused-monitor",
"name": pluginApi.tr("settings.video.sources-focused-monitor")
});
} }
] return options;
}
currentKey: root.editVideoSource currentKey: root.editVideoSource
onSelected: key => root.editVideoSource = key onSelected: key => root.editVideoSource = key
defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.videoSource || "portal" defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.videoSource || "portal"
@@ -201,22 +189,6 @@ ColumnLayout {
label: pluginApi.tr("settings.video.frame-rate") label: pluginApi.tr("settings.video.frame-rate")
description: pluginApi.tr("settings.video.frame-rate-desc") description: pluginApi.tr("settings.video.frame-rate-desc")
model: [ model: [
{
"key": "5",
"name": "5 FPS"
},
{
"key": "10",
"name": "10 FPS"
},
{
"key": "15",
"name": "15 FPS"
},
{
"key": "20",
"name": "20 FPS"
},
{ {
"key": "30", "key": "30",
"name": "30 FPS" "name": "30 FPS"
@@ -225,25 +197,13 @@ ColumnLayout {
"key": "60", "key": "60",
"name": "60 FPS" "name": "60 FPS"
}, },
{
"key": "100",
"name": "100 FPS"
},
{ {
"key": "120", "key": "120",
"name": "120 FPS" "name": "120 FPS"
}, },
{ {
"key": "144", "key": "custom",
"name": "144 FPS" "name": pluginApi.tr("settings.video.frame-rate-custom")
},
{
"key": "165",
"name": "165 FPS"
},
{
"key": "240",
"name": "240 FPS"
} }
] ]
currentKey: root.editFrameRate currentKey: root.editFrameRate
@@ -251,6 +211,26 @@ ColumnLayout {
defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.frameRate || "60" defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.frameRate || "60"
} }
// Custom Frame Rate
NTextInput {
visible: root.editFrameRate === "custom"
label: pluginApi.tr("settings.video.custom-frame-rate")
description: pluginApi.tr("settings.video.custom-frame-rate-desc")
placeholderText: "60"
text: root.editCustomFrameRate
onTextChanged: {
// Only allow numeric values
var numeric = text.replace(/[^0-9]/g, '')
if (numeric !== text) {
text = numeric
}
if (numeric) {
root.editCustomFrameRate = numeric
}
}
Layout.fillWidth: true
}
// Video Quality // Video Quality
NComboBox { NComboBox {
label: pluginApi.tr("settings.video.quality") label: pluginApi.tr("settings.video.quality")
@@ -284,25 +264,46 @@ ColumnLayout {
description: pluginApi.tr("settings.video.codec-desc") description: pluginApi.tr("settings.video.codec-desc")
model: { model: {
let options = [ let options = [
{"key": "h264", "name": "H264"}, {
{"key": "hevc", "name": "HEVC"}, "key": "h264",
{"key": "av1", "name": "AV1"}, "name": "H264"
{"key": "vp8", "name": "VP8"}, },
{"key": "vp9", "name": "VP9"} {
] "key": "hevc",
// Only add HDR options if source is 'screen' "name": "HEVC"
if (root.editVideoSource === "screen") { },
options.push({"key": "hevc_hdr", "name": "HEVC HDR"}) {
options.push({"key": "av1_hdr", "name": "AV1 HDR"}) "key": "av1",
"name": "AV1"
},
{
"key": "vp8",
"name": "VP8"
},
{
"key": "vp9",
"name": "VP9"
}
];
// Only add HDR options if source is 'screen' or 'focused-monitor'
if (root.editVideoSource === "screen" || root.editVideoSource === "focused-monitor") {
options.push({
"key": "hevc_hdr",
"name": "HEVC HDR"
});
options.push({
"key": "av1_hdr",
"name": "AV1 HDR"
});
} }
return options return options;
} }
currentKey: root.editVideoCodec currentKey: root.editVideoCodec
onSelected: key => { onSelected: key => {
root.editVideoCodec = key root.editVideoCodec = key;
// If an HDR codec is selected, change the colorRange to full // If an HDR codec is selected, change the colorRange to full
if (key.includes("_hdr")) { if (key.includes("_hdr")) {
root.editColorRange = "full" root.editColorRange = "full";
} }
} }
defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.videoCodec || "h264" defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.videoCodec || "h264"
@@ -310,8 +311,8 @@ ColumnLayout {
Connections { Connections {
target: root target: root
function onEditVideoSourceChanged() { function onEditVideoSourceChanged() {
if (root.editVideoSource !== "screen" && (root.editVideoCodec === "av1_hdr" || root.editVideoCodec === "hevc_hdr")) { if (root.editVideoSource !== "screen" && root.editVideoSource !== "focused-monitor" && (root.editVideoCodec === "av1_hdr" || root.editVideoCodec === "hevc_hdr")) {
root.editVideoCodec = "h264" root.editVideoCodec = "h264";
} }
} }
} }
@@ -435,7 +436,7 @@ ColumnLayout {
initialPath: root.editDirectory || Quickshell.env("HOME") + "/Videos" initialPath: root.editDirectory || Quickshell.env("HOME") + "/Videos"
onAccepted: paths => { onAccepted: paths => {
if (paths.length > 0) { if (paths.length > 0) {
root.editDirectory = paths[0] root.editDirectory = paths[0];
} }
} }
} }

View File

@@ -13,7 +13,8 @@
"started": "Aufnahme gestartet.", "started": "Aufnahme gestartet.",
"stop-recording": "Bildschirmaufnahme (Aufnahme stoppen)", "stop-recording": "Bildschirmaufnahme (Aufnahme stoppen)",
"stopping": "Aufnahme stoppen…", "stopping": "Aufnahme stoppen…",
"open-file": "Datei öffnen" "open-file": "Datei öffnen",
"monitor-not-found": "Could not detect the monitor under cursor."
}, },
"name": "Bildschirmrekorder", "name": "Bildschirmrekorder",
"settings": { "settings": {
@@ -52,7 +53,10 @@
"color-range-full": "Vollständig", "color-range-full": "Vollständig",
"color-range-limited": "Begrenzt", "color-range-limited": "Begrenzt",
"frame-rate": "Bildrate", "frame-rate": "Bildrate",
"frame-rate-custom": "Benutzerdefiniert",
"frame-rate-desc": "Ziel-Bildrate für Bildschirmaufnahmen", "frame-rate-desc": "Ziel-Bildrate für Bildschirmaufnahmen",
"custom-frame-rate": "Benutzerdefinierte Bildrate",
"custom-frame-rate-desc": "Geben Sie einen benutzerdefinierten Bildratenwert ein (FPS)",
"quality": "Videoqualität", "quality": "Videoqualität",
"quality-desc": "Höhere Qualität führt zu größeren Dateien", "quality-desc": "Höhere Qualität führt zu größeren Dateien",
"quality-high": "Hoch", "quality-high": "Hoch",
@@ -66,7 +70,8 @@
"source-desc": "Portal wird empfohlen, bei Artefakten versuchen Sie Bildschirm", "source-desc": "Portal wird empfohlen, bei Artefakten versuchen Sie Bildschirm",
"sources-portal": "Portal", "sources-portal": "Portal",
"sources-screen": "Bildschirm", "sources-screen": "Bildschirm",
"title": "Videoeinstellungen" "title": "Videoeinstellungen",
"sources-focused-monitor": "Focused monitor (Hyprland)"
} }
} }
} }

View File

@@ -13,7 +13,8 @@
"started": "Recording started.", "started": "Recording started.",
"stop-recording": "Screen Recorder (stop recording)", "stop-recording": "Screen Recorder (stop recording)",
"stopping": "Stopping recording…", "stopping": "Stopping recording…",
"open-file": "Open file" "open-file": "Open file",
"monitor-not-found": "Could not detect the monitor under cursor."
}, },
"name": "Screen Recorder", "name": "Screen Recorder",
"settings": { "settings": {
@@ -52,7 +53,10 @@
"color-range-full": "Full", "color-range-full": "Full",
"color-range-limited": "Limited", "color-range-limited": "Limited",
"frame-rate": "Frame rate", "frame-rate": "Frame rate",
"frame-rate-custom": "Custom",
"frame-rate-desc": "Target frame rate for screen recordings", "frame-rate-desc": "Target frame rate for screen recordings",
"custom-frame-rate": "Custom frame rate",
"custom-frame-rate-desc": "Enter a custom frame rate value (FPS)",
"quality": "Video quality", "quality": "Video quality",
"quality-desc": "Higher quality results in larger file sizes", "quality-desc": "Higher quality results in larger file sizes",
"quality-high": "High", "quality-high": "High",
@@ -66,6 +70,7 @@
"source-desc": "Portal is recommended, if you get artifacts try Screen", "source-desc": "Portal is recommended, if you get artifacts try Screen",
"sources-portal": "Portal", "sources-portal": "Portal",
"sources-screen": "Screen", "sources-screen": "Screen",
"sources-focused-monitor": "Focused monitor (Hyprland)",
"title": "Video Settings" "title": "Video Settings"
} }
} }

View File

@@ -12,7 +12,8 @@
"start-recording": "Grabador de pantalla (empezar a grabar)", "start-recording": "Grabador de pantalla (empezar a grabar)",
"started": "Grabación iniciada.", "started": "Grabación iniciada.",
"stop-recording": "Grabador de pantalla (detener grabación)", "stop-recording": "Grabador de pantalla (detener grabación)",
"stopping": "Deteniendo la grabación…" "stopping": "Deteniendo la grabación…",
"monitor-not-found": "Could not detect the monitor under cursor."
}, },
"name": "Grabadora de Pantalla", "name": "Grabadora de Pantalla",
"settings": { "settings": {
@@ -49,7 +50,10 @@
"color-range-full": "Completo", "color-range-full": "Completo",
"color-range-limited": "Limitado", "color-range-limited": "Limitado",
"frame-rate": "Tasa de fotogramas", "frame-rate": "Tasa de fotogramas",
"frame-rate-custom": "Personalizado",
"frame-rate-desc": "Tasa de fotogramas objetivo para grabaciones de pantalla", "frame-rate-desc": "Tasa de fotogramas objetivo para grabaciones de pantalla",
"custom-frame-rate": "Tasa de fotogramas personalizada",
"custom-frame-rate-desc": "Ingrese un valor de tasa de fotogramas personalizado (FPS)",
"quality": "Calidad de video", "quality": "Calidad de video",
"quality-desc": "Mayor calidad resulta en archivos más grandes", "quality-desc": "Mayor calidad resulta en archivos más grandes",
"quality-high": "Alto", "quality-high": "Alto",
@@ -63,7 +67,8 @@
"source-desc": "Se recomienda Portal, si obtiene artefactos intente Pantalla", "source-desc": "Se recomienda Portal, si obtiene artefactos intente Pantalla",
"sources-portal": "Portal", "sources-portal": "Portal",
"sources-screen": "Pantalla", "sources-screen": "Pantalla",
"title": "Configuración de Video" "title": "Configuración de Video",
"sources-focused-monitor": "Focused monitor (Hyprland)"
} }
} }
} }

View File

@@ -12,7 +12,8 @@
"start-recording": "Enregistreur d'écran (démarrer l'enregistrement)", "start-recording": "Enregistreur d'écran (démarrer l'enregistrement)",
"started": "Enregistrement démarré.", "started": "Enregistrement démarré.",
"stop-recording": "Enregistreur d'écran (arrêter l'enregistrement)", "stop-recording": "Enregistreur d'écran (arrêter l'enregistrement)",
"stopping": "Arrêt de l'enregistrement..." "stopping": "Arrêt de l'enregistrement...",
"monitor-not-found": "Impossible de détecter l'écran sous le curseur."
}, },
"name": "Enregistreur d'Écran", "name": "Enregistreur d'Écran",
"settings": { "settings": {
@@ -49,7 +50,10 @@
"color-range-full": "Complet / Plein", "color-range-full": "Complet / Plein",
"color-range-limited": "Limité(e)", "color-range-limited": "Limité(e)",
"frame-rate": "Fréquence d'images", "frame-rate": "Fréquence d'images",
"frame-rate-custom": "Personnalisé",
"frame-rate-desc": "Fréquence d'images cible pour les enregistrements d'écran", "frame-rate-desc": "Fréquence d'images cible pour les enregistrements d'écran",
"custom-frame-rate": "Fréquence d'images personnalisée",
"custom-frame-rate-desc": "Entrez une valeur de fréquence d'images personnalisée (FPS)",
"quality": "Qualité vidéo", "quality": "Qualité vidéo",
"quality-desc": "Une qualité supérieure résulte en des fichiers plus volumineux", "quality-desc": "Une qualité supérieure résulte en des fichiers plus volumineux",
"quality-high": "Haut/Haute", "quality-high": "Haut/Haute",
@@ -63,6 +67,7 @@
"source-desc": "Portal est recommandé, si vous obtenez des artefacts essayez Écran", "source-desc": "Portal est recommandé, si vous obtenez des artefacts essayez Écran",
"sources-portal": "Portail", "sources-portal": "Portail",
"sources-screen": "Écran", "sources-screen": "Écran",
"sources-focused-monitor": "Écran sous le curseur (Hyprland)",
"title": "Paramètres Vidéo" "title": "Paramètres Vidéo"
} }
} }

View File

@@ -12,7 +12,8 @@
"start-recording": "Képernyőrögzítő (felvétel indítása)", "start-recording": "Képernyőrögzítő (felvétel indítása)",
"started": "A felvétel elindult.", "started": "A felvétel elindult.",
"stop-recording": "Képernyőfelvevő (felvétel leállítása)", "stop-recording": "Képernyőfelvevő (felvétel leállítása)",
"stopping": "A felvétel leállítása…" "stopping": "A felvétel leállítása…",
"monitor-not-found": "Could not detect the monitor under cursor."
}, },
"name": "Képernyőfelvevő", "name": "Képernyőfelvevő",
"settings": { "settings": {
@@ -49,7 +50,10 @@
"color-range-full": "Teljes", "color-range-full": "Teljes",
"color-range-limited": "Korlátozott", "color-range-limited": "Korlátozott",
"frame-rate": "Képkockasebesség", "frame-rate": "Képkockasebesség",
"frame-rate-custom": "Egyéni",
"frame-rate-desc": "Képernyőfelvételek célzott képkockasebessége", "frame-rate-desc": "Képernyőfelvételek célzott képkockasebessége",
"custom-frame-rate": "Egyéni képkockasebesség",
"custom-frame-rate-desc": "Adjon meg egyéni képkockasebesség értéket (FPS)",
"quality": "Videóminőség", "quality": "Videóminőség",
"quality-desc": "A jobb minőség nagyobb fájlméretet eredményez", "quality-desc": "A jobb minőség nagyobb fájlméretet eredményez",
"quality-high": "Magas", "quality-high": "Magas",
@@ -63,7 +67,8 @@
"source-desc": "A Portal ajánlott, ha hibákat tapasztalsz, próbáld a Screen-t", "source-desc": "A Portal ajánlott, ha hibákat tapasztalsz, próbáld a Screen-t",
"sources-portal": "Portál", "sources-portal": "Portál",
"sources-screen": "Képernyő", "sources-screen": "Képernyő",
"title": "Videóbeállítások" "title": "Videóbeállítások",
"sources-focused-monitor": "Focused monitor (Hyprland)"
} }
} }
} }

View File

@@ -12,7 +12,8 @@
"start-recording": "P錄影 (開始錄影)", "start-recording": "P錄影 (開始錄影)",
"started": "Aufnahme gestartet.", "started": "Aufnahme gestartet.",
"stop-recording": "Skjáupptökutæki (hætta upptöku)", "stop-recording": "Skjáupptökutæki (hætta upptöku)",
"stopping": "Nagpapatigil ng pagrekord..." "stopping": "Nagpapatigil ng pagrekord...",
"monitor-not-found": "Could not detect the monitor under cursor."
}, },
"name": "Registratore Schermo", "name": "Registratore Schermo",
"settings": { "settings": {
@@ -49,7 +50,10 @@
"color-range-full": "Puno", "color-range-full": "Puno",
"color-range-limited": "Limitato", "color-range-limited": "Limitato",
"frame-rate": "Frequenza fotogrammi", "frame-rate": "Frequenza fotogrammi",
"frame-rate-custom": "Personalizzato",
"frame-rate-desc": "Frequenza fotogrammi target per le registrazioni dello schermo", "frame-rate-desc": "Frequenza fotogrammi target per le registrazioni dello schermo",
"custom-frame-rate": "Frequenza fotogrammi personalizzata",
"custom-frame-rate-desc": "Inserisci un valore personalizzato di frequenza fotogrammi (FPS)",
"quality": "Qualità video", "quality": "Qualità video",
"quality-desc": "Qualità superiore risulta in file più grandi", "quality-desc": "Qualità superiore risulta in file più grandi",
"quality-high": "Alta", "quality-high": "Alta",
@@ -63,7 +67,8 @@
"source-desc": "Portal è consigliato, se si ottengono artefatti prova Schermo", "source-desc": "Portal è consigliato, se si ottengono artefatti prova Schermo",
"sources-portal": "Portale", "sources-portal": "Portale",
"sources-screen": "Skjerm", "sources-screen": "Skjerm",
"title": "Impostazioni Video" "title": "Impostazioni Video",
"sources-focused-monitor": "Focused monitor (Hyprland)"
} }
} }
} }

View File

@@ -13,7 +13,8 @@
"started": "録画を開始しました。", "started": "録画を開始しました。",
"stop-recording": "画面録画(停止)", "stop-recording": "画面録画(停止)",
"stopping": "録画を停止しています…", "stopping": "録画を停止しています…",
"open-file": "ファイルを開く" "open-file": "ファイルを開く",
"monitor-not-found": "Could not detect the monitor under cursor."
}, },
"name": "画面レコーダー", "name": "画面レコーダー",
"settings": { "settings": {
@@ -52,7 +53,10 @@
"color-range-full": "フル", "color-range-full": "フル",
"color-range-limited": "限定", "color-range-limited": "限定",
"frame-rate": "フレームレート", "frame-rate": "フレームレート",
"frame-rate-custom": "カスタム",
"frame-rate-desc": "画面録画の目標フレームレート", "frame-rate-desc": "画面録画の目標フレームレート",
"custom-frame-rate": "カスタムフレームレート",
"custom-frame-rate-desc": "カスタムフレームレート値を入力してくださいFPS",
"quality": "ビデオ品質", "quality": "ビデオ品質",
"quality-desc": "品質が高いほど、ファイルサイズが大きくなります", "quality-desc": "品質が高いほど、ファイルサイズが大きくなります",
"quality-high": "高", "quality-high": "高",
@@ -66,7 +70,8 @@
"source-desc": "ポータルが推奨されます。アーティファクトが発生する場合は「スクリーン」を試してください", "source-desc": "ポータルが推奨されます。アーティファクトが発生する場合は「スクリーン」を試してください",
"sources-portal": "ポータル", "sources-portal": "ポータル",
"sources-screen": "スクリーン", "sources-screen": "スクリーン",
"title": "ビデオ設定" "title": "ビデオ設定",
"sources-focused-monitor": "Focused monitor (Hyprland)"
} }
} }
} }

View File

@@ -12,7 +12,8 @@
"start-recording": "Qeydkerê ekranê (dest bi qeydkirinê bike)", "start-recording": "Qeydkerê ekranê (dest bi qeydkirinê bike)",
"started": "Qeydkirin dest pê kir.", "started": "Qeydkirin dest pê kir.",
"stop-recording": "Tomarkera dîmenderê (tomarkirinê bide sekinandin)", "stop-recording": "Tomarkera dîmenderê (tomarkirinê bide sekinandin)",
"stopping": "Qeydkirin radiweste…" "stopping": "Qeydkirin radiweste…",
"monitor-not-found": "Could not detect the monitor under cursor."
}, },
"name": "Qeydkerê Ekranê", "name": "Qeydkerê Ekranê",
"settings": { "settings": {
@@ -49,7 +50,10 @@
"color-range-full": "Tije", "color-range-full": "Tije",
"color-range-limited": "Sînorkirî", "color-range-limited": "Sînorkirî",
"frame-rate": "Rêjeya çarçoveyê", "frame-rate": "Rêjeya çarçoveyê",
"frame-rate-custom": "Kesane",
"frame-rate-desc": "Rêjeya çarçoveya hedefê ji bo qeydên ekranê", "frame-rate-desc": "Rêjeya çarçoveya hedefê ji bo qeydên ekranê",
"custom-frame-rate": "Rêjeya çarçoveya kesane",
"custom-frame-rate-desc": "Nirxek rêjeya çarçoveya kesane binivîse (FPS)",
"quality": "Kalîteya vîdyoyê", "quality": "Kalîteya vîdyoyê",
"quality-desc": "Encamên bi kalîte bilindtir dibin sedema mezinahiyên pelan ên mezintir", "quality-desc": "Encamên bi kalîte bilindtir dibin sedema mezinahiyên pelan ên mezintir",
"quality-high": "Bilind", "quality-high": "Bilind",
@@ -63,7 +67,8 @@
"source-desc": "Portal tê pêşniyarkirin, eger tu artefaktan bibînî Screen biceribîne", "source-desc": "Portal tê pêşniyarkirin, eger tu artefaktan bibînî Screen biceribîne",
"sources-portal": "Portal", "sources-portal": "Portal",
"sources-screen": "Dîmende", "sources-screen": "Dîmende",
"title": "Mîhengên Vîdeoyê" "title": "Mîhengên Vîdeoyê",
"sources-focused-monitor": "Focused monitor (Hyprland)"
} }
} }
} }

View File

@@ -12,7 +12,8 @@
"start-recording": "Schermrecorder (opname starten)", "start-recording": "Schermrecorder (opname starten)",
"started": "Opname gestart.", "started": "Opname gestart.",
"stop-recording": "Schermrecorder (opname stoppen)", "stop-recording": "Schermrecorder (opname stoppen)",
"stopping": "Opname stoppen…" "stopping": "Opname stoppen…",
"monitor-not-found": "Could not detect the monitor under cursor."
}, },
"name": "Schermrecorder", "name": "Schermrecorder",
"settings": { "settings": {
@@ -49,7 +50,10 @@
"color-range-full": "Volledig", "color-range-full": "Volledig",
"color-range-limited": "Beperkt", "color-range-limited": "Beperkt",
"frame-rate": "Framesnelheid", "frame-rate": "Framesnelheid",
"frame-rate-custom": "Aangepast",
"frame-rate-desc": "Doelframesnelheid voor schermopnames", "frame-rate-desc": "Doelframesnelheid voor schermopnames",
"custom-frame-rate": "Aangepaste framesnelheid",
"custom-frame-rate-desc": "Voer een aangepaste framesnelheid in (FPS)",
"quality": "Videokwaliteit", "quality": "Videokwaliteit",
"quality-desc": "Hogere kwaliteit resulteert in grotere bestanden", "quality-desc": "Hogere kwaliteit resulteert in grotere bestanden",
"quality-high": "Hoog", "quality-high": "Hoog",
@@ -63,7 +67,8 @@
"source-desc": "Portal wordt aanbevolen, probeer Scherm als u artefacten krijgt", "source-desc": "Portal wordt aanbevolen, probeer Scherm als u artefacten krijgt",
"sources-portal": "Portaal", "sources-portal": "Portaal",
"sources-screen": "Scherm", "sources-screen": "Scherm",
"title": "Video-instellingen" "title": "Video-instellingen",
"sources-focused-monitor": "Focused monitor (Hyprland)"
} }
} }
} }

View File

@@ -12,7 +12,8 @@
"start-recording": "Rejestrator ekranu (rozpocznij nagrywanie)", "start-recording": "Rejestrator ekranu (rozpocznij nagrywanie)",
"started": "Rozpoczęto nagrywanie.", "started": "Rozpoczęto nagrywanie.",
"stop-recording": "Rejestrator ekranu (zatrzymaj nagrywanie)", "stop-recording": "Rejestrator ekranu (zatrzymaj nagrywanie)",
"stopping": "Zatrzymywanie nagrywania…" "stopping": "Zatrzymywanie nagrywania…",
"monitor-not-found": "Could not detect the monitor under cursor."
}, },
"name": "Rejestrator ekranu", "name": "Rejestrator ekranu",
"settings": { "settings": {
@@ -49,7 +50,10 @@
"color-range-full": "Pełny", "color-range-full": "Pełny",
"color-range-limited": "Ograniczone", "color-range-limited": "Ograniczone",
"frame-rate": "Liczba klatek na sekundę", "frame-rate": "Liczba klatek na sekundę",
"frame-rate-custom": "Niestandardowa",
"frame-rate-desc": "Docelowa liczba klatek na sekundę dla nagrań ekranu", "frame-rate-desc": "Docelowa liczba klatek na sekundę dla nagrań ekranu",
"custom-frame-rate": "Niestandardowa liczba klatek",
"custom-frame-rate-desc": "Wprowadź niestandardową liczbę klatek na sekundę (FPS)",
"quality": "Jakość wideo", "quality": "Jakość wideo",
"quality-desc": "Wyższa jakość skutkuje większymi rozmiarami plików", "quality-desc": "Wyższa jakość skutkuje większymi rozmiarami plików",
"quality-high": "Wysoki", "quality-high": "Wysoki",
@@ -63,7 +67,8 @@
"source-desc": "Zalecany jest Portal, jeśli występują artefakty, spróbuj opcji Ekran", "source-desc": "Zalecany jest Portal, jeśli występują artefakty, spróbuj opcji Ekran",
"sources-portal": "Portal", "sources-portal": "Portal",
"sources-screen": "Ekran", "sources-screen": "Ekran",
"title": "Ustawienia wideo" "title": "Ustawienia wideo",
"sources-focused-monitor": "Focused monitor (Hyprland)"
} }
} }
} }

View File

@@ -12,7 +12,8 @@
"start-recording": "Gravador de tela (iniciar gravação)", "start-recording": "Gravador de tela (iniciar gravação)",
"started": "Gravação iniciada.", "started": "Gravação iniciada.",
"stop-recording": "Gravador de tela (parar gravação)", "stop-recording": "Gravador de tela (parar gravação)",
"stopping": "Parando a gravação..." "stopping": "Parando a gravação...",
"monitor-not-found": "Could not detect the monitor under cursor."
}, },
"name": "Gravador de Tela", "name": "Gravador de Tela",
"settings": { "settings": {
@@ -49,7 +50,10 @@
"color-range-full": "Completo", "color-range-full": "Completo",
"color-range-limited": "Limitado", "color-range-limited": "Limitado",
"frame-rate": "Taxa de quadros", "frame-rate": "Taxa de quadros",
"frame-rate-custom": "Personalizado",
"frame-rate-desc": "Taxa de quadros alvo para gravações de tela", "frame-rate-desc": "Taxa de quadros alvo para gravações de tela",
"custom-frame-rate": "Taxa de quadros personalizada",
"custom-frame-rate-desc": "Insira um valor personalizado de taxa de quadros (FPS)",
"quality": "Qualidade de vídeo", "quality": "Qualidade de vídeo",
"quality-desc": "Maior qualidade resulta em arquivos maiores", "quality-desc": "Maior qualidade resulta em arquivos maiores",
"quality-high": "Alto(a)", "quality-high": "Alto(a)",
@@ -63,7 +67,8 @@
"source-desc": "Portal é recomendado, se obtiver artefatos tente Tela", "source-desc": "Portal é recomendado, se obtiver artefatos tente Tela",
"sources-portal": "Portal", "sources-portal": "Portal",
"sources-screen": "Tela", "sources-screen": "Tela",
"title": "Configurações de Vídeo" "title": "Configurações de Vídeo",
"sources-focused-monitor": "Focused monitor (Hyprland)"
} }
} }
} }

View File

@@ -12,7 +12,8 @@
"start-recording": "Запись экрана (начать запись)", "start-recording": "Запись экрана (начать запись)",
"started": "Запись началась.", "started": "Запись началась.",
"stop-recording": "Запись экрана (остановить запись)", "stop-recording": "Запись экрана (остановить запись)",
"stopping": "Остановка записи…" "stopping": "Остановка записи…",
"monitor-not-found": "Could not detect the monitor under cursor."
}, },
"name": "Запись Экрана", "name": "Запись Экрана",
"settings": { "settings": {
@@ -49,7 +50,10 @@
"color-range-full": "Полный", "color-range-full": "Полный",
"color-range-limited": "Ограниченный", "color-range-limited": "Ограниченный",
"frame-rate": "Частота кадров", "frame-rate": "Частота кадров",
"frame-rate-custom": "Пользовательская",
"frame-rate-desc": "Целевая частота кадров для записи экрана", "frame-rate-desc": "Целевая частота кадров для записи экрана",
"custom-frame-rate": "Пользовательская частота кадров",
"custom-frame-rate-desc": "Введите пользовательское значение частоты кадров (FPS)",
"quality": "Качество видео", "quality": "Качество видео",
"quality-desc": "Более высокое качество приводит к большим размерам файлов", "quality-desc": "Более высокое качество приводит к большим размерам файлов",
"quality-high": "Высокий", "quality-high": "Высокий",
@@ -63,7 +67,8 @@
"source-desc": "Рекомендуется Portal, если появляются артефакты попробуйте Экран", "source-desc": "Рекомендуется Portal, если появляются артефакты попробуйте Экран",
"sources-portal": "Портал", "sources-portal": "Портал",
"sources-screen": "Экран", "sources-screen": "Экран",
"title": "Настройки Видео" "title": "Настройки Видео",
"sources-focused-monitor": "Focused monitor (Hyprland)"
} }
} }
} }

View File

@@ -12,7 +12,8 @@
"start-recording": "Ekran kaydedici (kayda başla)", "start-recording": "Ekran kaydedici (kayda başla)",
"started": "Kayıt başladı.", "started": "Kayıt başladı.",
"stop-recording": "Ekran kaydedici (kaydı durdur)", "stop-recording": "Ekran kaydedici (kaydı durdur)",
"stopping": "Kaydı durdurma…" "stopping": "Kaydı durdurma…",
"monitor-not-found": "Could not detect the monitor under cursor."
}, },
"name": "Ekran Kaydedici", "name": "Ekran Kaydedici",
"settings": { "settings": {
@@ -49,7 +50,10 @@
"color-range-full": "Tam", "color-range-full": "Tam",
"color-range-limited": "Sınırlı", "color-range-limited": "Sınırlı",
"frame-rate": "Kare hızı", "frame-rate": "Kare hızı",
"frame-rate-custom": "Özel",
"frame-rate-desc": "Ekran kayıtları için hedef kare hızı", "frame-rate-desc": "Ekran kayıtları için hedef kare hızı",
"custom-frame-rate": "Özel kare hızı",
"custom-frame-rate-desc": "Özel bir kare hızı değeri girin (FPS)",
"quality": "Video kalitesi", "quality": "Video kalitesi",
"quality-desc": "Daha yüksek kalite daha büyük dosya boyutlarına yol açar", "quality-desc": "Daha yüksek kalite daha büyük dosya boyutlarına yol açar",
"quality-high": "Yüksek", "quality-high": "Yüksek",
@@ -63,7 +67,8 @@
"source-desc": "Portal önerilir, artefaktlar alırsanız Ekran'ı deneyin", "source-desc": "Portal önerilir, artefaktlar alırsanız Ekran'ı deneyin",
"sources-portal": "Portal", "sources-portal": "Portal",
"sources-screen": "Ekran", "sources-screen": "Ekran",
"title": "Video Ayarları" "title": "Video Ayarları",
"sources-focused-monitor": "Focused monitor (Hyprland)"
} }
} }
} }

View File

@@ -12,7 +12,8 @@
"start-recording": "Запис екрана (почати запис)", "start-recording": "Запис екрана (почати запис)",
"started": "Запис розпочато.", "started": "Запис розпочато.",
"stop-recording": "Запис екрана (зупинити запис)", "stop-recording": "Запис екрана (зупинити запис)",
"stopping": "Зупинка запису…" "stopping": "Зупинка запису…",
"monitor-not-found": "Could not detect the monitor under cursor."
}, },
"name": "Записувач Екрану", "name": "Записувач Екрану",
"settings": { "settings": {
@@ -49,7 +50,10 @@
"color-range-full": "Повний", "color-range-full": "Повний",
"color-range-limited": "Обмежений", "color-range-limited": "Обмежений",
"frame-rate": "Частота кадрів", "frame-rate": "Частота кадрів",
"frame-rate-custom": "Користувацька",
"frame-rate-desc": "Цільова частота кадрів для запису екрану", "frame-rate-desc": "Цільова частота кадрів для запису екрану",
"custom-frame-rate": "Користувацька частота кадрів",
"custom-frame-rate-desc": "Введіть користувацьке значення частоти кадрів (FPS)",
"quality": "Якість відео", "quality": "Якість відео",
"quality-desc": "Вища якість призводить до більших розмірів файлів", "quality-desc": "Вища якість призводить до більших розмірів файлів",
"quality-high": "Високий", "quality-high": "Високий",
@@ -63,7 +67,8 @@
"source-desc": "Рекомендується Portal, якщо з'являються артефакти спробуйте Екран", "source-desc": "Рекомендується Portal, якщо з'являються артефакти спробуйте Екран",
"sources-portal": "Портал", "sources-portal": "Портал",
"sources-screen": "Екран", "sources-screen": "Екран",
"title": "Налаштування Відео" "title": "Налаштування Відео",
"sources-focused-monitor": "Focused monitor (Hyprland)"
} }
} }
} }

View File

@@ -13,7 +13,8 @@
"started": "已开始录制。", "started": "已开始录制。",
"stop-recording": "屏幕录像(停止录制)", "stop-recording": "屏幕录像(停止录制)",
"stopping": "停止录制…", "stopping": "停止录制…",
"open-file": "打开文件" "open-file": "打开文件",
"monitor-not-found": "Could not detect the monitor under cursor."
}, },
"name": "屏幕录制器", "name": "屏幕录制器",
"settings": { "settings": {
@@ -52,7 +53,10 @@
"color-range-full": "全范围", "color-range-full": "全范围",
"color-range-limited": "有限", "color-range-limited": "有限",
"frame-rate": "帧率", "frame-rate": "帧率",
"frame-rate-custom": "自定义",
"frame-rate-desc": "屏幕录制的目标帧率", "frame-rate-desc": "屏幕录制的目标帧率",
"custom-frame-rate": "自定义帧率",
"custom-frame-rate-desc": "输入自定义帧率值FPS",
"quality": "视频质量", "quality": "视频质量",
"quality-desc": "更高的质量会导致更大的文件大小", "quality-desc": "更高的质量会导致更大的文件大小",
"quality-high": "高", "quality-high": "高",
@@ -66,7 +70,8 @@
"source-desc": "推荐使用桌面门户 (Portal),如果出现画面异常请尝试屏幕", "source-desc": "推荐使用桌面门户 (Portal),如果出现画面异常请尝试屏幕",
"sources-portal": "桌面门户", "sources-portal": "桌面门户",
"sources-screen": "屏幕", "sources-screen": "屏幕",
"title": "视频设置" "title": "视频设置",
"sources-focused-monitor": "Focused monitor (Hyprland)"
} }
} }
} }

View File

@@ -1,7 +1,7 @@
{ {
"id": "screen-recorder", "id": "screen-recorder",
"name": "Screen Recorder", "name": "Screen Recorder",
"version": "1.1.7", "version": "1.2.0",
"minNoctaliaVersion": "3.6.0", "minNoctaliaVersion": "3.6.0",
"author": "Noctalia Team", "author": "Noctalia Team",
"official": true, "official": true,

View File

@@ -27,12 +27,13 @@
"viewMode": "list" "viewMode": "list"
}, },
"audio": { "audio": {
"cavaFrameRate": 30,
"mprisBlacklist": [ "mprisBlacklist": [
], ],
"preferredPlayer": "", "preferredPlayer": "",
"spectrumFrameRate": 30,
"visualizerType": "linear", "visualizerType": "linear",
"volumeFeedback": false, "volumeFeedback": false,
"volumeFeedbackSoundFile": "",
"volumeOverdrive": true, "volumeOverdrive": true,
"volumeStep": 5 "volumeStep": 5
}, },
@@ -42,37 +43,40 @@
"backgroundOpacity": 0.93, "backgroundOpacity": 0.93,
"barType": "simple", "barType": "simple",
"capsuleColorKey": "none", "capsuleColorKey": "none",
"capsuleOpacity": 0.36, "capsuleOpacity": 0.51,
"contentPadding": 2,
"density": "comfortable", "density": "comfortable",
"displayMode": "always_visible", "displayMode": "always_visible",
"enableExclusionZoneInset": true,
"floating": false, "floating": false,
"fontScale": 1,
"frameRadius": 12, "frameRadius": 12,
"frameThickness": 8, "frameThickness": 8,
"hideOnOverview": false, "hideOnOverview": false,
"marginHorizontal": 10, "marginHorizontal": 10,
"marginVertical": 5, "marginVertical": 5,
"middleClickAction": "none",
"middleClickCommand": "",
"middleClickFollowMouse": false,
"monitors": [ "monitors": [
], ],
"mouseWheelAction": "none",
"mouseWheelWrap": true,
"outerCorners": true, "outerCorners": true,
"position": "top", "position": "top",
"reverseScroll": false,
"rightClickAction": "controlCenter",
"rightClickCommand": "",
"rightClickFollowMouse": true,
"screenOverrides": [ "screenOverrides": [
], ],
"showCapsule": true, "showCapsule": true,
"showOnWorkspaceSwitch": true,
"showOutline": false, "showOutline": false,
"useSeparateOpacity": false, "useSeparateOpacity": false,
"widgetSpacing": 4,
"widgets": { "widgets": {
"center": [ "center": [
{
"clockColor": "none",
"customFont": "Adwaita Sans",
"formatHorizontal": "HH:mm:ss t",
"formatVertical": "HH mm - dd MM",
"id": "Clock",
"tooltipFormat": "HH:mm ddd, MMM dd",
"useCustomFont": false
}
],
"left": [
{ {
"colorizeSystemIcon": "none", "colorizeSystemIcon": "none",
"enableColorization": false, "enableColorization": false,
@@ -114,6 +118,7 @@
"enableScrollWheel": true, "enableScrollWheel": true,
"focusedColor": "primary", "focusedColor": "primary",
"followFocusedScreen": false, "followFocusedScreen": false,
"fontWeight": "bold",
"groupedBorderOpacity": 1, "groupedBorderOpacity": 1,
"hideUnoccupied": true, "hideUnoccupied": true,
"iconScale": 0.8, "iconScale": 0.8,
@@ -122,14 +127,41 @@
"occupiedColor": "secondary", "occupiedColor": "secondary",
"pillSize": 0.6, "pillSize": 0.6,
"showApplications": false, "showApplications": false,
"showApplicationsHover": false,
"showBadge": true, "showBadge": true,
"showLabelsOnlyWhenOccupied": true, "showLabelsOnlyWhenOccupied": true,
"unfocusedIconsOpacity": 1 "unfocusedIconsOpacity": 1
}, },
{
"colorizeIcons": false,
"hideMode": "visible",
"iconScale": 0.9,
"id": "Taskbar",
"maxTaskbarWidth": 45,
"onlyActiveWorkspaces": false,
"onlySameOutput": true,
"showPinnedApps": true,
"showTitle": true,
"smartWidth": true,
"titleWidth": 120
},
{
"blacklist": [
],
"chevronColor": "none",
"colorizeIcons": false,
"drawerEnabled": true,
"hidePassive": false,
"id": "Tray",
"pinned": [
]
}
],
"left": [
{ {
"clockColor": "none", "clockColor": "none",
"customFont": "", "customFont": "Adwaita Sans",
"formatHorizontal": "ddd, MMM dd", "formatHorizontal": "HH:mm:ss t",
"formatVertical": "HH mm - dd MM", "formatVertical": "HH mm - dd MM",
"id": "Clock", "id": "Clock",
"tooltipFormat": "HH:mm ddd, MMM dd", "tooltipFormat": "HH:mm ddd, MMM dd",
@@ -140,6 +172,7 @@
"diskPath": "/", "diskPath": "/",
"iconColor": "none", "iconColor": "none",
"id": "SystemMonitor", "id": "SystemMonitor",
"showCpuCores": false,
"showCpuFreq": false, "showCpuFreq": false,
"showCpuTemp": true, "showCpuTemp": true,
"showCpuUsage": true, "showCpuUsage": true,
@@ -181,17 +214,6 @@
} }
], ],
"right": [ "right": [
{
"blacklist": [
],
"chevronColor": "none",
"colorizeIcons": false,
"drawerEnabled": true,
"hidePassive": false,
"id": "Tray",
"pinned": [
]
},
{ {
"colorizeSystemIcon": "none", "colorizeSystemIcon": "none",
"enableColorization": false, "enableColorization": false,
@@ -226,13 +248,6 @@
"wheelUpUpdateText": false, "wheelUpUpdateText": false,
"wheelUpdateText": false "wheelUpdateText": false
}, },
{
"displayMode": "alwaysShow",
"iconColor": "none",
"id": "Volume",
"middleClickCommand": "pwvucontrol || pavucontrol",
"textColor": "none"
},
{ {
"applyToAllMonitors": false, "applyToAllMonitors": false,
"displayMode": "onhover", "displayMode": "onhover",
@@ -247,6 +262,19 @@
}, },
"id": "plugin:privacy-indicator" "id": "plugin:privacy-indicator"
}, },
{
"displayMode": "alwaysShow",
"iconColor": "none",
"id": "VPN",
"textColor": "none"
},
{
"displayMode": "alwaysShow",
"iconColor": "none",
"id": "Volume",
"middleClickCommand": "pwvucontrol || pavucontrol",
"textColor": "none"
},
{ {
"deviceNativePath": "", "deviceNativePath": "",
"displayMode": "icon-always", "displayMode": "icon-always",
@@ -257,18 +285,13 @@
"showPowerProfiles": true "showPowerProfiles": true
}, },
{ {
"displayMode": "alwaysShow", "clockColor": "none",
"iconColor": "none", "customFont": "",
"id": "VPN", "formatHorizontal": "ddd, MMM dd",
"textColor": "none" "formatVertical": "HH mm - dd MM",
}, "id": "Clock",
{ "tooltipFormat": "HH:mm ddd, MMM dd",
"hideWhenZero": true, "useCustomFont": false
"hideWhenZeroUnread": false,
"iconColor": "none",
"id": "NotificationHistory",
"showUnreadBadge": true,
"unreadBadgeColor": "primary"
}, },
{ {
"colorizeDistroLogo": false, "colorizeDistroLogo": false,
@@ -283,6 +306,8 @@
} }
}, },
"brightness": { "brightness": {
"backlightDeviceMappings": [
],
"brightnessStep": 5, "brightnessStep": 5,
"enableDdcSupport": false, "enableDdcSupport": false,
"enforceMinimum": true "enforceMinimum": true
@@ -363,6 +388,9 @@
}, },
{ {
"id": "NightLight" "id": "NightLight"
},
{
"id": "Notifications"
} }
] ]
} }
@@ -370,6 +398,7 @@
"desktopWidgets": { "desktopWidgets": {
"enabled": true, "enabled": true,
"gridSnap": true, "gridSnap": true,
"gridSnapScale": false,
"monitorWidgets": [ "monitorWidgets": [
{ {
"name": "DP-3", "name": "DP-3",
@@ -523,32 +552,44 @@
} }
] ]
} }
] ],
"overviewEnabled": true
}, },
"dock": { "dock": {
"animationSpeed": 1, "animationSpeed": 1,
"backgroundOpacity": 1, "backgroundOpacity": 1,
"colorizeIcons": true, "colorizeIcons": true,
"deadOpacity": 0.6, "deadOpacity": 0.6,
"displayMode": "always_visible", "displayMode": "exclusive",
"dockType": "static", "dockType": "floating",
"enabled": true, "enabled": false,
"floatingRatio": 1, "floatingRatio": 1,
"groupApps": false,
"groupClickAction": "cycle",
"groupContextMenuMode": "extended",
"groupIndicatorStyle": "dots",
"inactiveIndicators": true, "inactiveIndicators": true,
"indicatorColor": "primary",
"indicatorOpacity": 0.6,
"indicatorThickness": 3,
"launcherIconColor": "none",
"launcherPosition": "end",
"monitors": [ "monitors": [
], ],
"onlySameOutput": false, "onlySameOutput": false,
"pinnedApps": [ "pinnedApps": [
"firefox", "Alacritty",
"com.discordapp.Discord",
"com.moonlight_stream.Moonlight", "com.moonlight_stream.Moonlight",
"Element" "com.discordapp.Discord",
"org.keepassxc.KeePassXC",
"firefox"
], ],
"pinnedStatic": true, "pinnedStatic": true,
"position": "top", "position": "top",
"showFrameIndicator": true, "showDockIndicator": false,
"showLauncherIcon": false,
"sitOnFrame": false, "sitOnFrame": false,
"size": 1.2 "size": 0.72
}, },
"general": { "general": {
"allowPanelsOnScreenWithoutBar": true, "allowPanelsOnScreenWithoutBar": true,
@@ -558,11 +599,13 @@
"autoStartAuth": false, "autoStartAuth": false,
"avatarImage": "/home/aiden/.face", "avatarImage": "/home/aiden/.face",
"boxRadiusRatio": 1, "boxRadiusRatio": 1,
"clockFormat": "hh\\nmm", "clockFormat": "hh:mm\\nt",
"clockStyle": "custom", "clockStyle": "custom",
"compactLockScreen": false, "compactLockScreen": false,
"dimmerOpacity": 0, "dimmerOpacity": 0,
"enableBlurBehind": true,
"enableLockScreenCountdown": true, "enableLockScreenCountdown": true,
"enableLockScreenMediaControls": true,
"enableShadows": true, "enableShadows": true,
"forceBlackScreenCorners": false, "forceBlackScreenCorners": false,
"iRadiusRatio": 1, "iRadiusRatio": 1,
@@ -571,7 +614,8 @@
"Down" "Down"
], ],
"keyEnter": [ "keyEnter": [
"Return" "Return",
"Enter"
], ],
"keyEscape": [ "keyEscape": [
"Esc" "Esc"
@@ -597,6 +641,7 @@
"lockScreenMonitors": [ "lockScreenMonitors": [
], ],
"lockScreenTint": 0, "lockScreenTint": 0,
"passwordChars": true,
"radiusRatio": 1, "radiusRatio": 1,
"reverseScroll": false, "reverseScroll": false,
"scaleRatio": 1, "scaleRatio": 1,
@@ -621,6 +666,20 @@
"startup": "", "startup": "",
"wallpaperChange": "" "wallpaperChange": ""
}, },
"idle": {
"customCommands": "[]",
"enabled": false,
"fadeDuration": 5,
"lockCommand": "",
"lockTimeout": 660,
"resumeLockCommand": "",
"resumeScreenOffCommand": "",
"resumeSuspendCommand": "",
"screenOffCommand": "",
"screenOffTimeout": 600,
"suspendCommand": "",
"suspendTimeout": 1800
},
"location": { "location": {
"analogClockInCalendar": false, "analogClockInCalendar": false,
"firstDayOfWeek": -1, "firstDayOfWeek": -1,
@@ -637,11 +696,13 @@
}, },
"network": { "network": {
"airplaneModeEnabled": false, "airplaneModeEnabled": false,
"bluetoothAutoConnect": true,
"bluetoothDetailsViewMode": "grid", "bluetoothDetailsViewMode": "grid",
"bluetoothHideUnnamedDevices": false, "bluetoothHideUnnamedDevices": false,
"bluetoothRssiPollIntervalMs": 10000, "bluetoothRssiPollIntervalMs": 10000,
"bluetoothRssiPollingEnabled": false, "bluetoothRssiPollingEnabled": false,
"disableDiscoverability": false, "disableDiscoverability": false,
"networkPanelView": "wifi",
"wifiDetailsViewMode": "list", "wifiDetailsViewMode": "list",
"wifiEnabled": true "wifiEnabled": true
}, },
@@ -654,6 +715,10 @@
"manualSunset": "21:00", "manualSunset": "21:00",
"nightTemp": "4140" "nightTemp": "4140"
}, },
"noctaliaPerformance": {
"disableDesktopWidgets": true,
"disableWallpaper": true
},
"notifications": { "notifications": {
"backgroundOpacity": 1, "backgroundOpacity": 1,
"clearDismissed": true, "clearDismissed": true,
@@ -765,7 +830,7 @@
"showHeader": true, "showHeader": true,
"showKeybinds": true "showKeybinds": true
}, },
"settingsVersion": 53, "settingsVersion": 57,
"systemMonitor": { "systemMonitor": {
"batteryCriticalThreshold": 5, "batteryCriticalThreshold": 5,
"batteryWarningThreshold": 20, "batteryWarningThreshold": 20,
@@ -815,19 +880,18 @@
"enableUserTheming": false "enableUserTheming": false
}, },
"ui": { "ui": {
"bluetoothDetailsViewMode": "grid",
"bluetoothHideUnnamedDevices": false,
"boxBorderEnabled": false, "boxBorderEnabled": false,
"fontDefault": "Sans Serif", "fontDefault": "Sans Serif",
"fontDefaultScale": 1, "fontDefaultScale": 1,
"fontFixed": "monospace", "fontFixed": "monospace",
"fontFixedScale": 1, "fontFixedScale": 1,
"networkPanelView": "wifi", "panelBackgroundOpacity": 0.73,
"panelBackgroundOpacity": 0.5,
"panelsAttachedToBar": true, "panelsAttachedToBar": true,
"scrollbarAlwaysVisible": true,
"settingsPanelMode": "centered", "settingsPanelMode": "centered",
"settingsPanelSideBarCardStyle": false,
"tooltipsEnabled": true, "tooltipsEnabled": true,
"wifiDetailsViewMode": "grid" "translucentWidgets": true
}, },
"wallpaper": { "wallpaper": {
"automationEnabled": true, "automationEnabled": true,

View File

@@ -1,5 +1,6 @@
flatpak --user update flatpak --user update
sudo xbps-install -Su
git -C ~/void-packages/ pull git -C ~/void-packages/ pull
cat local-package-list.txt | xargs -n1 ~/void-packages/xbps-src update-check
~/void-packages/xbps-src update-local ~/void-packages/xbps-src update-local
sudo xbps-install -Su
read -p "Press enter to continue" read -p "Press enter to continue"