kdeconnect-kde/indicator/indicatorhelper_mac.cpp
Albert Vaca Cintora bbcbec7709 Refactor macOS startup code
Moves all the stuff that is needed to start DBus on macOS (which for some reason it needs several steps, involving the use of `launchctl`) into a single `startDBusDaemon()` function. Before, it was spread into `kdeconnectconfig.cpp`, `indicatorhelper_mac.cpp` and `dbushelper.cpp`.

It also removes checking for an existing DBus daemon and always starts our own, since in most cases we couldn't connect to it anyway. This, together with removing the sleep in the retries when polling for the DBus daemon from 3s to 100ms, makes the startup much faster, so I removed the loading splash screen.
2024-09-21 09:27:24 +00:00

76 lines
2.4 KiB
C++

/*
* SPDX-FileCopyrightText: 2019 Weixuan XIAO <veyx.shaw@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
#include "indicatorhelper.h"
#include <KLocalizedString>
#include <QApplication>
#include <QDebug>
#include <QFile>
#include <QIcon>
#include <QMessageBox>
#include <QProcess>
#include <QStandardPaths>
#include <QThread>
#include "serviceregister_mac.h"
#include <dbushelper.h>
#include <kdeconnectconfig.h>
IndicatorHelper::IndicatorHelper()
{
registerServices();
}
IndicatorHelper::~IndicatorHelper()
{
}
void IndicatorHelper::iconPathHook()
{
const QString iconPath = QStandardPaths::locate(QStandardPaths::AppDataLocation, QStringLiteral("kdeconnect-icons"), QStandardPaths::LocateDirectory);
if (!iconPath.isNull()) {
QStringList themeSearchPaths = QIcon::themeSearchPaths();
themeSearchPaths << iconPath;
QIcon::setThemeSearchPaths(themeSearchPaths);
}
}
int IndicatorHelper::startDaemon()
{
int dbusStatus = DBusHelper::startDBusDaemon();
if (dbusStatus) {
QMessageBox::critical(nullptr,
i18n("KDE Connect"),
i18n("Cannot connect to DBus\n"
"KDE Connect will quit"),
QMessageBox::Abort,
QMessageBox::Abort);
QApplication::exit(dbusStatus);
}
// Start kdeconnectd, the daemon will not duplicate when there is already one
QString daemonPath = QCoreApplication::applicationDirPath() + QLatin1String("/kdeconnectd");
if (!QFile::exists(daemonPath)) {
QMessageBox::critical(nullptr, i18n("KDE Connect"), i18n("Cannot find kdeconnectd"), QMessageBox::Abort, QMessageBox::Abort);
QApplication::exit(-10);
}
QProcess::startDetached(daemonPath);
return 0;
}
void IndicatorHelper::systrayIconHook(KStatusNotifierItem &systray)
{
const QString iconPath = QStandardPaths::locate(QStandardPaths::AppDataLocation, QStringLiteral("kdeconnect-icons"), QStandardPaths::LocateDirectory);
if (!iconPath.isNull()) {
auto icon = QIcon::fromTheme(QStringLiteral("kdeconnectindicator"));
icon.setIsMask(true); // Make icon adapt to menu bar color
systray.setIconByPixmap(icon);
} else {
// We are in macOS dev env, just continue
qWarning() << "Fail to find indicator icon, continue anyway";
}
}