This repository has been archived on 2026-08-16. You can view files and clone it, but cannot push or open issues or pull requests.
ollie-kde/daemon/main.cpp

77 lines
2.1 KiB
C++

#include <QCoreApplication>
#include <QDBusConnection>
#include <QDebug>
#include <QSocketNotifier>
#include <csignal>
#include <sys/socket.h>
#include <unistd.h>
#include "session_manager.h"
#include "sessionmanageradaptor.h" // generated by qt6_add_dbus_adaptor
// Async-signal-safe shutdown via socketpair
static int sigFd[2];
static void signalHandler(int)
{
char c = 1;
write(sigFd[0], &c, 1);
}
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
app.setApplicationName("ollie-kde");
app.setOrganizationName("ollie");
// Set up signal handling via socketpair (async-signal-safe)
if (socketpair(AF_UNIX, SOCK_STREAM, 0, sigFd) != 0) {
qCritical() << "Cannot create signal socketpair";
return 1;
}
auto *sigNotifier = new QSocketNotifier(sigFd[1], QSocketNotifier::Read, &app);
QObject::connect(sigNotifier, &QSocketNotifier::activated, &app, [&]() {
char c;
read(sigFd[1], &c, 1);
qDebug() << "Received shutdown signal, exiting gracefully...";
app.quit();
});
signal(SIGTERM, signalHandler);
signal(SIGINT, signalHandler);
// Create the session manager (initializes ollie core)
SessionManager manager;
// Create the D-Bus adaptor (generated from XML)
new SessionManagerAdaptor(&manager);
// Register on the session bus
QDBusConnection bus = QDBusConnection::sessionBus();
if (!bus.isConnected()) {
qCritical() << "Cannot connect to D-Bus session bus";
return 1;
}
if (!bus.registerService("org.ollie.SessionManager")) {
qCritical() << "Cannot register D-Bus service org.ollie.SessionManager:"
<< bus.lastError().message();
return 1;
}
if (!bus.registerObject("/org/ollie/SessionManager", &manager)) {
qCritical() << "Cannot register D-Bus object /org/ollie/SessionManager:"
<< bus.lastError().message();
return 1;
}
qDebug() << "ollie-kde daemon started on D-Bus: org.ollie.SessionManager";
int rc = app.exec();
qDebug() << "ollie-kde daemon exiting";
return rc;
}