Files
bearwave/src/main.cpp
Sebastian Palencsar 872670bd3e fix: show window on startup and on MPRIS Raise (1.0.5 pkgrel 4)
Register MPRIS only after QML loads, always connect raiseRequested to the
main window (not only when the tray icon exists), and show or activate the
window explicitly on launch. Fix circular dialog property aliases.
2026-06-22 17:04:46 +02:00

113 lines
4.0 KiB
C++

// Copyright (c) 2026 Sebastian Palencsar
// SPDX-License-Identifier: GPL-3.0-or-later
#include <QApplication>
#include <QDBusConnection>
#include <QDBusConnectionInterface>
#include <QDBusMessage>
#include <QDebug>
#include <QIcon>
#include <QLocale>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QQuickWindow>
#include <QTranslator>
#include "radiobackend.h"
#include "mprisadaptor.h"
#include "bearwavecontroladaptor.h"
#include "notificationmanager.h"
#include "systemtraymanager.h"
int main(int argc, char *argv[])
{
QApplication::setApplicationName(QStringLiteral("BearWave"));
QApplication::setDesktopFileName(QStringLiteral("de.nerdbear.bearwave"));
QApplication::setOrganizationName(QStringLiteral("BearWave"));
QApplication::setApplicationVersion(QStringLiteral(BEARWAVE_VERSION));
QApplication app(argc, argv);
QDBusConnection sessionBus = QDBusConnection::sessionBus();
if (sessionBus.isConnected() && sessionBus.interface() && sessionBus.interface()->isServiceRegistered(QStringLiteral("org.mpris.MediaPlayer2.bearwave"))) {
QDBusMessage call = QDBusMessage::createMethodCall(
QStringLiteral("org.mpris.MediaPlayer2.bearwave"),
QStringLiteral("/org/mpris/MediaPlayer2"),
QStringLiteral("org.mpris.MediaPlayer2"),
QStringLiteral("Raise")
);
sessionBus.call(call);
qInfo() << "BearWave is already running; raised the existing window.";
return 0;
}
app.setWindowIcon(QIcon::fromTheme(QStringLiteral("de.nerdbear.bearwave")));
app.setQuitOnLastWindowClosed(false);
QTranslator appTranslator;
if (appTranslator.load(QLocale::system(), QStringLiteral("bearwave"), QStringLiteral("_"), QStringLiteral(":/i18n"))) {
app.installTranslator(&appTranslator);
}
QQmlApplicationEngine engine;
engine.addImportPath(QStringLiteral("qrc:/qml"));
RadioBackend backend;
engine.rootContext()->setContextProperty("radioBackend", &backend);
engine.rootContext()->setContextProperty("bearwaveVersion", QStringLiteral(BEARWAVE_VERSION));
engine.rootContext()->setContextProperty("bearwaveBuildId", QStringLiteral(BEARWAVE_GIT_HASH));
auto *mprisRoot = new MprisRootAdaptor(&backend, &app);
auto *mprisPlayer = new MprisPlayerAdaptor(&backend);
auto *controlAdaptor = new BearWaveControlAdaptor(&backend);
auto *notificationManager = new NotificationManager(&backend, &backend);
Q_UNUSED(mprisRoot)
Q_UNUSED(controlAdaptor)
Q_UNUSED(notificationManager)
const QUrl url(QStringLiteral("qrc:/qml/Main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [&app, url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl) {
qCritical("Failed to load QML file");
app.exit(EXIT_FAILURE);
}
}, Qt::QueuedConnection);
engine.load(url);
if (engine.rootObjects().isEmpty()) {
return EXIT_FAILURE;
}
QQuickWindow *mainWindow = qobject_cast<QQuickWindow *>(engine.rootObjects().constFirst());
if (!mainWindow) {
qCritical("Failed to obtain main window");
return EXIT_FAILURE;
}
QObject::connect(&backend, &RadioBackend::raiseRequested, mainWindow, [mainWindow]() {
mainWindow->show();
mainWindow->raise();
mainWindow->requestActivate();
});
if (!sessionBus.registerObject(QStringLiteral("/org/mpris/MediaPlayer2"), &backend, QDBusConnection::ExportAdaptors)) {
qWarning() << "Failed to register MPRIS D-Bus object";
}
if (!sessionBus.registerService(QStringLiteral("org.mpris.MediaPlayer2.bearwave"))) {
qWarning() << "Failed to register MPRIS D-Bus service org.mpris.MediaPlayer2.bearwave";
} else {
mprisPlayer->publishState();
}
mainWindow->show();
mainWindow->raise();
mainWindow->requestActivate();
SystemTrayManager trayManager(&backend, mainWindow, &app);
Q_UNUSED(trayManager)
return app.exec();
}