1
0
mirror of https://gitlab.com/kelteseth/ScreenPlay.git synced 2024-11-07 03:22:33 +01:00

Add autostart for MacOS

This commit is contained in:
Elias Steurer 2021-06-10 16:24:03 +02:00
parent 2416a7074c
commit 3efbda68ee
4 changed files with 125 additions and 62 deletions

View File

@ -129,5 +129,6 @@
<file>assets/icons/icon_sort-down-solid.svg</file>
<file>assets/icons/brand_reddit.svg</file>
<file>assets/icons/steam_default_avatar.png</file>
<file>assets/macos/app.screenplay.plist</file>
</qresource>
</RCC>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>app.screenplay</string>
<key>ProgramArguments</key>
<array>
<string>{{SCREENPLAY_PATH}}</string>
</array>
<key>ProcessType</key>
<string>Interactive</string>
<key>RunAtLoad</key>
<{{SCREENPLAY_AUTOSTART}}/>
<key>KeepAlive</key>
<false/>
</dict>
</plist>

View File

@ -39,6 +39,16 @@ Settings::Settings(const std::shared_ptr<GlobalVariables>& globalVariables,
: QObject(parent)
, m_globalVariables { globalVariables }
{
#ifdef Q_OS_WIN
setDesktopEnvironment(DesktopEnvironment::Windows);
#endif
#ifdef Q_OS_OSX
setDesktopEnvironment(DesktopEnvironment::OSX);
#endif
#ifdef Q_OS_LINUX
// We only support KDE for now
setDesktopEnvironment(DesktopEnvironment::KDE);
#endif
qRegisterMetaType<Settings::Language>("Settings::Language");
qRegisterMetaType<Settings::Theme>("Settings::Theme");
@ -47,7 +57,7 @@ Settings::Settings(const std::shared_ptr<GlobalVariables>& globalVariables,
qmlRegisterUncreatableType<Settings>("Settings", 1, 0, "Settings", "Error only for enums");
if (!m_qSettings.contains("Autostart")) {
#ifdef Q_OS_WIN
if (desktopEnvironment() == DesktopEnvironment::Windows) {
QSettings settings("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat);
if (!m_qSettings.value("Autostart").toBool()) {
if (!settings.contains("ScreenPlay")) {
@ -55,7 +65,7 @@ Settings::Settings(const std::shared_ptr<GlobalVariables>& globalVariables,
}
settings.setValue("ScreenPlay", QDir::toNativeSeparators(QCoreApplication::applicationFilePath()) + " -silent");
settings.sync();
#endif
}
m_qSettings.setValue("Autostart", true);
m_qSettings.sync();
} else {
@ -87,54 +97,10 @@ Settings::Settings(const std::shared_ptr<GlobalVariables>& globalVariables,
writeJsonFileFromResource("profiles");
}
//If empty use steam workshop location
if (QString(m_qSettings.value("ScreenPlayContentPath").toString()).isEmpty()) {
/*
* ! We must use this (ugly) method, because to stay FOSS we cannot call the steamAPI here !
*
* We start with the assumption that when we go up 2 folder.
* So that there must be at least a common folder:
* Windows example:
* From -> C:\Program Files (x86)\Steam\steamapps\common\ScreenPlay
* To -> C:\Program Files (x86)\Steam\steamapps\
* Dest.-> C:\Program Files (x86)\Steam\steamapps\workshop\content\672870
*
* When we reach the folder it _can_ contain a workshop folder when the user
* previously installed any workshop content. If the folder does not exsist we
* need to create it by hand. Normally Steam will create this folder but we need to
* set it here at this point so that the QFileSystemWatcher in InstalledListModel does
* not generate warnings.
*/
QDir dir;
QString path = QApplication::instance()->applicationDirPath() + "/../../workshop/content/672870";
if (!dir.mkpath(path)) {
qWarning() << "Could not create steam workshop path for path: " << path;
} else {
m_globalVariables->setLocalStoragePath(QUrl::fromUserInput(path));
m_qSettings.setValue("ScreenPlayContentPath", dir.cleanPath(path));
m_qSettings.sync();
}
} else {
m_globalVariables->setLocalStoragePath(QUrl::fromUserInput(m_qSettings.value("ScreenPlayContentPath").toString()));
}
initInstalledPath();
setupWidgetAndWindowPaths();
setGitBuildHash(COMPILE_INFO);
#ifdef Q_OS_WIN
setDesktopEnvironment(DesktopEnvironment::Windows);
#endif
#ifdef Q_OS_OSX
setDesktopEnvironment(DesktopEnvironment::OSX);
#endif
#ifdef Q_OS_LINUX
// We only support KDE for now
setDesktopEnvironment(DesktopEnvironment::KDE);
#endif
}
/*!
@ -204,6 +170,53 @@ void Settings::restoreDefault(const QString& appConfigLocation, const QString& s
writeJsonFileFromResource(settingsFileType);
}
void Settings::initInstalledPath()
{
//If empty use steam workshop location
qInfo() << m_qSettings.value("ScreenPlayContentPath").toString();
if (QString(m_qSettings.value("ScreenPlayContentPath").toString()).isEmpty()) {
/*
* ! We must use this (ugly) method, because to stay FOSS we cannot call the steamAPI here !
*
* We start with the assumption that when we go up 2 folder.
* So that there must be at least a common folder:
* Windows example:
* From -> C:\Program Files (x86)\Steam\steamapps\common\ScreenPlay
* To -> C:\Program Files (x86)\Steam\steamapps\
* Dest.-> C:\Program Files (x86)\Steam\steamapps\workshop\content\672870
*
* When we reach the folder it _can_ contain a workshop folder when the user
* previously installed any workshop content. If the folder does not exsist we
* need to create it by hand. Normally Steam will create this folder but we need to
* set it here at this point so that the QFileSystemWatcher in InstalledListModel does
* not generate warnings.
*/
QDir dir;
QString appBasePath = QApplication::instance()->applicationDirPath();
if (desktopEnvironment() == DesktopEnvironment::OSX) {
appBasePath += "/../../..";
}
QString path = appBasePath + "/../../workshop/content/672870";
qInfo() << path;
if (!dir.mkpath(path)) {
qWarning() << "Could not create steam workshop path for path: " << path;
}
if (QDir(path).exists()) {
m_globalVariables->setLocalStoragePath(QUrl::fromUserInput(path));
m_qSettings.setValue("ScreenPlayContentPath", dir.cleanPath(path));
m_qSettings.sync();
} else {
qWarning() << "The following path could not be resolved to search for workshop content: " << path;
}
} else {
m_globalVariables->setLocalStoragePath(QUrl::fromUserInput(m_qSettings.value("ScreenPlayContentPath").toString()));
}
}
/*!
\brief Checks if there is already a saved language. If not we try to use the system langauge.
If we do not support the system language we use english.

View File

@ -39,6 +39,7 @@
#include <QDir>
#include <QFile>
#include <QFontDatabase>
#include <QIODevice>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
@ -185,10 +186,8 @@ public slots:
void setAutostart(bool autostart)
{
if (m_autostart == autostart)
return;
if (desktopEnvironment() == DesktopEnvironment::Windows) {
#ifdef Q_OS_WIN
QSettings settings("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat);
if (autostart) {
settings.setValue("ScreenPlay", QDir::toNativeSeparators(QCoreApplication::applicationFilePath()) + " -silent");
@ -196,8 +195,39 @@ public slots:
} else {
settings.remove("ScreenPlay");
}
#endif
}
if (desktopEnvironment() == DesktopEnvironment::OSX) {
const QString plistFileName = "app.screenplay.plist";
QFile defaultPListFile(":/assets/macos/" + plistFileName);
defaultPListFile.open(QIODevice::ReadOnly);
QString settingsPlistContent = defaultPListFile.readAll();
if(!settingsPlistContent.contains("{{SCREENPLAY_PATH}}")){
qCritical() << "Unable to load plist settings template from qrc to set autostart!";
}
QDir workingDir(QGuiApplication::applicationDirPath());
workingDir.cdUp();
workingDir.cdUp();
workingDir.cdUp();
const QString screenPlayPath = QUrl::fromUserInput(workingDir.path() + "/ScreenPlay.app/Contents/MacOS/ScreenPlay").toLocalFile();
settingsPlistContent.replace("{{SCREENPLAY_PATH}}", screenPlayPath);
settingsPlistContent.replace("{{SCREENPLAY_AUTOSTART}}", autostart ? "true":"false");
const QString homePath = QDir::homePath();
QFile settingsPlist(homePath + "/Library/LaunchAgents/" + plistFileName);
if (settingsPlist.exists()) {
if(!settingsPlist.remove()){
qCritical() << "Unable to remove: " << settingsPlist;
}
}
settingsPlist.open(QIODevice::WriteOnly | QIODevice::Truncate);
QTextStream out(&settingsPlist);
out.setCodec("UTF-8");
out << settingsPlistContent;
settingsPlist.flush();
settingsPlist.close();
}
setqSetting("Autostart", autostart);
m_autostart = autostart;
@ -371,6 +401,7 @@ public slots:
private:
void restoreDefault(const QString& appConfigLocation, const QString& settingsFileType);
void initInstalledPath();
private:
QSettings m_qSettings;