2022-03-05 22:41:29 +05:00

63 lines
1.3 KiB
C++

/*
SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org>
SPDX-License-Identifier: LGPL-2.0-only
*/
#include "signalhandler.h"
#include "debug.h"
#include <QDebug>
#include <signal.h>
#include <sys/socket.h>
#include <unistd.h>
int SignalHandler::signalFd[2];
SignalHandler::SignalHandler()
{
if (::socketpair(AF_UNIX, SOCK_STREAM, 0, signalFd)) {
qCWarning(PLASMA_SESSION) << "Couldn't create a socketpair";
return;
}
m_handler = new QSocketNotifier(signalFd[1], QSocketNotifier::Read, this);
connect(m_handler, &QSocketNotifier::activated, this, &SignalHandler::handleSignal);
}
SignalHandler::~SignalHandler()
{
for (int sig : std::as_const(m_signalsRegistered)) {
signal(sig, nullptr);
}
close(signalFd[0]);
close(signalFd[1]);
}
void SignalHandler::addSignal(int signalToTrack)
{
m_signalsRegistered.insert(signalToTrack);
signal(signalToTrack, signalHandler);
}
void SignalHandler::signalHandler(int signal)
{
::write(signalFd[0], &signal, sizeof(signal));
}
void SignalHandler::handleSignal()
{
m_handler->setEnabled(false);
int signal;
::read(signalFd[1], &signal, sizeof(signal));
m_handler->setEnabled(true);
Q_EMIT signalReceived(signal);
}
SignalHandler *SignalHandler::self()
{
static SignalHandler s_self;
return &s_self;
}