extern "C" Q_DECL_EXPORT int kdemain(int argc, char **argv) { #ifndef Q_OS_WIN // Started via kdeinit. int launcherFd; if (argc != 2 || memcmp(argv[1], "--fd=", 5) || !(launcherFd = atoi(argv[1] + 5))) { fprintf(stderr, "%s", i18n("klauncher: This program is not supposed to be started manually.\n" "klauncher: It is started automatically by kdeinit5.\n").toLocal8Bit().data()); return 1; } #endif #if defined(Q_OS_DARWIN) CFBundleRef mainBundle = CFBundleGetMainBundle(); if (mainBundle) { // get the application's Info Dictionary. For app bundles this would live in the bundle's Info.plist, // for regular executables it is obtained in another way. CFMutableDictionaryRef infoDict = (CFMutableDictionaryRef) CFBundleGetInfoDictionary(mainBundle); if (infoDict) { // Add or set the "LSUIElement" key with/to value "1". This can simply be a CFString. CFDictionarySetValue(infoDict, CFSTR("LSUIElement"), CFSTR("1")); // That's it. We're now considered as an "agent" by the window server, and thus will have // neither menubar nor presence in the Dock or App Switcher. } } mac_initialize_dbus(); #endif // WABA: Make sure not to enable session management. qunsetenv("SESSION_MANAGER"); // Disable the GLib event loop (rh#983110) const bool wasQtNoGlibSet = !qEnvironmentVariableIsEmpty("QT_NO_GLIB"); if (!wasQtNoGlibSet) { qputenv("QT_NO_GLIB", "1"); } // We need a QGuiApplication as we use X11 QGuiApplication app(argc, argv); app.setApplicationName(QStringLiteral("klauncher")); // Now get rid of QT_NO_GLIB again so launched processes don't inherit it if (!wasQtNoGlibSet) { qunsetenv("QT_NO_GLIB"); } int maxTry = 3; while (true) { QString service(QStringLiteral("org.kde.klauncher5")); // same as ktoolinvocation.cpp if (!QDBusConnection::sessionBus().isConnected()) { qWarning() << "No DBUS session-bus found. Check if you have started the DBUS server."; return 1; } QDBusReply<QDBusConnectionInterface::RegisterServiceReply> reply = QDBusConnection::sessionBus().interface()->registerService(service); if (!reply.isValid()) { qWarning() << "DBUS communication problem!"; return 1; } if (reply == QDBusConnectionInterface::ServiceRegistered) { break; } if (--maxTry == 0) { qWarning() << "Another instance of klauncher is already running!"; return 1; } // Wait a bit... qWarning() << "Waiting for already running klauncher to exit."; QThread::sleep(1); // Try again... } #ifndef USE_KPROCESS_FOR_KIOSLAVES KLauncher *launcher = new KLauncher(launcherFd); #else KLauncher *launcher = new KLauncher(); #endif QDBusConnection::sessionBus().registerObject(QStringLiteral("/"), launcher); #ifndef USE_KPROCESS_FOR_KIOSLAVES if (pipe(sigpipe) != 0) { perror("klauncher: pipe failed."); return 1; } QSocketNotifier *signotif = new QSocketNotifier(sigpipe[ 0 ], QSocketNotifier::Read, launcher); QObject::connect(signotif, SIGNAL(activated(int)), launcher, SLOT(destruct())); KCrash::setEmergencySaveFunction(sig_handler); signal(SIGHUP, sig_handler); signal(SIGPIPE, SIG_IGN); signal(SIGTERM, sig_handler); #endif return app.exec(); }
extern "C" KDE_EXPORT int kdemain( int argc, char**argv ) { #ifndef Q_WS_WIN // Started via kdeinit. int launcherFd; if (argc != 2 || memcmp(argv[1], "--fd=", 5) || !(launcherFd = atoi(argv[1] + 5))) { fprintf(stderr, "%s", i18n("klauncher: This program is not supposed to be started manually.\n" "klauncher: It is started automatically by kdeinit4.\n").toLocal8Bit().data()); return 1; } #endif #if defined(Q_OS_DARWIN) || defined (Q_OS_MAC) mac_initialize_dbus(); #endif KComponentData componentData("klauncher", "kdelibs4"); KGlobal::locale(); // WABA: Make sure not to enable session management. putenv(strdup("SESSION_MANAGER=")); // We need a QCoreApplication to get a DBus event loop QCoreApplication app(argc, argv); app.setApplicationName( componentData.componentName() ); int maxTry = 3; while(true) { QString service(QLatin1String("org.kde.klauncher")); // same as ktoolinvocation.cpp if (!QDBusConnection::sessionBus().isConnected()) { kWarning() << "No DBUS session-bus found. Check if you have started the DBUS server."; return 1; } QDBusReply<QDBusConnectionInterface::RegisterServiceReply> reply = QDBusConnection::sessionBus().interface()->registerService(service); if (!reply.isValid()) { kWarning() << "DBUS communication problem!"; return 1; } if (reply == QDBusConnectionInterface::ServiceRegistered) break; if (--maxTry == 0) { kWarning() << "Another instance of klauncher is already running!"; return 1; } // Wait a bit... kWarning() << "Waiting for already running klauncher to exit."; sleep(1); // Try again... } #ifndef USE_KPROCESS_FOR_KIOSLAVES KLauncher *launcher = new KLauncher(launcherFd); #else KLauncher *launcher = new KLauncher(); #endif QDBusConnection::sessionBus().registerObject(QString::fromLatin1("/"), launcher); #ifndef USE_KPROCESS_FOR_KIOSLAVES if (pipe(sigpipe) != 0) { perror("klauncher: pipe failed."); return 1; } QSocketNotifier* signotif = new QSocketNotifier( sigpipe[ 0 ], QSocketNotifier::Read, launcher ); QObject::connect( signotif, SIGNAL(activated(int)), launcher, SLOT(destruct())); KCrash::setEmergencySaveFunction(sig_handler); KDE_signal( SIGHUP, sig_handler); KDE_signal( SIGPIPE, SIG_IGN); KDE_signal( SIGTERM, sig_handler); #endif return app.exec(); }