1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
/*
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;
}
|