From 1e8cc2e78da0cdfa98aafb02d9c1b22e71e07dff Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Sun, 12 Oct 2025 00:14:36 -0700 Subject: [PATCH] core: add CacheDir pragma Closes #293 --- changelog/next.md | 1 + src/core/paths.cpp | 22 ++++++++++++++++++---- src/core/paths.hpp | 9 ++++++++- src/core/qmlglobal.hpp | 7 +++++-- src/launch/launch.cpp | 5 ++++- 5 files changed, 36 insertions(+), 8 deletions(-) diff --git a/changelog/next.md b/changelog/next.md index 13123b8..7b7ee40 100644 --- a/changelog/next.md +++ b/changelog/next.md @@ -2,6 +2,7 @@ - Added support for creating wayland idle inhibitors. - Added support for wayland idle timeouts. +- Added the ability to override Quickshell.cacheDir with a custom path. ## Bug Fixes diff --git a/src/core/paths.cpp b/src/core/paths.cpp index e17c3bc..1424d2b 100644 --- a/src/core/paths.cpp +++ b/src/core/paths.cpp @@ -27,12 +27,19 @@ QsPaths* QsPaths::instance() { return instance; } -void QsPaths::init(QString shellId, QString pathId, QString dataOverride, QString stateOverride) { +void QsPaths::init( + QString shellId, + QString pathId, + QString dataOverride, + QString stateOverride, + QString cacheOverride +) { auto* instance = QsPaths::instance(); instance->shellId = std::move(shellId); instance->pathId = std::move(pathId); instance->shellDataOverride = std::move(dataOverride); instance->shellStateOverride = std::move(stateOverride); + instance->shellCacheOverride = std::move(cacheOverride); } QDir QsPaths::crashDir(const QString& id) { @@ -316,9 +323,16 @@ QDir QsPaths::shellStateDir() { QDir QsPaths::shellCacheDir() { if (this->shellCacheState == DirState::Unknown) { - auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)); - dir = QDir(dir.filePath("by-shell")); - dir = QDir(dir.filePath(this->shellId)); + QDir dir; + if (this->shellCacheOverride.isEmpty()) { + dir = QDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)); + dir = QDir(dir.filePath("by-shell")); + dir = QDir(dir.filePath(this->shellId)); + } else { + auto basedir = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation); + dir = QDir(this->shellCacheOverride.replace("$BASE", basedir)); + } + this->mShellCacheDir = dir; qCDebug(logPaths) << "Initialized cache path:" << dir.path(); diff --git a/src/core/paths.hpp b/src/core/paths.hpp index 178bcda..1c10758 100644 --- a/src/core/paths.hpp +++ b/src/core/paths.hpp @@ -17,7 +17,13 @@ QDataStream& operator>>(QDataStream& stream, InstanceLockInfo& info); class QsPaths { public: static QsPaths* instance(); - static void init(QString shellId, QString pathId, QString dataOverride, QString stateOverride); + static void init( + QString shellId, + QString pathId, + QString dataOverride, + QString stateOverride, + QString cacheOverride + ); static QDir crashDir(const QString& id); static QString basePath(const QString& id); static QString ipcPath(const QString& id); @@ -65,4 +71,5 @@ private: QString shellDataOverride; QString shellStateOverride; + QString shellCacheOverride; }; diff --git a/src/core/qmlglobal.hpp b/src/core/qmlglobal.hpp index 9d88591..1fc363b 100644 --- a/src/core/qmlglobal.hpp +++ b/src/core/qmlglobal.hpp @@ -127,18 +127,21 @@ class QuickshellGlobal: public QObject { /// Usually `~/.local/share/quickshell/by-shell/` /// /// Can be overridden using `//@ pragma DataDir $BASE/path` in the root qml file, where `$BASE` - /// corrosponds to `$XDG_DATA_HOME` (usually `~/.local/share`). + /// corresponds to `$XDG_DATA_HOME` (usually `~/.local/share`). Q_PROPERTY(QString dataDir READ dataDir CONSTANT); /// The per-shell state directory. /// /// Usually `~/.local/state/quickshell/by-shell/` /// /// Can be overridden using `//@ pragma StateDir $BASE/path` in the root qml file, where `$BASE` - /// corrosponds to `$XDG_STATE_HOME` (usually `~/.local/state`). + /// corresponds to `$XDG_STATE_HOME` (usually `~/.local/state`). Q_PROPERTY(QString stateDir READ stateDir CONSTANT); /// The per-shell cache directory. /// /// Usually `~/.cache/quickshell/by-shell/` + /// + /// Can be overridden using `//@ pragma CacheDir $BASE/path` in the root qml file, where `$BASE` + /// corresponds to `$XDG_CACHE_HOME` (usually `~/.cache`). Q_PROPERTY(QString cacheDir READ cacheDir CONSTANT); // clang-format on QML_SINGLETON; diff --git a/src/launch/launch.cpp b/src/launch/launch.cpp index fd6a0af..101820e 100644 --- a/src/launch/launch.cpp +++ b/src/launch/launch.cpp @@ -78,6 +78,7 @@ int launch(const LaunchArgs& args, char** argv, QCoreApplication* coreApplicatio QHash envOverrides; QString dataDir; QString stateDir; + QString cacheDir; } pragmas; auto stream = QTextStream(&file); @@ -109,6 +110,8 @@ int launch(const LaunchArgs& args, char** argv, QCoreApplication* coreApplicatio pragmas.dataDir = pragma.sliced(8).trimmed(); } else if (pragma.startsWith("StateDir ")) { pragmas.stateDir = pragma.sliced(9).trimmed(); + } else if (pragma.startsWith("CacheDir ")) { + pragmas.cacheDir = pragma.sliced(9).trimmed(); } else { qCritical() << "Unrecognized pragma" << pragma; return -1; @@ -150,7 +153,7 @@ int launch(const LaunchArgs& args, char** argv, QCoreApplication* coreApplicatio } #endif - QsPaths::init(shellId, pathId, pragmas.dataDir, pragmas.stateDir); + QsPaths::init(shellId, pathId, pragmas.dataDir, pragmas.stateDir, pragmas.cacheDir); QsPaths::instance()->linkRunDir(); QsPaths::instance()->linkPathDir(); LogManager::initFs();