From 0691dfb95f37b689be36ad4d7448b6e4140cb251 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Wed, 1 Oct 2025 13:08:01 +1000 Subject: [PATCH 1/4] notifs: clear actually close notifs --- services/Notifs.qml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/services/Notifs.qml b/services/Notifs.qml index 0012d4b2c..4a89c7f8c 100644 --- a/services/Notifs.qml +++ b/services/Notifs.qml @@ -108,8 +108,8 @@ Singleton { name: "clearNotifs" description: "Clear all notifications" onPressed: { - for (const notif of root.list) - notif.popup = false; + for (const notif of root.list.slice()) + notif.close(); } } @@ -117,8 +117,8 @@ Singleton { target: "notifs" function clear(): void { - for (const notif of root.list) - notif.popup = false; + for (const notif of root.list.slice()) + notif.close(); } function isDndEnabled(): bool { From 11dc993f4b54631c88c655f1fe5f3caea0e96605 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Wed, 1 Oct 2025 22:35:52 +1000 Subject: [PATCH 2/4] plugin/cutils: warn on overwrite fail --- plugin/src/Caelestia/cutils.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugin/src/Caelestia/cutils.cpp b/plugin/src/Caelestia/cutils.cpp index 27074ee88..0e1778cc6 100644 --- a/plugin/src/Caelestia/cutils.cpp +++ b/plugin/src/Caelestia/cutils.cpp @@ -101,7 +101,10 @@ bool CUtils::copyFile(const QUrl& source, const QUrl& target, bool overwrite) co } if (overwrite) { - QFile::remove(target.toLocalFile()); + if (!QFile::remove(target.toLocalFile())) { + qWarning() << "CUtils::copyFile: overwrite was specified but failed to remove" << target.toLocalFile(); + return false; + } } return QFile::copy(source.toLocalFile(), target.toLocalFile()); From 1075a7e97d5d9b621e02b5b70cbe4af739a2da4d Mon Sep 17 00:00:00 2001 From: Soramane <61896496+soramanew@users.noreply.github.com> Date: Fri, 3 Oct 2025 16:26:14 +1000 Subject: [PATCH 3/4] launcher: fix exclusion with sidebar --- modules/launcher/WallpaperList.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/launcher/WallpaperList.qml b/modules/launcher/WallpaperList.qml index d5a747a69..4aba4365b 100644 --- a/modules/launcher/WallpaperList.qml +++ b/modules/launcher/WallpaperList.qml @@ -11,7 +11,7 @@ PathView { id: root required property StyledTextField search - required property PersistentProperties visibilities + required property var visibilities required property var panels required property var content @@ -27,7 +27,7 @@ PathView { let outerMargins = 0; if (panels.popouts.hasCurrent && panels.popouts.currentCenter + panels.popouts.nonAnimHeight / 2 > screen.height - content.implicitHeight - Config.border.thickness * 2) outerMargins = panels.popouts.nonAnimWidth; - if (visibilities.utilities && panels.utilities.implicitWidth > outerMargins) + if ((visibilities.utilities || visibilities.sidebar) && panels.utilities.implicitWidth > outerMargins) outerMargins = panels.utilities.implicitWidth; const maxWidth = screen.width - Config.border.rounding * 4 - (barMargins + outerMargins) * 2; From 8f813f10b1a8bb40801198feef556ba7dbfbe2c5 Mon Sep 17 00:00:00 2001 From: Robin Seger Date: Sat, 4 Oct 2025 02:21:18 +0200 Subject: [PATCH 4/4] feat: add GIF wallpaper persistence and color extraction --- services/Wallpapers.qml | 56 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/services/Wallpapers.qml b/services/Wallpapers.qml index cb96bc565..3f701a9c2 100644 --- a/services/Wallpapers.qml +++ b/services/Wallpapers.qml @@ -21,13 +21,26 @@ Searcher { function setWallpaper(path: string): void { actualCurrent = path; - Quickshell.execDetached(["caelestia", "wallpaper", "-f", path, ...smartArg]); + + const isGif = path.toLowerCase().endsWith(".gif"); + + if (isGif) { + // Bypass CLI and write directly to path.txt for GIFs + writeGifPathProc.command = ["sh", "-c", `echo '${path}' > '${currentNamePath}'`]; + writeGifPathProc.running = true; + + if (Colours.scheme === "dynamic") { + setGifColoursProc.command = ["caelestia", "wallpaper", "-p", path, ...smartArg]; + setGifColoursProc.running = true; + } + } else { + Quickshell.execDetached(["caelestia", "wallpaper", "-f", path, ...smartArg]); + } } function preview(path: string): void { previewPath = path; showPreview = true; - if (Colours.scheme === "dynamic") getPreviewColoursProc.running = true; } @@ -90,4 +103,43 @@ Searcher { } } } + + Process { + id: writeGifPathProc + // Command is set dynamically in setWallpaper() + // Writes GIF path directly to path.txt since CLI doesn't support GIFs + } + + Process { + id: setGifColoursProc + stdout: StdioCollector { + onStreamFinished: { + const scheme = JSON.parse(text); + + Colours.load(text, false); + + // Persist the scheme JSON directly to file + const schemePath = `${Paths.state}/scheme.json`; + saveGifSchemeProc.command = ["sh", "-c", `echo '${text}' > '${schemePath}'`]; + saveGifSchemeProc.schemeData = scheme; + saveGifSchemeProc.running = true; + } + } + } + + Process { + id: saveGifSchemeProc + property var schemeData: null + + // Saves the GIF color scheme to the persistent scheme.json file + onExited: { + if (schemeData) { + Quickshell.execDetached([ + "caelestia", "scheme", "set", + "-m", schemeData.mode, + "-v", schemeData.variant + ]); + } + } + } }