Changeset View
Changeset View
Standalone View
Standalone View
ksmserver/server.cpp
Show First 20 Lines • Show All 518 Lines • ▼ Show 20 Line(s) | 506 | { | |||
---|---|---|---|---|---|
519 | return 0; // Bogus return value, notreached | 519 | return 0; // Bogus return value, notreached | ||
520 | } | 520 | } | ||
521 | 521 | | |||
522 | void KSMServer::setupXIOErrorHandler() | 522 | void KSMServer::setupXIOErrorHandler() | ||
523 | { | 523 | { | ||
524 | XSetIOErrorHandler(Xio_ErrorHandler); | 524 | XSetIOErrorHandler(Xio_ErrorHandler); | ||
525 | } | 525 | } | ||
526 | 526 | | |||
527 | static int wake_up_socket = -1; | ||||
527 | static void sighandler(int sig) | 528 | static void sighandler(int sig) | ||
528 | { | 529 | { | ||
529 | if (sig == SIGHUP) { | 530 | if (sig == SIGHUP) { | ||
530 | signal(SIGHUP, sighandler); | 531 | signal(SIGHUP, sighandler); | ||
531 | return; | 532 | return; | ||
532 | } | 533 | } | ||
533 | 534 | | |||
534 | if (the_server) | 535 | char ch = 0; | ||
535 | { | 536 | (void)::write(wake_up_socket, &ch, 1); | ||
536 | KSMServer *server = the_server; | | |||
537 | the_server = nullptr; | | |||
538 | server->cleanUp(); | | |||
539 | delete server; | | |||
540 | } | | |||
541 | | ||||
542 | if (qApp) | | |||
543 | qApp->quit(); | | |||
544 | //::exit(0); | | |||
545 | } | 537 | } | ||
546 | 538 | | |||
547 | 539 | | |||
548 | void KSMWatchProc ( IceConn iceConn, IcePointer client_data, Bool opening, IcePointer* watch_data) | 540 | void KSMWatchProc ( IceConn iceConn, IcePointer client_data, Bool opening, IcePointer* watch_data) | ||
549 | { | 541 | { | ||
550 | KSMServer* ds = ( KSMServer*) client_data; | 542 | KSMServer* ds = ( KSMServer*) client_data; | ||
551 | 543 | | |||
552 | if (opening) { | 544 | if (opening) { | ||
▲ Show 20 Lines • Show All 49 Lines • ▼ Show 20 Line(s) | |||||
602 | #ifdef HAVE__ICETRANSNOLISTEN | 594 | #ifdef HAVE__ICETRANSNOLISTEN | ||
603 | extern "C" int _IceTransNoListen(const char * protocol); | 595 | extern "C" int _IceTransNoListen(const char * protocol); | ||
604 | #endif | 596 | #endif | ||
605 | 597 | | |||
606 | KSMServer::KSMServer( const QString& windowManager, InitFlags flags ) | 598 | KSMServer::KSMServer( const QString& windowManager, InitFlags flags ) | ||
607 | : wmProcess( nullptr ) | 599 | : wmProcess( nullptr ) | ||
608 | , sessionGroup( QStringLiteral( "" ) ) | 600 | , sessionGroup( QStringLiteral( "" ) ) | ||
609 | , logoutEffectWidget( nullptr ) | 601 | , logoutEffectWidget( nullptr ) | ||
602 | , sockets{ -1, -1 } | ||||
610 | { | 603 | { | ||
611 | if (!flags.testFlag(InitFlag::NoLockScreen)) { | 604 | if (!flags.testFlag(InitFlag::NoLockScreen)) { | ||
612 | ScreenLocker::KSldApp::self()->initialize(); | 605 | ScreenLocker::KSldApp::self()->initialize(); | ||
613 | if (flags.testFlag(InitFlag::ImmediateLockScreen)) { | 606 | if (flags.testFlag(InitFlag::ImmediateLockScreen)) { | ||
614 | ScreenLocker::KSldApp::self()->lock(ScreenLocker::EstablishLock::Immediate); | 607 | ScreenLocker::KSldApp::self()->lock(ScreenLocker::EstablishLock::Immediate); | ||
615 | } | 608 | } | ||
616 | } | 609 | } | ||
617 | 610 | | |||
611 | if(::socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, sockets) != 0) | ||||
612 | qFatal("Could not create socket pair, error %d (%s)", errno, strerror(errno)); | ||||
613 | wake_up_socket = sockets[0]; | ||||
614 | QSocketNotifier* n = new QSocketNotifier(sockets[1], QSocketNotifier::Read, this); | ||||
615 | qApp->connect(n, &QSocketNotifier::activated, &QApplication::quit); | ||||
616 | | ||||
graesslin: why the old connect syntax? | |||||
618 | new KSMServerInterfaceAdaptor( this ); | 617 | new KSMServerInterfaceAdaptor( this ); | ||
619 | QDBusConnection::sessionBus().registerObject(QStringLiteral("/KSMServer"), this); | 618 | QDBusConnection::sessionBus().registerObject(QStringLiteral("/KSMServer"), this); | ||
620 | kcminitSignals = nullptr; | 619 | kcminitSignals = nullptr; | ||
621 | the_server = this; | 620 | the_server = this; | ||
622 | clean = false; | 621 | clean = false; | ||
623 | 622 | | |||
624 | shutdownType = KWorkSpace::ShutdownTypeNone; | 623 | shutdownType = KWorkSpace::ShutdownTypeNone; | ||
625 | 624 | | |||
▲ Show 20 Lines • Show All 107 Lines • ▼ Show 20 Line(s) | |||||
733 | } | 732 | } | ||
734 | 733 | | |||
735 | void KSMServer::cleanUp() | 734 | void KSMServer::cleanUp() | ||
736 | { | 735 | { | ||
737 | if (clean) return; | 736 | if (clean) return; | ||
738 | clean = true; | 737 | clean = true; | ||
739 | IceFreeListenObjs (numTransports, listenObjs); | 738 | IceFreeListenObjs (numTransports, listenObjs); | ||
740 | 739 | | |||
740 | wake_up_socket = -1; | ||||
741 | ::close(sockets[1]); | ||||
742 | ::close(sockets[0]); | ||||
743 | sockets[0] = -1; | ||||
744 | sockets[1] = -1; | ||||
745 | | ||||
741 | QByteArray fName = QFile::encodeName(QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation) + QLatin1Char('/') + QStringLiteral("KSMserver")); | 746 | QByteArray fName = QFile::encodeName(QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation) + QLatin1Char('/') + QStringLiteral("KSMserver")); | ||
742 | QString display = QString::fromLocal8Bit(::getenv("DISPLAY")); | 747 | QString display = QString::fromLocal8Bit(::getenv("DISPLAY")); | ||
743 | // strip the screen number from the display | 748 | // strip the screen number from the display | ||
744 | display.remove(QRegExp(QStringLiteral("\\.[0-9]+$"))); | 749 | display.remove(QRegExp(QStringLiteral("\\.[0-9]+$"))); | ||
745 | int i; | 750 | int i; | ||
746 | while( (i = display.indexOf(QLatin1Char(':'))) >= 0) | 751 | while( (i = display.indexOf(QLatin1Char(':'))) >= 0) | ||
747 | display[i] = '_'; | 752 | display[i] = '_'; | ||
748 | while( (i = display.indexOf(QLatin1Char('/'))) >= 0) | 753 | while( (i = display.indexOf(QLatin1Char('/'))) >= 0) | ||
▲ Show 20 Lines • Show All 380 Lines • Show Last 20 Lines |
why the old connect syntax?