diff --git a/src/pimuniqueapplication.cpp b/src/pimuniqueapplication.cpp index fadfcd7..c3adacb 100644 --- a/src/pimuniqueapplication.cpp +++ b/src/pimuniqueapplication.cpp @@ -1,174 +1,174 @@ /* This file is part of the KDE project Copyright 2008 David Faure This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License or ( at your option ) version 3 or, at the discretion of KDE e.V. ( which shall act as a proxy as in section 14 of the GPLv3 ), any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config-kontactinterface.h" #include "pimuniqueapplication.h" #include "kontactinterface_debug.h" #include #include #include #include #include #include #include #include #include #include using namespace KontactInterface; //@cond PRIVATE class Q_DECL_HIDDEN KontactInterface::PimUniqueApplication::Private { public: Private() : cmdArgs(new QCommandLineParser()) {} ~Private() { delete cmdArgs; } QCommandLineParser *const cmdArgs; }; //@endcond PimUniqueApplication::PimUniqueApplication(int &argc, char **argv[]) : QApplication(argc, *argv) , d(new Private()) { } PimUniqueApplication::~PimUniqueApplication() { delete d; } QCommandLineParser *PimUniqueApplication::cmdArgs() const { return d->cmdArgs; } void PimUniqueApplication::setAboutData(KAboutData &aboutData) { KAboutData::setApplicationData(aboutData); aboutData.setupCommandLine(d->cmdArgs); // This object name is used in start(), and also in kontact's UniqueAppHandler. const QString objectName = QLatin1Char('/') + QApplication::applicationName() + QLatin1String("_PimApplication"); QDBusConnection::sessionBus().registerObject( objectName, this, QDBusConnection::ExportScriptableSlots | QDBusConnection::ExportScriptableProperties | QDBusConnection::ExportAdaptors); } bool PimUniqueApplication::start(const QStringList &arguments, bool unique) { const QString appName = QApplication::applicationName(); // Try talking to /appName_PimApplication in org.kde.appName, // (which could be kontact or the standalone application), // otherwise fall back to starting a new app const QString serviceName = QLatin1String("org.kde.") + appName; if (QDBusConnection::sessionBus().interface()->isServiceRegistered(serviceName)) { QByteArray new_asn_id; #if KONTACTINTERFACE_HAVE_X11 KStartupInfoId id; if (!KStartupInfo::startupId().isEmpty()) { id.initId(KStartupInfo::startupId()); } else { id = KStartupInfo::currentStartupIdEnv(); } if (!id.isNull()) { new_asn_id = id.id(); } #endif KWindowSystem::allowExternalProcessWindowActivation(); const QString objectName = QLatin1Char('/') + appName + QLatin1String("_PimApplication"); qCDebug(KONTACTINTERFACE_LOG) << objectName; QDBusInterface iface(serviceName, objectName, QStringLiteral("org.kde.PIMUniqueApplication"), QDBusConnection::sessionBus()); if (iface.isValid()) { QDBusReply reply = iface.call(QStringLiteral("newInstance"), new_asn_id, arguments, QDir::currentPath()); if (reply.isValid()) { return false; // success means that main() can exist now. } } } qCDebug(KONTACTINTERFACE_LOG) << "kontact not running -- start standalone application"; if (unique) { QDBusConnection::sessionBus().registerService(serviceName); } static_cast(qApp)->activate(arguments, QDir::currentPath()); return true; } int PimUniqueApplication::newInstance() { return newInstance(KStartupInfo::startupId(), QStringList() << QApplication::applicationName(), QDir::currentPath()); } // This is called via DBus either by another instance that has just been // started or by Kontact when the module is activated int PimUniqueApplication::newInstance(const QByteArray &startupId, const QStringList &arguments, const QString &workingDirectory) { KStartupInfo::setStartupId(startupId); const QWidgetList tlws = topLevelWidgets(); for (QWidget *win : tlws) { if (qobject_cast(win)) { win->show(); - KStartupInfo::setNewStartupId(win, startupId); + KStartupInfo::setNewStartupId(win, startupId); // this moves 'win' to the current desktop #ifdef Q_OS_WIN KWindowSystem::forceActiveWindow(win->winId()); #endif break; } } activate(arguments, workingDirectory); return 0; } int PimUniqueApplication::activate(const QStringList &arguments, const QString &workingDirectory) { Q_UNUSED(arguments); Q_UNUSED(workingDirectory); return 0; } diff --git a/src/pimuniqueapplication.h b/src/pimuniqueapplication.h index 5f6e7c9..73b6549 100644 --- a/src/pimuniqueapplication.h +++ b/src/pimuniqueapplication.h @@ -1,73 +1,73 @@ /* This file is part of the KDE project Copyright 2008 David Faure This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License or ( at your option ) version 3 or, at the discretion of KDE e.V. ( which shall act as a proxy as in section 14 of the GPLv3 ), any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef KONTACTINTERFACE_PIMUNIQUEAPPLICATION_H #define KONTACTINTERFACE_PIMUNIQUEAPPLICATION_H #include "kontactinterface_export.h" #include class KAboutData; class QCommandLineParser; namespace KontactInterface { /** * KDEPIM applications which can be integrated into kontact should use * PimUniqueApplication instead of Qapplication + Dbus unique. * This makes command-line handling work, i.e. you can launch "korganizer" * and if kontact is already running, it will load the korganizer part and * switch to it. */ class KONTACTINTERFACE_EXPORT PimUniqueApplication : public QApplication { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.kde.PIMUniqueApplication") public: explicit PimUniqueApplication(int &argc, char **argv[]); ~PimUniqueApplication(); void setAboutData(KAboutData &aboutData); static bool start(const QStringList &arguments, bool unique = true); QCommandLineParser *cmdArgs() const; public Q_SLOTS: Q_SCRIPTABLE int newInstance(); - Q_SCRIPTABLE int newInstance(const QByteArray &startupId, const QStringList &arguments, const QString &workingDirectory); + Q_SCRIPTABLE virtual int newInstance(const QByteArray &startupId, const QStringList &arguments, const QString &workingDirectory); protected: virtual int activate(const QStringList &arguments, const QString &workingDirectory); private: //@cond PRIVATE class Private; Private *const d; //@endcond }; } #endif