core: add CacheDir pragma

Closes #293
This commit is contained in:
outfoxxed 2025-10-12 00:14:36 -07:00
parent ea79eaceb0
commit 1e8cc2e78d
No known key found for this signature in database
GPG key ID: 4C88A185FB89301E
5 changed files with 36 additions and 8 deletions

View file

@ -2,6 +2,7 @@
- Added support for creating wayland idle inhibitors. - Added support for creating wayland idle inhibitors.
- Added support for wayland idle timeouts. - Added support for wayland idle timeouts.
- Added the ability to override Quickshell.cacheDir with a custom path.
## Bug Fixes ## Bug Fixes

View file

@ -27,12 +27,19 @@ QsPaths* QsPaths::instance() {
return 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(); auto* instance = QsPaths::instance();
instance->shellId = std::move(shellId); instance->shellId = std::move(shellId);
instance->pathId = std::move(pathId); instance->pathId = std::move(pathId);
instance->shellDataOverride = std::move(dataOverride); instance->shellDataOverride = std::move(dataOverride);
instance->shellStateOverride = std::move(stateOverride); instance->shellStateOverride = std::move(stateOverride);
instance->shellCacheOverride = std::move(cacheOverride);
} }
QDir QsPaths::crashDir(const QString& id) { QDir QsPaths::crashDir(const QString& id) {
@ -316,9 +323,16 @@ QDir QsPaths::shellStateDir() {
QDir QsPaths::shellCacheDir() { QDir QsPaths::shellCacheDir() {
if (this->shellCacheState == DirState::Unknown) { if (this->shellCacheState == DirState::Unknown) {
auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)); QDir dir;
dir = QDir(dir.filePath("by-shell")); if (this->shellCacheOverride.isEmpty()) {
dir = QDir(dir.filePath(this->shellId)); 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; this->mShellCacheDir = dir;
qCDebug(logPaths) << "Initialized cache path:" << dir.path(); qCDebug(logPaths) << "Initialized cache path:" << dir.path();

View file

@ -17,7 +17,13 @@ QDataStream& operator>>(QDataStream& stream, InstanceLockInfo& info);
class QsPaths { class QsPaths {
public: public:
static QsPaths* instance(); 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 QDir crashDir(const QString& id);
static QString basePath(const QString& id); static QString basePath(const QString& id);
static QString ipcPath(const QString& id); static QString ipcPath(const QString& id);
@ -65,4 +71,5 @@ private:
QString shellDataOverride; QString shellDataOverride;
QString shellStateOverride; QString shellStateOverride;
QString shellCacheOverride;
}; };

View file

@ -127,18 +127,21 @@ class QuickshellGlobal: public QObject {
/// Usually `~/.local/share/quickshell/by-shell/<shell-id>` /// Usually `~/.local/share/quickshell/by-shell/<shell-id>`
/// ///
/// Can be overridden using `//@ pragma DataDir $BASE/path` in the root qml file, where `$BASE` /// 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); Q_PROPERTY(QString dataDir READ dataDir CONSTANT);
/// The per-shell state directory. /// The per-shell state directory.
/// ///
/// Usually `~/.local/state/quickshell/by-shell/<shell-id>` /// Usually `~/.local/state/quickshell/by-shell/<shell-id>`
/// ///
/// Can be overridden using `//@ pragma StateDir $BASE/path` in the root qml file, where `$BASE` /// 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); Q_PROPERTY(QString stateDir READ stateDir CONSTANT);
/// The per-shell cache directory. /// The per-shell cache directory.
/// ///
/// Usually `~/.cache/quickshell/by-shell/<shell-id>` /// Usually `~/.cache/quickshell/by-shell/<shell-id>`
///
/// 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); Q_PROPERTY(QString cacheDir READ cacheDir CONSTANT);
// clang-format on // clang-format on
QML_SINGLETON; QML_SINGLETON;

View file

@ -78,6 +78,7 @@ int launch(const LaunchArgs& args, char** argv, QCoreApplication* coreApplicatio
QHash<QString, QString> envOverrides; QHash<QString, QString> envOverrides;
QString dataDir; QString dataDir;
QString stateDir; QString stateDir;
QString cacheDir;
} pragmas; } pragmas;
auto stream = QTextStream(&file); auto stream = QTextStream(&file);
@ -109,6 +110,8 @@ int launch(const LaunchArgs& args, char** argv, QCoreApplication* coreApplicatio
pragmas.dataDir = pragma.sliced(8).trimmed(); pragmas.dataDir = pragma.sliced(8).trimmed();
} else if (pragma.startsWith("StateDir ")) { } else if (pragma.startsWith("StateDir ")) {
pragmas.stateDir = pragma.sliced(9).trimmed(); pragmas.stateDir = pragma.sliced(9).trimmed();
} else if (pragma.startsWith("CacheDir ")) {
pragmas.cacheDir = pragma.sliced(9).trimmed();
} else { } else {
qCritical() << "Unrecognized pragma" << pragma; qCritical() << "Unrecognized pragma" << pragma;
return -1; return -1;
@ -150,7 +153,7 @@ int launch(const LaunchArgs& args, char** argv, QCoreApplication* coreApplicatio
} }
#endif #endif
QsPaths::init(shellId, pathId, pragmas.dataDir, pragmas.stateDir); QsPaths::init(shellId, pathId, pragmas.dataDir, pragmas.stateDir, pragmas.cacheDir);
QsPaths::instance()->linkRunDir(); QsPaths::instance()->linkRunDir();
QsPaths::instance()->linkPathDir(); QsPaths::instance()->linkPathDir();
LogManager::initFs(); LogManager::initFs();