diff --git a/home/aiden/.bashrc b/home/aiden/.bashrc index 07221e3..cd0349a 100644 --- a/home/aiden/.bashrc +++ b/home/aiden/.bashrc @@ -4,6 +4,7 @@ [[ $- != *i* ]] && return alias ls='ls --color=auto' +alias ip='ip -c=always' PS1='[\u@\h \W]\$ ' alias update='~/update.sh' diff --git a/home/aiden/.config/niri/config.kdl b/home/aiden/.config/niri/config.kdl index 99352c3..20285d8 100644 --- a/home/aiden/.config/niri/config.kdl +++ b/home/aiden/.config/niri/config.kdl @@ -7,6 +7,7 @@ environment { QT_QPA_PLATFORMTHEME "gtk3" } +include "workspaces.kdl" include "startup.kdl" include "input.kdl" include "outputs.kdl" diff --git a/home/aiden/.config/niri/startup.kdl b/home/aiden/.config/niri/startup.kdl index 0f234a5..868dde7 100644 --- a/home/aiden/.config/niri/startup.kdl +++ b/home/aiden/.config/niri/startup.kdl @@ -11,29 +11,12 @@ spawn-at-startup "/usr/bin/nextcloud" spawn-at-startup "/usr/bin/swayidle" "-w" spawn-at-startup "~/.local/bin/niri-sidebar" "listen" spawn-at-startup "/usr/bin/niri-float-sticky" +spawn-at-startup "/usr/bin/flatpak" "--user" "run" "com.github.wwmm.easyeffects" "-w" -workspace "chat" { - 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/flatpak" "--user" "run" "im.nheko.Nheko" //spawn-at-startup "/usr/bin/element-desktop" //"--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/local/bin/discord-delay.sh" -//window-rule { -// match app-id="srain" -// open-on-workspace "chat" -//} //spawn-at-startup "/usr/bin/srain" diff --git a/home/aiden/.config/niri/workspaces.kdl b/home/aiden/.config/niri/workspaces.kdl new file mode 100644 index 0000000..176f05a --- /dev/null +++ b/home/aiden/.config/niri/workspaces.kdl @@ -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" +} diff --git a/home/aiden/.config/noctalia/colorschemes/Lilac AMOLED/Lilac AMOLED.json b/home/aiden/.config/noctalia/colorschemes/Lilac AMOLED/Lilac AMOLED.json index e3fcb42..5066d84 100644 --- a/home/aiden/.config/noctalia/colorschemes/Lilac AMOLED/Lilac AMOLED.json +++ b/home/aiden/.config/noctalia/colorschemes/Lilac AMOLED/Lilac AMOLED.json @@ -1,34 +1,90 @@ { "dark": { - "mPrimary": "#b58fff", - "mOnPrimary": "#000000", - "mSecondary": "#c79aff", + "mPrimary": "#b58fff", + "mOnPrimary": "#000000", + "mSecondary": "#c79aff", "mOnSecondary": "#000000", - "mTertiary": "#d8b4ff", - "mOnTertiary": "#000000", - "mError": "#ff6f9b", - "mOnError": "#000000", - "mSurface": "#000000", - "mOnSurface": "#e8d8ff", - "mSurfaceVariant": "#110d1a", + "mTertiary": "#d8b4ff", + "mOnTertiary": "#000000", + "mError": "#ff6f9b", + "mOnError": "#000000", + "mSurface": "#000000", + "mOnSurface": "#e8d8ff", + "mSurfaceVariant": "#110d1a", "mOnSurfaceVariant": "#b58fff", - "mOutline": "#4c3a70", - "mShadow": "#000000" + "mOutline": "#4c3a70", + "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": { - "mPrimary": "#8a56d4", - "mOnPrimary": "#ffffff", - "mSecondary": "#a074ff", + "mPrimary": "#8a56d4", + "mOnPrimary": "#ffffff", + "mSecondary": "#a074ff", "mOnSecondary": "#ffffff", - "mTertiary": "#c79aff", - "mOnTertiary": "#ffffff", - "mError": "#ff6f9b", - "mOnError": "#ffffff", - "mSurface": "#fbf8ff", - "mOnSurface": "#1a1428", - "mSurfaceVariant": "#e8e0f8", + "mTertiary": "#c79aff", + "mOnTertiary": "#ffffff", + "mError": "#ff6f9b", + "mOnError": "#ffffff", + "mSurface": "#fbf8ff", + "mOnSurface": "#1a1428", + "mSurfaceVariant": "#e8e0f8", "mOnSurfaceVariant": "#8a56d4", - "mOutline": "#9b85c2", - "mShadow": "#e2d8f5" + "mOutline": "#9b85c2", + "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" + } + } } -} +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/colorschemes/Rose Pine Moon/Rose Pine Moon.json b/home/aiden/.config/noctalia/colorschemes/Rose Pine Moon/Rose Pine Moon.json index 2df81f8..ba9d089 100644 --- a/home/aiden/.config/noctalia/colorschemes/Rose Pine Moon/Rose Pine Moon.json +++ b/home/aiden/.config/noctalia/colorschemes/Rose Pine Moon/Rose Pine Moon.json @@ -15,7 +15,35 @@ "mOutline": "#44415a", "mShadow": "#232136", "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": { "mPrimary": "#d7827e", @@ -33,6 +61,34 @@ "mOutline": "#dfdad9", "mShadow": "#faf4ed", "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" + } } -} +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/colorschemes/Tokyo Night Moon/Tokyo Night Moon.json b/home/aiden/.config/noctalia/colorschemes/Tokyo Night Moon/Tokyo Night Moon.json index 78bd1c1..d63f838 100644 --- a/home/aiden/.config/noctalia/colorschemes/Tokyo Night Moon/Tokyo Night Moon.json +++ b/home/aiden/.config/noctalia/colorschemes/Tokyo Night Moon/Tokyo Night Moon.json @@ -1,38 +1,94 @@ { - "dark": { - "mPrimary": "#7a88cf", - "mOnPrimary": "#1f2335", - "mSecondary": "#d7729f", - "mOnSecondary": "#1f2335", - "mTertiary": "#9cd58a", - "mOnTertiary": "#1f2335", - "mError": "#f7768e", - "mOnError": "#1f2335", - "mSurface": "#1f2335", - "mOnSurface": "#a9b1d6", - "mSurfaceVariant": "#2c314a", - "mOnSurfaceVariant": "#8289a6", - "mOutline": "#4b517a", - "mShadow": "#181b2a", - "mHover": "#9cd58a", - "mOnHover": "#1f2335" - }, - "light": { - "mPrimary": "#4e70c2", - "mOnPrimary": "#f0f2f7", - "mSecondary": "#85539c", - "mOnSecondary": "#f0f2f7", - "mTertiary": "#4c663b", - "mOnTertiary": "#f0f2f7", - "mError": "#e55561", - "mOnError": "#f0f2f7", - "mSurface": "#f0f2f7", - "mOnSurface": "#4e70c2", - "mSurfaceVariant": "#dbdfea", - "mOnSurfaceVariant": "#6a708a", - "mOutline": "#c8ccd8", - "mShadow": "#a4a8b7", - "mHover": "#4c663b", - "mOnHover": "#f0f2f7" + "dark": { + "mPrimary": "#7a88cf", + "mOnPrimary": "#1f2335", + "mSecondary": "#d7729f", + "mOnSecondary": "#1f2335", + "mTertiary": "#9cd58a", + "mOnTertiary": "#1f2335", + "mError": "#f7768e", + "mOnError": "#1f2335", + "mSurface": "#1f2335", + "mOnSurface": "#a9b1d6", + "mSurfaceVariant": "#2c314a", + "mOnSurfaceVariant": "#c0caf5", + "mOutline": "#4b517a", + "mShadow": "#181b2a", + "mHover": "#9cd58a", + "mOnHover": "#1f2335", + "terminal": { + "foreground": "#a9b1d6", + "background": "#1f2335", + "selectionFg": "#a9b1d6", + "selectionBg": "#4b517a", + "cursorText": "#1f2335", + "cursor": "#a9b1d6", + "normal": { + "black": "#1f2335", + "red": "#f7768e", + "green": "#9cd58a", + "yellow": "#e6c384", + "blue": "#7a88cf", + "magenta": "#d7729f", + "cyan": "#7bb0c0", + "white": "#8289a6" + }, + "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" + } + } + } +} \ No newline at end of file diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/BarWidget.qml b/home/aiden/.config/noctalia/plugins/privacy-indicator/BarWidget.qml index 393c521..0c6e0bf 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/BarWidget.qml +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/BarWidget.qml @@ -36,12 +36,12 @@ Item { property var cfg: pluginApi?.pluginSettings || ({}) property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({}) - property bool hideInactive: cfg.hideInactive ?? defaults.hideInactive - property bool removeMargins: cfg.removeMargins ?? defaults.removeMargins - property int iconSpacing: cfg.iconSpacing || Style.marginXS - - property string activeColorKey: cfg.activeColor ?? defaults.activeColor - property string inactiveColorKey: cfg.inactiveColor ?? defaults.inactiveColor + property bool hideInactive: cfg.hideInactive ?? defaults.hideInactive ?? false + property bool enableToast: cfg.enableToast ?? defaults.enableToast ?? true + property bool removeMargins: cfg.removeMargins ?? defaults.removeMargins ?? false + property int iconSpacing: cfg.iconSpacing ?? defaults.iconSpacing ?? 4 + property string activeColorKey: cfg.activeColor ?? defaults.activeColor ?? "primary" + property string inactiveColorKey: cfg.inactiveColor ?? defaults.inactiveColor ?? "none" readonly property color activeColor: Color.resolveColorKey(activeColorKey) readonly property color inactiveColor: inactiveColorKey === "none" ? Qt.alpha(Color.mOnSurfaceVariant, 0.3) : Color.resolveColorKey(inactiveColorKey) diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/Main.qml b/home/aiden/.config/noctalia/plugins/privacy-indicator/Main.qml index 64d618e..c948ba9 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/Main.qml +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/Main.qml @@ -25,6 +25,12 @@ Item { property var _prevCamApps: [] 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 { 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: { checkAppChanges(micApps, _prevMicApps, "Microphone", "microphone", activeColorKey); @@ -248,7 +250,7 @@ Item { // Helper to detect activation edge property bool oldMicActive: false onMicActiveChanged: { - if (micActive && (!oldMicActive)) { + if (enableToast && micActive && !oldMicActive) { ToastService.showNotice(pluginApi?.tr("toast.mic-on") || "Microphone is active", "", "microphone"); } oldMicActive = micActive @@ -256,7 +258,7 @@ Item { property bool oldCamActive: false onCamActiveChanged: { - if (camActive && !oldCamActive) { + if (enableToast && camActive && !oldCamActive) { ToastService.showNotice(pluginApi?.tr("toast.cam-on") || "Camera is active", "", "camera"); } oldCamActive = camActive @@ -268,7 +270,7 @@ Item { property bool oldScrActive: false onScrActiveChanged: { - if (scrActive && !oldScrActive) { + if (enableToast && scrActive && !oldScrActive) { ToastService.showNotice(pluginApi?.tr("toast.screen-on") || "Screen sharing is active", "", "screen-share"); } oldScrActive = scrActive diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/Settings.qml b/home/aiden/.config/noctalia/plugins/privacy-indicator/Settings.qml index 1d455fd..27e750a 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/Settings.qml +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/Settings.qml @@ -11,11 +11,12 @@ ColumnLayout { property var cfg: pluginApi?.pluginSettings || ({}) property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({}) - property bool hideInactive: cfg.hideInactive ?? defaults.hideInactive - property bool removeMargins: cfg.removeMargins ?? defaults.removeMargins - property int iconSpacing: cfg.iconSpacing || Style.marginXS - property string activeColor: cfg.activeColor ?? defaults.activeColor - property string inactiveColor: cfg.inactiveColor ?? defaults.inactiveColor + property bool hideInactive: cfg.hideInactive ?? defaults.hideInactive ?? false + property bool enableToast: cfg.enableToast ?? defaults.enableToast ?? true + property bool removeMargins: cfg.removeMargins ?? defaults.removeMargins ?? false + property int iconSpacing: cfg.iconSpacing ?? defaults.iconSpacing ?? 4 + property string activeColor: cfg.activeColor ?? defaults.activeColor ?? "primary" + property string inactiveColor: cfg.inactiveColor ?? defaults.inactiveColor ?? "none" spacing: Style.marginL @@ -32,35 +33,45 @@ ColumnLayout { description: pluginApi?.tr("settings.hideInactive.desc") checked: root.hideInactive - onToggled: function (checked) { + onToggled: 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 { label: pluginApi?.tr("settings.removeMargins.label") description: pluginApi?.tr("settings.removeMargins.desc") checked: root.removeMargins - onToggled: function (checked) { + onToggled: checked => { root.removeMargins = checked; } } - NComboBox { + NColorChoice { label: pluginApi?.tr("settings.activeColor.label") description: pluginApi?.tr("settings.activeColor.desc") - model: Color.colorKeyModel currentKey: root.activeColor onSelected: key => root.activeColor = key } - NComboBox { + NColorChoice { label: pluginApi?.tr("settings.inactiveColor.label") description: pluginApi?.tr("settings.inactiveColor.desc") - model: Color.colorKeyModel currentKey: root.inactiveColor onSelected: key => root.inactiveColor = key + noneColor: Qt.alpha(Color.mOnSurfaceVariant, 0.3) + noneOnColor: Qt.alpha(Color.mOnSurface, 0.7) } NComboBox { @@ -96,6 +107,7 @@ ColumnLayout { } pluginApi.pluginSettings.hideInactive = root.hideInactive; + pluginApi.pluginSettings.enableToast = root.enableToast; pluginApi.pluginSettings.iconSpacing = root.iconSpacing; pluginApi.pluginSettings.removeMargins = root.removeMargins; pluginApi.pluginSettings.activeColor = root.activeColor; 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 932724e..ce8faae 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/en.json +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/i18n/en.json @@ -6,11 +6,15 @@ "activeColor": { "desc": "Color of the icons when active.", "label": "Active icon color" - }, + }, "hideInactive": { "desc": "Hide microphone, camera, and screen icons when there are inactive.", "label": "Hide inactive states" }, + "enableToast": { + "desc": "Show toast messages when one of the states changes.", + "label": "Enable toast notifications" + }, "inactiveColor": { "desc": "Color of the icons when inactive.", "label": "Inactive icon color" diff --git a/home/aiden/.config/noctalia/plugins/privacy-indicator/manifest.json b/home/aiden/.config/noctalia/plugins/privacy-indicator/manifest.json index e6e68ed..ccf3c2a 100644 --- a/home/aiden/.config/noctalia/plugins/privacy-indicator/manifest.json +++ b/home/aiden/.config/noctalia/plugins/privacy-indicator/manifest.json @@ -1,7 +1,7 @@ { "id": "privacy-indicator", "name": "Privacy Indicator", - "version": "1.2.4", + "version": "1.2.5", "minNoctaliaVersion": "3.6.0", "author": "Noctalia Team", "official": true, @@ -25,7 +25,9 @@ "metadata": { "defaultSettings": { "hideInactive": false, + "enableToast": true, "removeMargins": false, + "iconSpacing": 4, "activeColor": "primary", "inactiveColor": "none" } diff --git a/home/aiden/.config/noctalia/plugins/screen-recorder/Main.qml b/home/aiden/.config/noctalia/plugins/screen-recorder/Main.qml index 79b71b0..7657b1d 100644 --- a/home/aiden/.config/noctalia/plugins/screen-recorder/Main.qml +++ b/home/aiden/.config/noctalia/plugins/screen-recorder/Main.qml @@ -4,6 +4,7 @@ import Quickshell.Io import qs.Commons import qs.Services.UI import qs.Services.System +import qs.Services.Compositor Item { id: root @@ -15,6 +16,8 @@ Item { property bool hasActiveRecording: false property string outputPath: "" property bool isAvailable: false + property string detectedMonitor: "" + property bool usePrimeRun: false // Single reusable Process object Process { @@ -33,22 +36,22 @@ Item { IpcHandler { target: "plugin:screen-recorder" - + function toggle() { if (root.isAvailable) { - root.toggleRecording() + root.toggleRecording(); } } function start() { if (root.isAvailable && !root.isRecording && !root.isPending) { - root.startRecording() + root.startRecording(); } } function stop() { if (root.isRecording || root.isPending) { - root.stopRecording() + root.stopRecording(); } } } @@ -58,6 +61,7 @@ Item { readonly property string directory: pluginApi?.pluginSettings?.directory || "" readonly property string filenamePattern: pluginApi?.pluginSettings?.filenamePattern || "recording_yyyyMMdd_HHmmss" 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 videoCodec: pluginApi?.pluginSettings?.videoCodec || "h264" readonly property string quality: pluginApi?.pluginSettings?.quality || "very_high" @@ -70,86 +74,83 @@ Item { function buildTooltip() { if (!isAvailable) { - return pluginApi.tr("messages.not-installed") + return pluginApi.tr("messages.not-installed"); } if (isPending) { - pluginApi.tr("messages.started") + pluginApi.tr("messages.started"); } 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 function toggleRecording() { - (isRecording || isPending) ? stopRecording() : startRecording() + (isRecording || isPending) ? stopRecording() : startRecording(); } // Open recording file function openFile(path) { if (!path) { - return + return; } - Quickshell.execDetached(["xdg-open", path]) + Quickshell.execDetached(["xdg-open", path]); } // Copy file to clipboard as file reference function copyFileToClipboard(filePath) { if (!filePath) { - return + return; } // 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 escapedUri = fileUri.replace(/'/g, "'\\''") - const command = "printf '%s' '" + escapedUri + "' | wl-copy --type text/uri-list" + const fileUri = "file://" + filePath.replace(/ /g, "%20").replace(/'/g, "%27").replace(/"/g, "%22"); + const escapedUri = fileUri.replace(/'/g, "'\\''"); + const command = "printf '%s' '" + escapedUri + "' | wl-copy --type text/uri-list"; copyToClipboardProcess.exec({ "command": ["sh", "-c", command] - }) + }); } // Start screen recording function startRecording() { if (!isAvailable) { - return + return; } if (isRecording || isPending) { - return + return; } - isPending = true - hasActiveRecording = false + isPending = true; + hasActiveRecording = false; // Close any opened panel if ((PanelService.openedPanel !== null) && !PanelService.openedPanel.isClosing) { - PanelService.openedPanel.close() + PanelService.openedPanel.close(); } // First, ensure xdg-desktop-portal and a compositor portal are running portalCheckProcess.exec({ - "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)"] - }) + "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)"] + }); } 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) - 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']; - + 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']; + // Escape literal text by wrapping non-token sequences in single quotes var escaped = ""; var i = 0; var literalBuffer = ""; - + while (i < pattern.length) { var matched = false; - + // Try to match each token at current position (longest first) for (var j = 0; j < tokens.length; j++) { var token = tokens[j]; @@ -164,7 +165,7 @@ Item { continue; // Skip this token match, treat as literal } } - + // Flush any accumulated literal text if (literalBuffer) { escaped += "'" + literalBuffer + "'"; @@ -185,103 +186,117 @@ Item { break; } } - + if (!matched) { // Character is not part of a token, add to literal buffer literalBuffer += pattern[i]; i++; } } - + // Flush any remaining literal text if (literalBuffer) { escaped += "'" + literalBuffer + "'"; } - + // Use Qt's I18n.locale.toString for proper date/time formatting - var expanded = I18n.locale.toString(now, escaped) - return expanded + ".mp4" + var expanded = I18n.locale.toString(now, escaped); + return expanded + ".mp4"; } function launchRecorder() { - var pattern = filenamePattern || "recording_yyyyMMdd_HHmmss" - var filename = expandFilenamePattern(pattern) - var videoDir = Settings.preprocessPath(directory) + // If focused-monitor is selected, detect monitor first + if (videoSource === "focused-monitor" && CompositorService.isHyprland) { + 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) { - videoDir = Quickshell.env("HOME") + "/Videos" + videoDir = Quickshell.env("HOME") + "/Videos"; } if (videoDir && !videoDir.endsWith("/")) { - videoDir += "/" + videoDir += "/"; } - outputPath = videoDir + filename + outputPath = videoDir + filename; const audioFlags = (() => { - if (audioSource === "none") { - return "" - } - if (audioSource === "both") { - return `-ac ${audioCodec} -a "default_output|default_input"` - } - return `-ac ${audioCodec} -a ${audioSource}` - })() + if (audioSource === "none") { + return ""; + } + if (audioSource === "both") { + return `-ac ${audioCodec} -a "default_output|default_input"`; + } + return `-ac ${audioCodec} -a ${audioSource}`; + })(); - var resolutionFlag = (resolution !== "original") ? `-s ${resolution}` : "" - var flags = `-w ${videoSource} -f ${frameRate} -k ${videoCodec} ${audioFlags} -q ${quality} -cursor ${showCursor ? "yes" : "no"} -cr ${colorRange} ${resolutionFlag} -o "${outputPath}"` + var actualFrameRate = (frameRate === "custom") ? customFrameRate : frameRate; + 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 = ` _gpuscreenrecorder_flatpak_installed() { flatpak list --app | grep -q "com.dec05eba.gpu_screen_recorder" } 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 - 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 echo "GPU_SCREEN_RECORDER_NOT_INSTALLED" - fi` + fi`; // Use Process to monitor it and read stderr recorderProcess.exec({ "command": ["sh", "-c", command] - }) + }); // Start monitoring - if process ends quickly, it was likely cancelled - pendingTimer.running = true + pendingTimer.running = true; } // Stop recording function stopRecording() { 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 - isPending = false - pendingTimer.running = false - monitorTimer.running = false - hasActiveRecording = false + isRecording = false; + isPending = false; + pendingTimer.running = false; + monitorTimer.running = false; + hasActiveRecording = false; // Just in case, force kill after 3 seconds - killTimer.running = true + killTimer.running = true; } // Helper function to truncate text for toast display function truncateForToast(text, maxLength = 128) { - if (text.length <= maxLength) return text - return text.substring(0, maxLength) + "…" + if (text.length <= maxLength) + return text; + return text.substring(0, maxLength) + "…"; } // Helper function to check if output indicates user cancellation function isCancelledByUser(stdoutText, stderrText) { - const stdout = String(stdoutText || "").toLowerCase() - const stderr = String(stderrText || "").toLowerCase() - const combined = stdout + " " + stderr - 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") + const stdout = String(stdoutText || "").toLowerCase(); + const stderr = String(stderrText || "").toLowerCase(); + const combined = stdout + " " + stderr; + 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"); } // Process to run and monitor gpu-screen-recorder @@ -290,59 +305,59 @@ Item { stdout: StdioCollector {} stderr: StdioCollector {} onExited: function (exitCode, exitStatus) { - const stdout = String(recorderProcess.stdout.text || "").trim() - const stderr = String(recorderProcess.stderr.text || "").trim() - const wasCancelled = isCancelledByUser(stdout, stderr) + const stdout = String(recorderProcess.stdout.text || "").trim(); + const stderr = String(recorderProcess.stderr.text || "").trim(); + const wasCancelled = isCancelledByUser(stdout, stderr); if (isPending) { // Process ended while we were pending - likely cancelled or error - isPending = false - pendingTimer.running = false + isPending = false; + pendingTimer.running = false; // Check if gpu-screen-recorder is not installed if (stdout === "GPU_SCREEN_RECORDER_NOT_INSTALLED") { - ToastService.showError(pluginApi.tr("messages.not-installed"), pluginApi.tr("messages.not-installed-desc")) - return + ToastService.showError(pluginApi.tr("messages.not-installed"), pluginApi.tr("messages.not-installed-desc")); + return; } // If it failed to start, show a clear error toast with stderr // But don't show error if user intentionally cancelled via portal if (exitCode !== 0) { if (stderr.length > 0 && !wasCancelled) { - ToastService.showError(pluginApi.tr("messages.failed-start"), truncateForToast(stderr)) - Logger.e("ScreenRecorder", stderr) + ToastService.showError(pluginApi.tr("messages.failed-start"), truncateForToast(stderr)); + Logger.e("ScreenRecorder", stderr); } } } else if (isRecording || hasActiveRecording) { // Process ended normally while recording - isRecording = false - monitorTimer.running = false + isRecording = false; + monitorTimer.running = false; if (exitCode === 0) { // 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) { - copyFileToClipboard(outputPath) + copyFileToClipboard(outputPath); } } else { // Don't show error if user intentionally cancelled if (!wasCancelled) { if (stderr.length > 0) { - ToastService.showError(pluginApi.tr("messages.failed-start"), truncateForToast(stderr)) - Logger.e("ScreenRecorder", stderr) + ToastService.showError(pluginApi.tr("messages.failed-start"), truncateForToast(stderr)); + Logger.e("ScreenRecorder", stderr); } 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) { // 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", 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) { - copyFileToClipboard(outputPath) + copyFileToClipboard(outputPath); } } } @@ -354,21 +369,49 @@ Item { onExited: function (exitCode, exitStatus) { if (exitCode === 0) { // Portals available, proceed to launch - launchRecorder() + launchRecorder(); } else { - isPending = false - hasActiveRecording = false - ToastService.showError(pluginApi.tr("messages.no-portals"), pluginApi.tr("messages.no-portals-desc")) + isPending = false; + hasActiveRecording = false; + 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 { id: copyToClipboardProcess onExited: function (exitCode, exitStatus) { 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: { if (isPending && recorderProcess.running) { // Process is still running after 2 seconds - assume recording started successfully - isPending = false - isRecording = true - hasActiveRecording = true - monitorTimer.running = true + isPending = false; + isRecording = true; + hasActiveRecording = true; + monitorTimer.running = true; } else if (isPending) { // Process not running anymore - was cancelled or failed - isPending = false + isPending = false; } } } @@ -400,8 +443,8 @@ Item { repeat: true onTriggered: { if (!recorderProcess.running && isRecording) { - isRecording = false - running = false + isRecording = false; + running = false; } } } @@ -412,7 +455,7 @@ Item { running: false repeat: false 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"]); } } } diff --git a/home/aiden/.config/noctalia/plugins/screen-recorder/Settings.qml b/home/aiden/.config/noctalia/plugins/screen-recorder/Settings.qml index 790bf10..0c9b11c 100644 --- a/home/aiden/.config/noctalia/plugins/screen-recorder/Settings.qml +++ b/home/aiden/.config/noctalia/plugins/screen-recorder/Settings.qml @@ -1,9 +1,11 @@ import QtQuick import QtQuick.Layouts import Quickshell +import Quickshell.Io import qs.Commons import qs.Widgets import qs.Services.UI +import qs.Services.Compositor ColumnLayout { id: root @@ -11,80 +13,56 @@ ColumnLayout { property var pluginApi: null - property bool editHideInactive: - pluginApi?.pluginSettings?.hideInactive ?? - pluginApi?.manifest?.metadata?.defaultSettings?.hideInactive ?? - false + property bool editHideInactive: pluginApi?.pluginSettings?.hideInactive ?? pluginApi?.manifest?.metadata?.defaultSettings?.hideInactive ?? false - property string editIconColor: - pluginApi?.pluginSettings?.iconColor ?? - pluginApi?.manifest?.metadata?.defaultSettings?.iconColor ?? - "none" + property string editIconColor: pluginApi?.pluginSettings?.iconColor ?? pluginApi?.manifest?.metadata?.defaultSettings?.iconColor ?? "none" - property string editDirectory: - pluginApi?.pluginSettings?.directory || - pluginApi?.manifest?.metadata?.defaultSettings?.directory || - "" + property string editDirectory: pluginApi?.pluginSettings?.directory || pluginApi?.manifest?.metadata?.defaultSettings?.directory || "" - property string editFilenamePattern: - pluginApi?.pluginSettings?.filenamePattern || - pluginApi?.manifest?.metadata?.defaultSettings?.filenamePattern || - "recording_yyyyMMdd_HHmmss" + property string editFilenamePattern: pluginApi?.pluginSettings?.filenamePattern || pluginApi?.manifest?.metadata?.defaultSettings?.filenamePattern || "recording_yyyyMMdd_HHmmss" + + // Migrate legacy frame rates to "custom" + readonly property var _validFrameRates: ["30", "60", "120", "custom"] + readonly property string _rawFrameRate: + pluginApi?.pluginSettings?.frameRate || + pluginApi?.manifest?.metadata?.defaultSettings?.frameRate || + "60" property string editFrameRate: - pluginApi?.pluginSettings?.frameRate || - pluginApi?.manifest?.metadata?.defaultSettings?.frameRate || - "60" + _validFrameRates.includes(_rawFrameRate) ? _rawFrameRate : "custom" + + property string editCustomFrameRate: + _validFrameRates.includes(_rawFrameRate) + ? (pluginApi?.pluginSettings?.customFrameRate || + pluginApi?.manifest?.metadata?.defaultSettings?.customFrameRate || + "60") + : _rawFrameRate property string editAudioCodec: pluginApi?.pluginSettings?.audioCodec || pluginApi?.manifest?.metadata?.defaultSettings?.audioCodec || "opus" - property string editVideoCodec: - pluginApi?.pluginSettings?.videoCodec || - pluginApi?.manifest?.metadata?.defaultSettings?.videoCodec || - "h264" + property string editVideoCodec: pluginApi?.pluginSettings?.videoCodec || pluginApi?.manifest?.metadata?.defaultSettings?.videoCodec || "h264" - property string editQuality: - pluginApi?.pluginSettings?.quality || - pluginApi?.manifest?.metadata?.defaultSettings?.quality || - "very_high" + property string editQuality: pluginApi?.pluginSettings?.quality || pluginApi?.manifest?.metadata?.defaultSettings?.quality || "very_high" - property string editColorRange: - pluginApi?.pluginSettings?.colorRange || - pluginApi?.manifest?.metadata?.defaultSettings?.colorRange || - "limited" + property string editColorRange: pluginApi?.pluginSettings?.colorRange || pluginApi?.manifest?.metadata?.defaultSettings?.colorRange || "limited" - property bool editShowCursor: - pluginApi?.pluginSettings?.showCursor ?? - pluginApi?.manifest?.metadata?.defaultSettings?.showCursor ?? - true + property bool editShowCursor: pluginApi?.pluginSettings?.showCursor ?? pluginApi?.manifest?.metadata?.defaultSettings?.showCursor ?? true - property bool editCopyToClipboard: - pluginApi?.pluginSettings?.copyToClipboard ?? - pluginApi?.manifest?.metadata?.defaultSettings?.copyToClipboard ?? - false + property bool editCopyToClipboard: pluginApi?.pluginSettings?.copyToClipboard ?? pluginApi?.manifest?.metadata?.defaultSettings?.copyToClipboard ?? false - property string editAudioSource: - pluginApi?.pluginSettings?.audioSource || - pluginApi?.manifest?.metadata?.defaultSettings?.audioSource || - "default_output" + property string editAudioSource: pluginApi?.pluginSettings?.audioSource || pluginApi?.manifest?.metadata?.defaultSettings?.audioSource || "default_output" - property string editVideoSource: - pluginApi?.pluginSettings?.videoSource || - pluginApi?.manifest?.metadata?.defaultSettings?.videoSource || - "portal" + property string editVideoSource: pluginApi?.pluginSettings?.videoSource || pluginApi?.manifest?.metadata?.defaultSettings?.videoSource || "portal" - property string editResolution: - pluginApi?.pluginSettings?.resolution || - pluginApi?.manifest?.metadata?.defaultSettings?.resolution || - "original" + property string editResolution: pluginApi?.pluginSettings?.resolution || pluginApi?.manifest?.metadata?.defaultSettings?.resolution || "original" function saveSettings() { if (!pluginApi) { - Logger.e("ScreenRecorder", "Cannot save: pluginApi is null") - return + Logger.e("ScreenRecorder", "Cannot save: pluginApi is null"); + return; } pluginApi.pluginSettings.hideInactive = root.editHideInactive @@ -92,6 +70,7 @@ ColumnLayout { pluginApi.pluginSettings.directory = root.editDirectory pluginApi.pluginSettings.filenamePattern = root.editFilenamePattern pluginApi.pluginSettings.frameRate = root.editFrameRate + pluginApi.pluginSettings.customFrameRate = root.editCustomFrameRate pluginApi.pluginSettings.audioCodec = root.editAudioCodec pluginApi.pluginSettings.videoCodec = root.editVideoCodec pluginApi.pluginSettings.quality = root.editQuality @@ -102,9 +81,9 @@ ColumnLayout { pluginApi.pluginSettings.videoSource = root.editVideoSource pluginApi.pluginSettings.resolution = root.editResolution - pluginApi.saveSettings() + pluginApi.saveSettings(); - Logger.i("ScreenRecorder", "Settings saved successfully") + Logger.i("ScreenRecorder", "Settings saved successfully"); } // Icon Color NComboBox { @@ -181,16 +160,25 @@ ColumnLayout { NComboBox { label: pluginApi.tr("settings.video.source") description: pluginApi.tr("settings.video.source-desc") - model: [ - { - "key": "portal", - "name": pluginApi.tr("settings.video.sources-portal") - }, - { - "key": "screen", - "name": pluginApi.tr("settings.video.sources-screen") + model: { + let options = [ + { + "key": "portal", + "name": pluginApi.tr("settings.video.sources-portal") + }, + { + "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 onSelected: key => root.editVideoSource = key defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.videoSource || "portal" @@ -201,22 +189,6 @@ ColumnLayout { label: pluginApi.tr("settings.video.frame-rate") description: pluginApi.tr("settings.video.frame-rate-desc") model: [ - { - "key": "5", - "name": "5 FPS" - }, - { - "key": "10", - "name": "10 FPS" - }, - { - "key": "15", - "name": "15 FPS" - }, - { - "key": "20", - "name": "20 FPS" - }, { "key": "30", "name": "30 FPS" @@ -225,25 +197,13 @@ ColumnLayout { "key": "60", "name": "60 FPS" }, - { - "key": "100", - "name": "100 FPS" - }, { "key": "120", "name": "120 FPS" }, { - "key": "144", - "name": "144 FPS" - }, - { - "key": "165", - "name": "165 FPS" - }, - { - "key": "240", - "name": "240 FPS" + "key": "custom", + "name": pluginApi.tr("settings.video.frame-rate-custom") } ] currentKey: root.editFrameRate @@ -251,6 +211,26 @@ ColumnLayout { 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 NComboBox { label: pluginApi.tr("settings.video.quality") @@ -284,25 +264,46 @@ ColumnLayout { description: pluginApi.tr("settings.video.codec-desc") model: { let options = [ - {"key": "h264", "name": "H264"}, - {"key": "hevc", "name": "HEVC"}, - {"key": "av1", "name": "AV1"}, - {"key": "vp8", "name": "VP8"}, - {"key": "vp9", "name": "VP9"} - ] - // Only add HDR options if source is 'screen' - if (root.editVideoSource === "screen") { - options.push({"key": "hevc_hdr", "name": "HEVC HDR"}) - options.push({"key": "av1_hdr", "name": "AV1 HDR"}) + { + "key": "h264", + "name": "H264" + }, + { + "key": "hevc", + "name": "HEVC" + }, + { + "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 onSelected: key => { - root.editVideoCodec = key + root.editVideoCodec = key; // If an HDR codec is selected, change the colorRange to full if (key.includes("_hdr")) { - root.editColorRange = "full" + root.editColorRange = "full"; } } defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.videoCodec || "h264" @@ -310,8 +311,8 @@ ColumnLayout { Connections { target: root function onEditVideoSourceChanged() { - if (root.editVideoSource !== "screen" && (root.editVideoCodec === "av1_hdr" || root.editVideoCodec === "hevc_hdr")) { - root.editVideoCodec = "h264" + if (root.editVideoSource !== "screen" && root.editVideoSource !== "focused-monitor" && (root.editVideoCodec === "av1_hdr" || root.editVideoCodec === "hevc_hdr")) { + root.editVideoCodec = "h264"; } } } @@ -435,7 +436,7 @@ ColumnLayout { initialPath: root.editDirectory || Quickshell.env("HOME") + "/Videos" onAccepted: paths => { if (paths.length > 0) { - root.editDirectory = paths[0] + root.editDirectory = paths[0]; } } } diff --git a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/de.json b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/de.json index ce6c65c..13cb4e3 100644 --- a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/de.json +++ b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/de.json @@ -13,7 +13,8 @@ "started": "Aufnahme gestartet.", "stop-recording": "Bildschirmaufnahme (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", "settings": { @@ -52,7 +53,10 @@ "color-range-full": "Vollständig", "color-range-limited": "Begrenzt", "frame-rate": "Bildrate", + "frame-rate-custom": "Benutzerdefiniert", "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-desc": "Höhere Qualität führt zu größeren Dateien", "quality-high": "Hoch", @@ -66,7 +70,8 @@ "source-desc": "Portal wird empfohlen, bei Artefakten versuchen Sie Bildschirm", "sources-portal": "Portal", "sources-screen": "Bildschirm", - "title": "Videoeinstellungen" + "title": "Videoeinstellungen", + "sources-focused-monitor": "Focused monitor (Hyprland)" } } } diff --git a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/en.json b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/en.json index 008f92f..2ec513c 100644 --- a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/en.json +++ b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/en.json @@ -13,7 +13,8 @@ "started": "Recording started.", "stop-recording": "Screen Recorder (stop 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", "settings": { @@ -52,7 +53,10 @@ "color-range-full": "Full", "color-range-limited": "Limited", "frame-rate": "Frame rate", + "frame-rate-custom": "Custom", "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-desc": "Higher quality results in larger file sizes", "quality-high": "High", @@ -66,6 +70,7 @@ "source-desc": "Portal is recommended, if you get artifacts try Screen", "sources-portal": "Portal", "sources-screen": "Screen", + "sources-focused-monitor": "Focused monitor (Hyprland)", "title": "Video Settings" } } diff --git a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/es.json b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/es.json index 99510a6..b252480 100644 --- a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/es.json +++ b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/es.json @@ -12,7 +12,8 @@ "start-recording": "Grabador de pantalla (empezar a grabar)", "started": "Grabación iniciada.", "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", "settings": { @@ -49,7 +50,10 @@ "color-range-full": "Completo", "color-range-limited": "Limitado", "frame-rate": "Tasa de fotogramas", + "frame-rate-custom": "Personalizado", "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-desc": "Mayor calidad resulta en archivos más grandes", "quality-high": "Alto", @@ -63,7 +67,8 @@ "source-desc": "Se recomienda Portal, si obtiene artefactos intente Pantalla", "sources-portal": "Portal", "sources-screen": "Pantalla", - "title": "Configuración de Video" + "title": "Configuración de Video", + "sources-focused-monitor": "Focused monitor (Hyprland)" } } } diff --git a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/fr.json b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/fr.json index 9b268ac..e975a6e 100644 --- a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/fr.json +++ b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/fr.json @@ -12,7 +12,8 @@ "start-recording": "Enregistreur d'écran (démarrer l'enregistrement)", "started": "Enregistrement démarré.", "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", "settings": { @@ -49,7 +50,10 @@ "color-range-full": "Complet / Plein", "color-range-limited": "Limité(e)", "frame-rate": "Fréquence d'images", + "frame-rate-custom": "Personnalisé", "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-desc": "Une qualité supérieure résulte en des fichiers plus volumineux", "quality-high": "Haut/Haute", @@ -63,6 +67,7 @@ "source-desc": "Portal est recommandé, si vous obtenez des artefacts essayez Écran", "sources-portal": "Portail", "sources-screen": "Écran", + "sources-focused-monitor": "Écran sous le curseur (Hyprland)", "title": "Paramètres Vidéo" } } diff --git a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/hu.json b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/hu.json index 48b1459..90ed17b 100644 --- a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/hu.json +++ b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/hu.json @@ -12,7 +12,8 @@ "start-recording": "Képernyőrögzítő (felvétel indítása)", "started": "A felvétel elindult.", "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ő", "settings": { @@ -49,7 +50,10 @@ "color-range-full": "Teljes", "color-range-limited": "Korlátozott", "frame-rate": "Képkockasebesség", + "frame-rate-custom": "Egyéni", "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-desc": "A jobb minőség nagyobb fájlméretet eredményez", "quality-high": "Magas", @@ -63,7 +67,8 @@ "source-desc": "A Portal ajánlott, ha hibákat tapasztalsz, próbáld a Screen-t", "sources-portal": "Portál", "sources-screen": "Képernyő", - "title": "Videóbeállítások" + "title": "Videóbeállítások", + "sources-focused-monitor": "Focused monitor (Hyprland)" } } } diff --git a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/it.json b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/it.json index b5501ad..341d095 100644 --- a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/it.json +++ b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/it.json @@ -12,7 +12,8 @@ "start-recording": "P錄影 (開始錄影)", "started": "Aufnahme gestartet.", "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", "settings": { @@ -49,7 +50,10 @@ "color-range-full": "Puno", "color-range-limited": "Limitato", "frame-rate": "Frequenza fotogrammi", + "frame-rate-custom": "Personalizzato", "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-desc": "Qualità superiore risulta in file più grandi", "quality-high": "Alta", @@ -63,7 +67,8 @@ "source-desc": "Portal è consigliato, se si ottengono artefatti prova Schermo", "sources-portal": "Portale", "sources-screen": "Skjerm", - "title": "Impostazioni Video" + "title": "Impostazioni Video", + "sources-focused-monitor": "Focused monitor (Hyprland)" } } } diff --git a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/ja.json b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/ja.json index 6153e59..264e85a 100644 --- a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/ja.json +++ b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/ja.json @@ -13,7 +13,8 @@ "started": "録画を開始しました。", "stop-recording": "画面録画(停止)", "stopping": "録画を停止しています…", - "open-file": "ファイルを開く" + "open-file": "ファイルを開く", + "monitor-not-found": "Could not detect the monitor under cursor." }, "name": "画面レコーダー", "settings": { @@ -52,7 +53,10 @@ "color-range-full": "フル", "color-range-limited": "限定", "frame-rate": "フレームレート", + "frame-rate-custom": "カスタム", "frame-rate-desc": "画面録画の目標フレームレート", + "custom-frame-rate": "カスタムフレームレート", + "custom-frame-rate-desc": "カスタムフレームレート値を入力してください(FPS)", "quality": "ビデオ品質", "quality-desc": "品質が高いほど、ファイルサイズが大きくなります", "quality-high": "高", @@ -66,7 +70,8 @@ "source-desc": "ポータルが推奨されます。アーティファクトが発生する場合は「スクリーン」を試してください", "sources-portal": "ポータル", "sources-screen": "スクリーン", - "title": "ビデオ設定" + "title": "ビデオ設定", + "sources-focused-monitor": "Focused monitor (Hyprland)" } } } diff --git a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/ku.json b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/ku.json index 8ce8f5a..78451e0 100644 --- a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/ku.json +++ b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/ku.json @@ -12,7 +12,8 @@ "start-recording": "Qeydkerê ekranê (dest bi qeydkirinê bike)", "started": "Qeydkirin dest pê kir.", "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ê", "settings": { @@ -49,7 +50,10 @@ "color-range-full": "Tije", "color-range-limited": "Sînorkirî", "frame-rate": "Rêjeya çarçoveyê", + "frame-rate-custom": "Kesane", "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-desc": "Encamên bi kalîte bilindtir dibin sedema mezinahiyên pelan ên mezintir", "quality-high": "Bilind", @@ -63,7 +67,8 @@ "source-desc": "Portal tê pêşniyarkirin, eger tu artefaktan bibînî Screen biceribîne", "sources-portal": "Portal", "sources-screen": "Dîmende", - "title": "Mîhengên Vîdeoyê" + "title": "Mîhengên Vîdeoyê", + "sources-focused-monitor": "Focused monitor (Hyprland)" } } } diff --git a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/nl.json b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/nl.json index e54c537..c0d9385 100644 --- a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/nl.json +++ b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/nl.json @@ -12,7 +12,8 @@ "start-recording": "Schermrecorder (opname starten)", "started": "Opname gestart.", "stop-recording": "Schermrecorder (opname stoppen)", - "stopping": "Opname stoppen…" + "stopping": "Opname stoppen…", + "monitor-not-found": "Could not detect the monitor under cursor." }, "name": "Schermrecorder", "settings": { @@ -49,7 +50,10 @@ "color-range-full": "Volledig", "color-range-limited": "Beperkt", "frame-rate": "Framesnelheid", + "frame-rate-custom": "Aangepast", "frame-rate-desc": "Doelframesnelheid voor schermopnames", + "custom-frame-rate": "Aangepaste framesnelheid", + "custom-frame-rate-desc": "Voer een aangepaste framesnelheid in (FPS)", "quality": "Videokwaliteit", "quality-desc": "Hogere kwaliteit resulteert in grotere bestanden", "quality-high": "Hoog", @@ -63,7 +67,8 @@ "source-desc": "Portal wordt aanbevolen, probeer Scherm als u artefacten krijgt", "sources-portal": "Portaal", "sources-screen": "Scherm", - "title": "Video-instellingen" + "title": "Video-instellingen", + "sources-focused-monitor": "Focused monitor (Hyprland)" } } } diff --git a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/pl.json b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/pl.json index 5790cb1..61f5604 100644 --- a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/pl.json +++ b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/pl.json @@ -12,7 +12,8 @@ "start-recording": "Rejestrator ekranu (rozpocznij nagrywanie)", "started": "Rozpoczęto 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", "settings": { @@ -49,7 +50,10 @@ "color-range-full": "Pełny", "color-range-limited": "Ograniczone", "frame-rate": "Liczba klatek na sekundę", + "frame-rate-custom": "Niestandardowa", "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-desc": "Wyższa jakość skutkuje większymi rozmiarami plików", "quality-high": "Wysoki", @@ -63,7 +67,8 @@ "source-desc": "Zalecany jest Portal, jeśli występują artefakty, spróbuj opcji Ekran", "sources-portal": "Portal", "sources-screen": "Ekran", - "title": "Ustawienia wideo" + "title": "Ustawienia wideo", + "sources-focused-monitor": "Focused monitor (Hyprland)" } } } diff --git a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/pt.json b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/pt.json index f4a73ca..20ecec9 100644 --- a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/pt.json +++ b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/pt.json @@ -12,7 +12,8 @@ "start-recording": "Gravador de tela (iniciar gravação)", "started": "Gravação iniciada.", "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", "settings": { @@ -49,7 +50,10 @@ "color-range-full": "Completo", "color-range-limited": "Limitado", "frame-rate": "Taxa de quadros", + "frame-rate-custom": "Personalizado", "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-desc": "Maior qualidade resulta em arquivos maiores", "quality-high": "Alto(a)", @@ -63,7 +67,8 @@ "source-desc": "Portal é recomendado, se obtiver artefatos tente Tela", "sources-portal": "Portal", "sources-screen": "Tela", - "title": "Configurações de Vídeo" + "title": "Configurações de Vídeo", + "sources-focused-monitor": "Focused monitor (Hyprland)" } } } diff --git a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/ru.json b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/ru.json index 1808ae1..51b8286 100644 --- a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/ru.json +++ b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/ru.json @@ -12,7 +12,8 @@ "start-recording": "Запись экрана (начать запись)", "started": "Запись началась.", "stop-recording": "Запись экрана (остановить запись)", - "stopping": "Остановка записи…" + "stopping": "Остановка записи…", + "monitor-not-found": "Could not detect the monitor under cursor." }, "name": "Запись Экрана", "settings": { @@ -49,7 +50,10 @@ "color-range-full": "Полный", "color-range-limited": "Ограниченный", "frame-rate": "Частота кадров", + "frame-rate-custom": "Пользовательская", "frame-rate-desc": "Целевая частота кадров для записи экрана", + "custom-frame-rate": "Пользовательская частота кадров", + "custom-frame-rate-desc": "Введите пользовательское значение частоты кадров (FPS)", "quality": "Качество видео", "quality-desc": "Более высокое качество приводит к большим размерам файлов", "quality-high": "Высокий", @@ -63,7 +67,8 @@ "source-desc": "Рекомендуется Portal, если появляются артефакты попробуйте Экран", "sources-portal": "Портал", "sources-screen": "Экран", - "title": "Настройки Видео" + "title": "Настройки Видео", + "sources-focused-monitor": "Focused monitor (Hyprland)" } } } diff --git a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/tr.json b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/tr.json index 4839623..5a3a869 100644 --- a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/tr.json +++ b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/tr.json @@ -12,7 +12,8 @@ "start-recording": "Ekran kaydedici (kayda başla)", "started": "Kayıt başladı.", "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", "settings": { @@ -49,7 +50,10 @@ "color-range-full": "Tam", "color-range-limited": "Sınırlı", "frame-rate": "Kare hızı", + "frame-rate-custom": "Özel", "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-desc": "Daha yüksek kalite daha büyük dosya boyutlarına yol açar", "quality-high": "Yüksek", @@ -63,7 +67,8 @@ "source-desc": "Portal önerilir, artefaktlar alırsanız Ekran'ı deneyin", "sources-portal": "Portal", "sources-screen": "Ekran", - "title": "Video Ayarları" + "title": "Video Ayarları", + "sources-focused-monitor": "Focused monitor (Hyprland)" } } } diff --git a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/uk-UA.json b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/uk-UA.json index 5e95f2f..0f57148 100644 --- a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/uk-UA.json +++ b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/uk-UA.json @@ -12,7 +12,8 @@ "start-recording": "Запис екрана (почати запис)", "started": "Запис розпочато.", "stop-recording": "Запис екрана (зупинити запис)", - "stopping": "Зупинка запису…" + "stopping": "Зупинка запису…", + "monitor-not-found": "Could not detect the monitor under cursor." }, "name": "Записувач Екрану", "settings": { @@ -49,7 +50,10 @@ "color-range-full": "Повний", "color-range-limited": "Обмежений", "frame-rate": "Частота кадрів", + "frame-rate-custom": "Користувацька", "frame-rate-desc": "Цільова частота кадрів для запису екрану", + "custom-frame-rate": "Користувацька частота кадрів", + "custom-frame-rate-desc": "Введіть користувацьке значення частоти кадрів (FPS)", "quality": "Якість відео", "quality-desc": "Вища якість призводить до більших розмірів файлів", "quality-high": "Високий", @@ -63,7 +67,8 @@ "source-desc": "Рекомендується Portal, якщо з'являються артефакти спробуйте Екран", "sources-portal": "Портал", "sources-screen": "Екран", - "title": "Налаштування Відео" + "title": "Налаштування Відео", + "sources-focused-monitor": "Focused monitor (Hyprland)" } } } diff --git a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/zh-CN.json b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/zh-CN.json index aaec702..843aa07 100644 --- a/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/zh-CN.json +++ b/home/aiden/.config/noctalia/plugins/screen-recorder/i18n/zh-CN.json @@ -13,7 +13,8 @@ "started": "已开始录制。", "stop-recording": "屏幕录像(停止录制)", "stopping": "停止录制…", - "open-file": "打开文件" + "open-file": "打开文件", + "monitor-not-found": "Could not detect the monitor under cursor." }, "name": "屏幕录制器", "settings": { @@ -52,7 +53,10 @@ "color-range-full": "全范围", "color-range-limited": "有限", "frame-rate": "帧率", + "frame-rate-custom": "自定义", "frame-rate-desc": "屏幕录制的目标帧率", + "custom-frame-rate": "自定义帧率", + "custom-frame-rate-desc": "输入自定义帧率值(FPS)", "quality": "视频质量", "quality-desc": "更高的质量会导致更大的文件大小", "quality-high": "高", @@ -66,7 +70,8 @@ "source-desc": "推荐使用桌面门户 (Portal),如果出现画面异常请尝试屏幕", "sources-portal": "桌面门户", "sources-screen": "屏幕", - "title": "视频设置" + "title": "视频设置", + "sources-focused-monitor": "Focused monitor (Hyprland)" } } } diff --git a/home/aiden/.config/noctalia/plugins/screen-recorder/manifest.json b/home/aiden/.config/noctalia/plugins/screen-recorder/manifest.json index 8240728..b77cf50 100644 --- a/home/aiden/.config/noctalia/plugins/screen-recorder/manifest.json +++ b/home/aiden/.config/noctalia/plugins/screen-recorder/manifest.json @@ -1,7 +1,7 @@ { "id": "screen-recorder", "name": "Screen Recorder", - "version": "1.1.7", + "version": "1.2.0", "minNoctaliaVersion": "3.6.0", "author": "Noctalia Team", "official": true, diff --git a/home/aiden/.config/noctalia/settings.json b/home/aiden/.config/noctalia/settings.json index 992e43b..6fbda2e 100644 --- a/home/aiden/.config/noctalia/settings.json +++ b/home/aiden/.config/noctalia/settings.json @@ -27,12 +27,13 @@ "viewMode": "list" }, "audio": { - "cavaFrameRate": 30, "mprisBlacklist": [ ], "preferredPlayer": "", + "spectrumFrameRate": 30, "visualizerType": "linear", "volumeFeedback": false, + "volumeFeedbackSoundFile": "", "volumeOverdrive": true, "volumeStep": 5 }, @@ -42,37 +43,40 @@ "backgroundOpacity": 0.93, "barType": "simple", "capsuleColorKey": "none", - "capsuleOpacity": 0.36, + "capsuleOpacity": 0.51, + "contentPadding": 2, "density": "comfortable", "displayMode": "always_visible", + "enableExclusionZoneInset": true, "floating": false, + "fontScale": 1, "frameRadius": 12, "frameThickness": 8, "hideOnOverview": false, "marginHorizontal": 10, "marginVertical": 5, + "middleClickAction": "none", + "middleClickCommand": "", + "middleClickFollowMouse": false, "monitors": [ ], + "mouseWheelAction": "none", + "mouseWheelWrap": true, "outerCorners": true, "position": "top", + "reverseScroll": false, + "rightClickAction": "controlCenter", + "rightClickCommand": "", + "rightClickFollowMouse": true, "screenOverrides": [ ], "showCapsule": true, + "showOnWorkspaceSwitch": true, "showOutline": false, "useSeparateOpacity": false, + "widgetSpacing": 4, "widgets": { "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", "enableColorization": false, @@ -114,6 +118,7 @@ "enableScrollWheel": true, "focusedColor": "primary", "followFocusedScreen": false, + "fontWeight": "bold", "groupedBorderOpacity": 1, "hideUnoccupied": true, "iconScale": 0.8, @@ -122,14 +127,41 @@ "occupiedColor": "secondary", "pillSize": 0.6, "showApplications": false, + "showApplicationsHover": false, "showBadge": true, "showLabelsOnlyWhenOccupied": true, "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", - "customFont": "", - "formatHorizontal": "ddd, MMM dd", + "customFont": "Adwaita Sans", + "formatHorizontal": "HH:mm:ss t", "formatVertical": "HH mm - dd MM", "id": "Clock", "tooltipFormat": "HH:mm ddd, MMM dd", @@ -140,6 +172,7 @@ "diskPath": "/", "iconColor": "none", "id": "SystemMonitor", + "showCpuCores": false, "showCpuFreq": false, "showCpuTemp": true, "showCpuUsage": true, @@ -181,17 +214,6 @@ } ], "right": [ - { - "blacklist": [ - ], - "chevronColor": "none", - "colorizeIcons": false, - "drawerEnabled": true, - "hidePassive": false, - "id": "Tray", - "pinned": [ - ] - }, { "colorizeSystemIcon": "none", "enableColorization": false, @@ -226,13 +248,6 @@ "wheelUpUpdateText": false, "wheelUpdateText": false }, - { - "displayMode": "alwaysShow", - "iconColor": "none", - "id": "Volume", - "middleClickCommand": "pwvucontrol || pavucontrol", - "textColor": "none" - }, { "applyToAllMonitors": false, "displayMode": "onhover", @@ -247,6 +262,19 @@ }, "id": "plugin:privacy-indicator" }, + { + "displayMode": "alwaysShow", + "iconColor": "none", + "id": "VPN", + "textColor": "none" + }, + { + "displayMode": "alwaysShow", + "iconColor": "none", + "id": "Volume", + "middleClickCommand": "pwvucontrol || pavucontrol", + "textColor": "none" + }, { "deviceNativePath": "", "displayMode": "icon-always", @@ -257,18 +285,13 @@ "showPowerProfiles": true }, { - "displayMode": "alwaysShow", - "iconColor": "none", - "id": "VPN", - "textColor": "none" - }, - { - "hideWhenZero": true, - "hideWhenZeroUnread": false, - "iconColor": "none", - "id": "NotificationHistory", - "showUnreadBadge": true, - "unreadBadgeColor": "primary" + "clockColor": "none", + "customFont": "", + "formatHorizontal": "ddd, MMM dd", + "formatVertical": "HH mm - dd MM", + "id": "Clock", + "tooltipFormat": "HH:mm ddd, MMM dd", + "useCustomFont": false }, { "colorizeDistroLogo": false, @@ -283,6 +306,8 @@ } }, "brightness": { + "backlightDeviceMappings": [ + ], "brightnessStep": 5, "enableDdcSupport": false, "enforceMinimum": true @@ -363,6 +388,9 @@ }, { "id": "NightLight" + }, + { + "id": "Notifications" } ] } @@ -370,6 +398,7 @@ "desktopWidgets": { "enabled": true, "gridSnap": true, + "gridSnapScale": false, "monitorWidgets": [ { "name": "DP-3", @@ -523,32 +552,44 @@ } ] } - ] + ], + "overviewEnabled": true }, "dock": { "animationSpeed": 1, "backgroundOpacity": 1, "colorizeIcons": true, "deadOpacity": 0.6, - "displayMode": "always_visible", - "dockType": "static", - "enabled": true, + "displayMode": "exclusive", + "dockType": "floating", + "enabled": false, "floatingRatio": 1, + "groupApps": false, + "groupClickAction": "cycle", + "groupContextMenuMode": "extended", + "groupIndicatorStyle": "dots", "inactiveIndicators": true, + "indicatorColor": "primary", + "indicatorOpacity": 0.6, + "indicatorThickness": 3, + "launcherIconColor": "none", + "launcherPosition": "end", "monitors": [ ], "onlySameOutput": false, "pinnedApps": [ - "firefox", - "com.discordapp.Discord", + "Alacritty", "com.moonlight_stream.Moonlight", - "Element" + "com.discordapp.Discord", + "org.keepassxc.KeePassXC", + "firefox" ], "pinnedStatic": true, "position": "top", - "showFrameIndicator": true, + "showDockIndicator": false, + "showLauncherIcon": false, "sitOnFrame": false, - "size": 1.2 + "size": 0.72 }, "general": { "allowPanelsOnScreenWithoutBar": true, @@ -558,11 +599,13 @@ "autoStartAuth": false, "avatarImage": "/home/aiden/.face", "boxRadiusRatio": 1, - "clockFormat": "hh\\nmm", + "clockFormat": "hh:mm\\nt", "clockStyle": "custom", "compactLockScreen": false, "dimmerOpacity": 0, + "enableBlurBehind": true, "enableLockScreenCountdown": true, + "enableLockScreenMediaControls": true, "enableShadows": true, "forceBlackScreenCorners": false, "iRadiusRatio": 1, @@ -571,7 +614,8 @@ "Down" ], "keyEnter": [ - "Return" + "Return", + "Enter" ], "keyEscape": [ "Esc" @@ -597,6 +641,7 @@ "lockScreenMonitors": [ ], "lockScreenTint": 0, + "passwordChars": true, "radiusRatio": 1, "reverseScroll": false, "scaleRatio": 1, @@ -621,6 +666,20 @@ "startup": "", "wallpaperChange": "" }, + "idle": { + "customCommands": "[]", + "enabled": false, + "fadeDuration": 5, + "lockCommand": "", + "lockTimeout": 660, + "resumeLockCommand": "", + "resumeScreenOffCommand": "", + "resumeSuspendCommand": "", + "screenOffCommand": "", + "screenOffTimeout": 600, + "suspendCommand": "", + "suspendTimeout": 1800 + }, "location": { "analogClockInCalendar": false, "firstDayOfWeek": -1, @@ -637,11 +696,13 @@ }, "network": { "airplaneModeEnabled": false, + "bluetoothAutoConnect": true, "bluetoothDetailsViewMode": "grid", "bluetoothHideUnnamedDevices": false, "bluetoothRssiPollIntervalMs": 10000, "bluetoothRssiPollingEnabled": false, "disableDiscoverability": false, + "networkPanelView": "wifi", "wifiDetailsViewMode": "list", "wifiEnabled": true }, @@ -654,6 +715,10 @@ "manualSunset": "21:00", "nightTemp": "4140" }, + "noctaliaPerformance": { + "disableDesktopWidgets": true, + "disableWallpaper": true + }, "notifications": { "backgroundOpacity": 1, "clearDismissed": true, @@ -765,7 +830,7 @@ "showHeader": true, "showKeybinds": true }, - "settingsVersion": 53, + "settingsVersion": 57, "systemMonitor": { "batteryCriticalThreshold": 5, "batteryWarningThreshold": 20, @@ -815,19 +880,18 @@ "enableUserTheming": false }, "ui": { - "bluetoothDetailsViewMode": "grid", - "bluetoothHideUnnamedDevices": false, "boxBorderEnabled": false, "fontDefault": "Sans Serif", "fontDefaultScale": 1, "fontFixed": "monospace", "fontFixedScale": 1, - "networkPanelView": "wifi", - "panelBackgroundOpacity": 0.5, + "panelBackgroundOpacity": 0.73, "panelsAttachedToBar": true, + "scrollbarAlwaysVisible": true, "settingsPanelMode": "centered", + "settingsPanelSideBarCardStyle": false, "tooltipsEnabled": true, - "wifiDetailsViewMode": "grid" + "translucentWidgets": true }, "wallpaper": { "automationEnabled": true, diff --git a/home/aiden/update.sh b/home/aiden/update.sh index bc90cba..62a8d8f 100755 --- a/home/aiden/update.sh +++ b/home/aiden/update.sh @@ -1,5 +1,6 @@ -flatpak --user update -sudo xbps-install -Su -git -C ~/void-packages/ pull -~/void-packages/xbps-src update-local +flatpak --user update +git -C ~/void-packages/ pull +cat local-package-list.txt | xargs -n1 ~/void-packages/xbps-src update-check +~/void-packages/xbps-src update-local +sudo xbps-install -Su read -p "Press enter to continue"