diff --git a/ksmserver/server.h b/ksmserver/server.h --- a/ksmserver/server.h +++ b/ksmserver/server.h @@ -296,6 +296,7 @@ QList clientsToKill; QList clientsToSave; + int sockets[2]; friend bool readFromPipe(int pipe); }; diff --git a/ksmserver/server.cpp b/ksmserver/server.cpp --- a/ksmserver/server.cpp +++ b/ksmserver/server.cpp @@ -524,24 +524,16 @@ XSetIOErrorHandler(Xio_ErrorHandler); } +static int wake_up_socket = -1; static void sighandler(int sig) { if (sig == SIGHUP) { signal(SIGHUP, sighandler); return; } - if (the_server) - { - KSMServer *server = the_server; - the_server = nullptr; - server->cleanUp(); - delete server; - } - - if (qApp) - qApp->quit(); - //::exit(0); + char ch = 0; + (void)::write(wake_up_socket, &ch, 1); } @@ -607,14 +599,21 @@ : wmProcess( nullptr ) , sessionGroup( QStringLiteral( "" ) ) , logoutEffectWidget( nullptr ) + , sockets{ -1, -1 } { if (!flags.testFlag(InitFlag::NoLockScreen)) { ScreenLocker::KSldApp::self()->initialize(); if (flags.testFlag(InitFlag::ImmediateLockScreen)) { ScreenLocker::KSldApp::self()->lock(ScreenLocker::EstablishLock::Immediate); } } + if(::socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, sockets) != 0) + qFatal("Could not create socket pair, error %d (%s)", errno, strerror(errno)); + wake_up_socket = sockets[0]; + QSocketNotifier* n = new QSocketNotifier(sockets[1], QSocketNotifier::Read, this); + qApp->connect(n, &QSocketNotifier::activated, &QApplication::quit); + new KSMServerInterfaceAdaptor( this ); QDBusConnection::sessionBus().registerObject(QStringLiteral("/KSMServer"), this); kcminitSignals = nullptr; @@ -738,6 +737,12 @@ clean = true; IceFreeListenObjs (numTransports, listenObjs); + wake_up_socket = -1; + ::close(sockets[1]); + ::close(sockets[0]); + sockets[0] = -1; + sockets[1] = -1; + QByteArray fName = QFile::encodeName(QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation) + QLatin1Char('/') + QStringLiteral("KSMserver")); QString display = QString::fromLocal8Bit(::getenv("DISPLAY")); // strip the screen number from the display