В этом конкретном случае сохранение настроек предпочтений, управляющих тем, должно ли приложение запускаться при запуске или нет, совершенно бессмысленно. Само существование файла рабочего стола автозапуска отражает состояние этого предпочтения. Если этот файл существует, установите флажок. Если пользователь снимает флажок, вы удаляете файл. Если пользователь установит флажок, вы создадите файл. Вот и все. Дублирование настройки в хранилище предпочтений приведет только к ошибкам, поскольку теперь вам нужно синхронизировать настройку и наличие файла в файловой системе, а также обрабатывать все виды угловых случаев.
Кроме того, имейте в виду, что /etc/xdg/autostart
для общесистемных записей автозапуска. Если предполагается, что это настройка для каждого пользователя, вы должны создать файл .desktop в каталоге автозапуска пользователя. Чтобы определить его местоположение, пожалуйста, следуйте спецификации автозапуска приложения для настольного компьютера *1005*, которая требует, чтобы местоположение было $XDG_CONFIG_DIRS/autostart
, что обычно разрешается в каталог .config/autostart
в домашнем каталоге пользователя (однако, если XDG_CONFIG_DIRS
переменная окружения существует, вы должны разрешить ее, сначала прочитав это значение, затем добавив к нему /autostart
.)
Вот пример программы, которая распечатает то, что вы хотите:
#include <cstdlib>
#include <iostream>
#include <QtCore/QString>
#include <QtCore/QDir>
#ifndef Q_OS_UNIX
#error This method only makes sense on Unix, use OS-specific handling for other OSes.
#endif
QString getUserXdgConfigDir()
{
QString result(std::getenv("XDG_CONFIG_DIRS"));
if (result.isEmpty()) {
// XDG_CONFIG_DIRS is not defined, we'll use the default value
// as mandated by http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html
result = QDir::homePath() + QDir::separator() + ".config";
}
return result;
}
QString getUserAutostartDir()
{
return getUserXdgConfigDir() + QDir::separator() + "autostart";
}
int main(int argc, char *argv[])
{
std::cout << "User config dir is " << getUserXdgConfigDir().toStdString() << std::endl;
std::cout << "User autostart dir is " << getUserAutostartDir().toStdString() << std::endl;
return 0;
}