Skip to content

Commit eb6760f

Browse files
author
Andrés Rodríguez
committed
Implement XDG Base Directory Specification support
Closes MaartenBaert#407.
1 parent f76db91 commit eb6760f

File tree

4 files changed

+70
-14
lines changed

4 files changed

+70
-14
lines changed

src/GUI/MainWindow.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ MainWindow::~MainWindow() {
108108

109109
void MainWindow::LoadSettings() {
110110

111-
QSettings settings(GetApplicationUserDir() + "/settings.conf", QSettings::IniFormat);
111+
QSettings settings(GetApplicationConfigDir() + "/settings.conf", QSettings::IniFormat);
112112

113113
SetNVidiaDisableFlipping(StringToEnum(settings.value("global/nvidia_disable_flipping", QString()).toString(), NVIDIA_DISABLE_FLIPPING_ASK));
114114

@@ -120,7 +120,7 @@ void MainWindow::LoadSettings() {
120120

121121
void MainWindow::SaveSettings() {
122122

123-
QSettings settings(GetApplicationUserDir() + "/settings.conf", QSettings::IniFormat);
123+
QSettings settings(GetApplicationConfigDir() + "/settings.conf", QSettings::IniFormat);
124124
settings.clear();
125125

126126
settings.setValue("global/nvidia_disable_flipping", EnumToString(GetNVidiaDisableFlipping()));

src/GUI/ProfileBox.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ void ProfileBox::LoadProfiles() {
7777
// get all profiles
7878
std::vector<Profile> profiles;
7979
LoadProfilesFromDir(&profiles, GetApplicationSystemDir(m_type), false);
80-
LoadProfilesFromDir(&profiles, GetApplicationUserDir(m_type), true);
80+
LoadProfilesFromDir(&profiles, GetApplicationConfigDir(m_type), true);
8181

8282
// sort and remove duplicates
8383
std::sort(profiles.begin(), profiles.end());
@@ -124,7 +124,7 @@ void ProfileBox::OnProfileChange() {
124124
QString name = GetProfileName();
125125
if(name.isEmpty())
126126
return;
127-
QString filename = GetApplicationUserDir(m_type) + "/" + name + ".conf";
127+
QString filename = GetApplicationConfigDir(m_type) + "/" + name + ".conf";
128128
if(QFileInfo(filename).exists()) {
129129
QSettings settings(filename, QSettings::IniFormat);
130130
m_load_callback(&settings, m_userdata);
@@ -143,7 +143,7 @@ void ProfileBox::OnProfileSave() {
143143
QString name = GetProfileName();
144144
if(name.isEmpty())
145145
return;
146-
QString filename = GetApplicationUserDir(m_type) + "/" + name + ".conf";
146+
QString filename = GetApplicationConfigDir(m_type) + "/" + name + ".conf";
147147
if(MessageBox(QMessageBox::Warning, this, MainWindow::WINDOW_CAPTION, tr("Are you sure that you want to overwrite this profile?"), BUTTON_YES | BUTTON_NO, BUTTON_YES) == BUTTON_YES) {
148148
{
149149
QSettings settings(filename, QSettings::IniFormat);
@@ -160,7 +160,7 @@ void ProfileBox::OnProfileNew() {
160160
if(name.isEmpty())
161161
return;
162162
name = name.toUtf8().toPercentEncoding();
163-
QString filename = GetApplicationUserDir(m_type) + "/" + name + ".conf";
163+
QString filename = GetApplicationConfigDir(m_type) + "/" + name + ".conf";
164164
if(!QFileInfo(filename).exists() || MessageBox(QMessageBox::Warning, this, MainWindow::WINDOW_CAPTION,
165165
tr("A profile with the same name already exists. Are you sure that you want to replace it?"), BUTTON_YES | BUTTON_NO, BUTTON_YES) == BUTTON_YES) {
166166
{
@@ -177,7 +177,7 @@ void ProfileBox::OnProfileDelete() {
177177
QString name = GetProfileName();
178178
if(name.isEmpty())
179179
return;
180-
QString filename = GetApplicationUserDir(m_type) + "/" + name + ".conf";
180+
QString filename = GetApplicationConfigDir(m_type) + "/" + name + ".conf";
181181
if(MessageBox(QMessageBox::Warning, this, MainWindow::WINDOW_CAPTION, tr("Are you sure that you want to delete this profile?"), BUTTON_YES | BUTTON_NO, BUTTON_YES) == BUTTON_YES) {
182182
QFile(filename).remove();
183183
LoadProfiles();

src/Main.cpp

Lines changed: 60 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ void PrintOptionHelp() {
4040
"\n"
4141
"Options:\n"
4242
" --help Show this help message.\n"
43-
" --logfile Write log to ~/.ssr/log-DATE_TIME.txt instead of stdout.\n"
43+
" --logfile Write log to $XDG_DATA_HOME/ssr/log-DATE_TIME.txt instead of stdout.\n"
4444
" --statsfile[=FILE] Write recording statistics to FILE. If FILE is omitted,\n"
4545
" /dev/shm/simplescreenrecorder-stats-PID is used. It will\n"
4646
" be updated continuously and deleted when the recording\n"
@@ -164,12 +164,52 @@ int main(int argc, char* argv[]) {
164164
}
165165
}
166166

167+
// migrate data from ~/.ssr to follow XDG directory spec
168+
{
169+
QString oldDir(QDir::homePath() + "/.ssr");
170+
if (QDir(oldDir).exists()) {
171+
QDir r;
172+
// migrate config files
173+
int num_conf_files = 3;
174+
const char* conf_files[num_conf_files] {
175+
"input-profiles", "output-profiles", "settings.conf"
176+
};
177+
for (int i = 0; i < num_conf_files; i++) {
178+
QString oldFile(oldDir + "/" + conf_files[i]);
179+
QString newFile(GetApplicationConfigDir() + "/" + conf_files[i]);
180+
if (QFile(newFile).exists()) {
181+
continue;
182+
}
183+
if (!r.rename(oldFile, newFile)) {
184+
Logger::LogError("[main] " + Logger::tr("Error: Couldn't migrate config files from ~/.ssr to new XDG-compliant location!"));
185+
throw 0;
186+
}
187+
}
188+
// migrate the rest of the files to data directory
189+
QDir qOldDir(oldDir);
190+
for (QFileInfo fi : qOldDir.entryInfoList()) {
191+
QString newFile(GetApplicationDataDir() + "/" + fi.fileName());
192+
if (QFile(newFile).exists()) {
193+
continue;
194+
}
195+
if (!r.rename(fi.filePath(), newFile)) {
196+
Logger::LogError("[main] " + Logger::tr("Error: Couldn't migrate data files from ~/.ssr to new XDG-compliant location!"));
197+
throw 0;
198+
}
199+
}
200+
if (system(qPrintable("rm -rf ~/.ssr")) != 0) { // TODO: If SSR ever switches to Qt5, this must be replaced by QDir::removeRecursively()
201+
Logger::LogError("[main] " + Logger::tr("Error: Couldn't delete ~/.ssr directory after data migration attempt!"));
202+
throw 0;
203+
}
204+
}
205+
}
206+
167207
// redirect stdout and stderr to a log file
168208
if(g_option_logfile) {
169209

170210
// delete logs from versions < 0.2.3 (should be removed at some point in the future)
171211
{
172-
QDir dir(GetApplicationUserDir());
212+
QDir dir(GetApplicationDataDir());
173213
dir.setFilter(QDir::Files | QDir::NoDotAndDotDot);
174214
dir.setNameFilters(QStringList("log-*.txt"));
175215
for(QFileInfo fileinfo : dir.entryInfoList()) {
@@ -179,7 +219,7 @@ int main(int argc, char* argv[]) {
179219

180220
// delete old logs
181221
QDateTime now = QDateTime::currentDateTime();
182-
QDir dir(GetApplicationUserDir("logs"));
222+
QDir dir(GetApplicationDataDir("logs"));
183223
dir.setFilter(QDir::Files | QDir::NoDotAndDotDot);
184224
dir.setNameFilters(QStringList("log-*.txt"));
185225
for(QFileInfo fileinfo : dir.entryInfoList()) {
@@ -237,12 +277,26 @@ QString GetApplicationSystemDir(const QString& subdir) {
237277
return dir;
238278
}
239279

240-
QString GetApplicationUserDir(const QString& subdir) {
241-
QString dir = QDir::homePath() + "/.ssr";
280+
QString GetApplicationDataDir(const QString& subdir) {
281+
return GetAppXDGDir(subdir, "XDG_DATA_HOME", "/.local/share");
282+
}
283+
284+
QString GetApplicationConfigDir(const QString& subdir) {
285+
return GetAppXDGDir(subdir, "XDG_CONFIG_HOME", "/.config");
286+
}
287+
288+
QString GetAppXDGDir(const QString& subdir, const char* xdg_env_name, const char* default_xdg_home_subdir) {
289+
QString dir;
290+
QByteArray env = qgetenv(xdg_env_name);
291+
if (env.count() == 0 || !QDir(QString(env)).exists()) {
292+
dir = QDir::homePath() + default_xdg_home_subdir + "/ssr";
293+
} else {
294+
dir = QString(env) + "/ssr";
295+
}
242296
if(!subdir.isEmpty())
243297
dir += "/" + subdir;
244298
if(!QDir::root().mkpath(dir)) {
245-
Logger::LogError("[GetApplicationUserDir] " + Logger::tr("Error: Can't create .ssr directory!"));
299+
Logger::LogError("[GetAppXDGDir] " + Logger::tr("Error: Can't create '%1' directory!").arg(dir));
246300
throw 0;
247301
}
248302
return dir;

src/Main.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ extern bool g_option_systray;
2727
extern bool g_option_start_hidden;
2828

2929
QString GetApplicationSystemDir(const QString& subdir = QString());
30-
QString GetApplicationUserDir(const QString& subdir = QString());
30+
QString GetApplicationDataDir(const QString& subdir = QString());
31+
QString GetApplicationConfigDir(const QString& subdir = QString());
32+
QString GetAppXDGDir(const QString& subdir, const char* xdg_env_name, const char* default_xdg_home_subdir);
3133
QString GetVersionInfo();
3234

3335
bool NVidiaDetectFlipping();

0 commit comments

Comments
 (0)