forked from quickshell/quickshell
		
	core: add DataDir and StateDir pragmas
This commit is contained in:
		
							parent
							
								
									a05c0de53b
								
							
						
					
					
						commit
						325a51c82d
					
				
					 4 changed files with 47 additions and 11 deletions
				
			
		| 
						 | 
					@ -25,10 +25,12 @@ QsPaths* QsPaths::instance() {
 | 
				
			||||||
	return instance;
 | 
						return instance;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void QsPaths::init(QString shellId, QString pathId) {
 | 
					void QsPaths::init(QString shellId, QString pathId, QString dataOverride, QString stateOverride) {
 | 
				
			||||||
	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->shellStateOverride = std::move(stateOverride);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QDir QsPaths::crashDir(const QString& id) {
 | 
					QDir QsPaths::crashDir(const QString& id) {
 | 
				
			||||||
| 
						 | 
					@ -211,9 +213,16 @@ void QsPaths::linkPathDir() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QDir QsPaths::shellDataDir() {
 | 
					QDir QsPaths::shellDataDir() {
 | 
				
			||||||
	if (this->shellDataState == DirState::Unknown) {
 | 
						if (this->shellDataState == DirState::Unknown) {
 | 
				
			||||||
		auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation));
 | 
							QDir dir;
 | 
				
			||||||
 | 
							if (this->shellDataOverride.isEmpty()) {
 | 
				
			||||||
 | 
								dir = QDir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation));
 | 
				
			||||||
			dir = QDir(dir.filePath("by-shell"));
 | 
								dir = QDir(dir.filePath("by-shell"));
 | 
				
			||||||
			dir = QDir(dir.filePath(this->shellId));
 | 
								dir = QDir(dir.filePath(this->shellId));
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								auto basedir = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
 | 
				
			||||||
 | 
								dir = QDir(this->shellDataOverride.replace("$BASE", basedir));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		this->mShellDataDir = dir;
 | 
							this->mShellDataDir = dir;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		qCDebug(logPaths) << "Initialized data path:" << dir.path();
 | 
							qCDebug(logPaths) << "Initialized data path:" << dir.path();
 | 
				
			||||||
| 
						 | 
					@ -241,12 +250,24 @@ QDir QsPaths::shellStateDir() {
 | 
				
			||||||
			auto home = QDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
 | 
								auto home = QDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
 | 
				
			||||||
			dir = QDir(home.filePath(".local/state"));
 | 
								dir = QDir(home.filePath(".local/state"));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
		auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::StateLocation));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (this->shellStateOverride.isEmpty()) {
 | 
				
			||||||
 | 
								dir = QDir(dir.filePath("quickshell/by-shell"));
 | 
				
			||||||
 | 
								dir = QDir(dir.filePath(this->shellId));
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								dir = QDir(this->shellStateOverride.replace("$BASE", dir.path()));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
							QDir dir;
 | 
				
			||||||
 | 
							if (this->shellStateOverride.isEmpty()) {
 | 
				
			||||||
 | 
								dir = QDir(QStandardPaths::writableLocation(QStandardPaths::StateLocation));
 | 
				
			||||||
			dir = QDir(dir.filePath("by-shell"));
 | 
								dir = QDir(dir.filePath("by-shell"));
 | 
				
			||||||
			dir = QDir(dir.filePath(this->shellId));
 | 
								dir = QDir(dir.filePath(this->shellId));
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								auto basedir = QStandardPaths::writableLocation(QStandardPaths::GenericStateLocation);
 | 
				
			||||||
 | 
								dir = QDir(this->shellStateOverride.replace("$BASE", basedir));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
		this->mShellStateDir = dir;
 | 
							this->mShellStateDir = dir;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		qCDebug(logPaths) << "Initialized state path:" << dir.path();
 | 
							qCDebug(logPaths) << "Initialized state path:" << dir.path();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@ 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);
 | 
						static void init(QString shellId, QString pathId, QString dataOverride, QString stateOverride);
 | 
				
			||||||
	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);
 | 
				
			||||||
| 
						 | 
					@ -57,4 +57,7 @@ private:
 | 
				
			||||||
	DirState shellDataState = DirState::Unknown;
 | 
						DirState shellDataState = DirState::Unknown;
 | 
				
			||||||
	DirState shellStateState = DirState::Unknown;
 | 
						DirState shellStateState = DirState::Unknown;
 | 
				
			||||||
	DirState shellCacheState = DirState::Unknown;
 | 
						DirState shellCacheState = DirState::Unknown;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						QString shellDataOverride;
 | 
				
			||||||
 | 
						QString shellStateOverride;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -111,10 +111,16 @@ class QuickshellGlobal: public QObject {
 | 
				
			||||||
	/// The per-shell data directory.
 | 
						/// The per-shell data directory.
 | 
				
			||||||
	///
 | 
						///
 | 
				
			||||||
	/// 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`
 | 
				
			||||||
 | 
						/// corrosponds 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`
 | 
				
			||||||
 | 
						/// corrosponds 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.
 | 
				
			||||||
	///
 | 
						///
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -74,6 +74,8 @@ int launch(const LaunchArgs& args, char** argv, QCoreApplication* coreApplicatio
 | 
				
			||||||
		bool desktopSettingsAware = true;
 | 
							bool desktopSettingsAware = true;
 | 
				
			||||||
		QString iconTheme = qEnvironmentVariable("QS_ICON_THEME");
 | 
							QString iconTheme = qEnvironmentVariable("QS_ICON_THEME");
 | 
				
			||||||
		QHash<QString, QString> envOverrides;
 | 
							QHash<QString, QString> envOverrides;
 | 
				
			||||||
 | 
							QString dataDir;
 | 
				
			||||||
 | 
							QString stateDir;
 | 
				
			||||||
	} pragmas;
 | 
						} pragmas;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	auto stream = QTextStream(&file);
 | 
						auto stream = QTextStream(&file);
 | 
				
			||||||
| 
						 | 
					@ -100,6 +102,10 @@ int launch(const LaunchArgs& args, char** argv, QCoreApplication* coreApplicatio
 | 
				
			||||||
				pragmas.envOverrides.insert(var, val);
 | 
									pragmas.envOverrides.insert(var, val);
 | 
				
			||||||
			} else if (pragma.startsWith("ShellId ")) {
 | 
								} else if (pragma.startsWith("ShellId ")) {
 | 
				
			||||||
				shellId = pragma.sliced(8).trimmed();
 | 
									shellId = pragma.sliced(8).trimmed();
 | 
				
			||||||
 | 
								} else if (pragma.startsWith("DataDir ")) {
 | 
				
			||||||
 | 
									pragmas.dataDir = pragma.sliced(8).trimmed();
 | 
				
			||||||
 | 
								} else if (pragma.startsWith("StateDir ")) {
 | 
				
			||||||
 | 
									pragmas.stateDir = pragma.sliced(9).trimmed();
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				qCritical() << "Unrecognized pragma" << pragma;
 | 
									qCritical() << "Unrecognized pragma" << pragma;
 | 
				
			||||||
				return -1;
 | 
									return -1;
 | 
				
			||||||
| 
						 | 
					@ -140,7 +146,7 @@ int launch(const LaunchArgs& args, char** argv, QCoreApplication* coreApplicatio
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	QsPaths::init(shellId, pathId);
 | 
						QsPaths::init(shellId, pathId, pragmas.dataDir, pragmas.stateDir);
 | 
				
			||||||
	QsPaths::instance()->linkRunDir();
 | 
						QsPaths::instance()->linkRunDir();
 | 
				
			||||||
	QsPaths::instance()->linkPathDir();
 | 
						QsPaths::instance()->linkPathDir();
 | 
				
			||||||
	LogManager::initFs();
 | 
						LogManager::initFs();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue