From c96a6ab627100452864eb4d8da973300401c1bfa Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 17 Jul 2013 16:22:41 +0200 Subject: Pass argc, argv to the platform plugins. Allow for parsing of X11-specific arguments like -display, -geometry. Introduce overload of QPlatformIntegration::create() with argc and argv and provide default implementation that calls the old version (for platforms that do not have argc, argv). Provide default implementation for the old version returning 0 so that platforms using the new API compile. Prototypically implement -display in XCB. Task-number: QTBUG-29396 Change-Id: I6a0e9271fad6e2d10f11b80393025ae3a3e36623 Reviewed-by: Shawn Rutledge --- src/gui/kernel/qguiapplication.cpp | 6 +++--- src/gui/kernel/qplatformintegrationfactory.cpp | 20 ++++++++++++++++---- src/gui/kernel/qplatformintegrationfactory_p.h | 2 +- src/gui/kernel/qplatformintegrationplugin.cpp | 14 ++++++++++++++ src/gui/kernel/qplatformintegrationplugin.h | 3 ++- src/plugins/platforms/windows/main.cpp | 4 ++-- src/plugins/platforms/xcb/main.cpp | 6 +++--- src/plugins/platforms/xcb/qxcbintegration.cpp | 22 ++++++++++++++++++++-- src/plugins/platforms/xcb/qxcbintegration.h | 2 +- 9 files changed, 62 insertions(+), 17 deletions(-) diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 118b481fa3..a8a4ad1937 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -773,14 +773,14 @@ QString QGuiApplication::platformName() *QGuiApplicationPrivate::platform_name : QString(); } -static void init_platform(const QString &pluginArgument, const QString &platformPluginPath) +static void init_platform(const QString &pluginArgument, const QString &platformPluginPath, int &argc, char **argv) { // Split into platform name and arguments QStringList arguments = pluginArgument.split(QLatin1Char(':')); const QString name = arguments.takeFirst().toLower(); // Create the platform integration. - QGuiApplicationPrivate::platform_integration = QPlatformIntegrationFactory::create(name, arguments, platformPluginPath); + QGuiApplicationPrivate::platform_integration = QPlatformIntegrationFactory::create(name, arguments, argc, argv, platformPluginPath); if (QGuiApplicationPrivate::platform_integration) { QGuiApplicationPrivate::platform_name = new QString(name); } else { @@ -908,7 +908,7 @@ void QGuiApplicationPrivate::createPlatformIntegration() argc = j; } - init_platform(QLatin1String(platformName), platformPluginPath); + init_platform(QLatin1String(platformName), platformPluginPath, argc, argv); } diff --git a/src/gui/kernel/qplatformintegrationfactory.cpp b/src/gui/kernel/qplatformintegrationfactory.cpp index 21f53d17de..365edd2010 100644 --- a/src/gui/kernel/qplatformintegrationfactory.cpp +++ b/src/gui/kernel/qplatformintegrationfactory.cpp @@ -55,18 +55,30 @@ Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader, (QPlatformIntegrationFactoryInterface_iid, QLatin1String("/platforms"), Qt::CaseInsensitive)) Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, directLoader, (QPlatformIntegrationFactoryInterface_iid, QLatin1String(""), Qt::CaseInsensitive)) -#endif -QPlatformIntegration *QPlatformIntegrationFactory::create(const QString &platform, const QStringList ¶mList, const QString &platformPluginPath) +static inline QPlatformIntegration *loadIntegration(QFactoryLoader *loader, const QString &key, const QStringList ¶meters, int &argc, char ** argv) +{ + const int index = loader->indexOf(key); + if (index != -1) { + if (QPlatformIntegrationPlugin *factory = qobject_cast(loader->instance(index))) + if (QPlatformIntegration *result = factory->create(key, parameters, argc, argv)) + return result; + } + return 0; +} + +#endif // !QT_NO_LIBRARY + +QPlatformIntegration *QPlatformIntegrationFactory::create(const QString &platform, const QStringList ¶mList, int &argc, char **argv, const QString &platformPluginPath) { #ifndef QT_NO_LIBRARY // Try loading the plugin from platformPluginPath first: if (!platformPluginPath.isEmpty()) { QCoreApplication::addLibraryPath(platformPluginPath); - if (QPlatformIntegration *ret = qLoadPlugin1(directLoader(), platform, paramList)) + if (QPlatformIntegration *ret = loadIntegration(directLoader(), platform, paramList, argc, argv)) return ret; } - if (QPlatformIntegration *ret = qLoadPlugin1(loader(), platform, paramList)) + if (QPlatformIntegration *ret = loadIntegration(loader(), platform, paramList, argc, argv)) return ret; #endif return 0; diff --git a/src/gui/kernel/qplatformintegrationfactory_p.h b/src/gui/kernel/qplatformintegrationfactory_p.h index fb3ba55316..bc8ce11609 100644 --- a/src/gui/kernel/qplatformintegrationfactory_p.h +++ b/src/gui/kernel/qplatformintegrationfactory_p.h @@ -64,7 +64,7 @@ class Q_GUI_EXPORT QPlatformIntegrationFactory { public: static QStringList keys(const QString &platformPluginPath = QString()); - static QPlatformIntegration *create(const QString &name, const QStringList &args, const QString &platformPluginPath = QString()); + static QPlatformIntegration *create(const QString &name, const QStringList &args, int &argc, char **argv, const QString &platformPluginPath = QString()); }; QT_END_NAMESPACE diff --git a/src/gui/kernel/qplatformintegrationplugin.cpp b/src/gui/kernel/qplatformintegrationplugin.cpp index 0f7f365d2a..2a9a047141 100644 --- a/src/gui/kernel/qplatformintegrationplugin.cpp +++ b/src/gui/kernel/qplatformintegrationplugin.cpp @@ -52,4 +52,18 @@ QPlatformIntegrationPlugin::~QPlatformIntegrationPlugin() { } +QPlatformIntegration *QPlatformIntegrationPlugin::create(const QString &key, const QStringList ¶mList) +{ + Q_UNUSED(key) + Q_UNUSED(paramList); + return 0; +} + +QPlatformIntegration *QPlatformIntegrationPlugin::create(const QString &key, const QStringList ¶mList, int &argc, char **argv) +{ + Q_UNUSED(argc) + Q_UNUSED(argv) + return create(key, paramList); // Fallback for platform plugins that do not implement the argc/argv version. +} + QT_END_NAMESPACE diff --git a/src/gui/kernel/qplatformintegrationplugin.h b/src/gui/kernel/qplatformintegrationplugin.h index 434366f0b0..674622f84a 100644 --- a/src/gui/kernel/qplatformintegrationplugin.h +++ b/src/gui/kernel/qplatformintegrationplugin.h @@ -68,7 +68,8 @@ public: explicit QPlatformIntegrationPlugin(QObject *parent = 0); ~QPlatformIntegrationPlugin(); - virtual QPlatformIntegration *create(const QString &key, const QStringList ¶mList) = 0; + virtual QPlatformIntegration *create(const QString &key, const QStringList ¶mList); + virtual QPlatformIntegration *create(const QString &key, const QStringList ¶mList, int &argc, char **argv); }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/windows/main.cpp b/src/plugins/platforms/windows/main.cpp index e5c3269a6c..16cac9d547 100644 --- a/src/plugins/platforms/windows/main.cpp +++ b/src/plugins/platforms/windows/main.cpp @@ -107,10 +107,10 @@ class QWindowsIntegrationPlugin : public QPlatformIntegrationPlugin Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.1" FILE "windows.json") public: - QPlatformIntegration *create(const QString&, const QStringList&); + QPlatformIntegration *create(const QString&, const QStringList&, int &, char **); }; -QPlatformIntegration *QWindowsIntegrationPlugin::create(const QString& system, const QStringList& paramList) +QPlatformIntegration *QWindowsIntegrationPlugin::create(const QString& system, const QStringList& paramList, int &, char **) { if (system.compare(system, QStringLiteral("windows"), Qt::CaseInsensitive) == 0) return new QWindowsIntegration(paramList); diff --git a/src/plugins/platforms/xcb/main.cpp b/src/plugins/platforms/xcb/main.cpp index be5a0e3501..09e60f8d4c 100644 --- a/src/plugins/platforms/xcb/main.cpp +++ b/src/plugins/platforms/xcb/main.cpp @@ -49,13 +49,13 @@ class QXcbIntegrationPlugin : public QPlatformIntegrationPlugin Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.1" FILE "xcb.json") public: - QPlatformIntegration *create(const QString&, const QStringList&); + QPlatformIntegration *create(const QString&, const QStringList&, int &, char **); }; -QPlatformIntegration* QXcbIntegrationPlugin::create(const QString& system, const QStringList& parameters) +QPlatformIntegration* QXcbIntegrationPlugin::create(const QString& system, const QStringList& parameters, int &argc, char **argv) { if (system.toLower() == "xcb") - return new QXcbIntegration(parameters); + return new QXcbIntegration(parameters, argc, argv); return 0; } diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp index 0ff18d9c92..1c170d44e6 100644 --- a/src/plugins/platforms/xcb/qxcbintegration.cpp +++ b/src/plugins/platforms/xcb/qxcbintegration.cpp @@ -119,7 +119,7 @@ static bool runningUnderDebugger() } #endif -QXcbIntegration::QXcbIntegration(const QStringList ¶meters) +QXcbIntegration::QXcbIntegration(const QStringList ¶meters, int &argc, char **argv) : m_eventDispatcher(createUnixEventDispatcher()) , m_services(new QGenericUnixServices) { @@ -138,7 +138,25 @@ QXcbIntegration::QXcbIntegration(const QStringList ¶meters) if (canNotGrabEnv) canGrab = false; - m_connections << new QXcbConnection(m_nativeInterface.data(), canGrab); + // Parse arguments + const char *displayName = 0; + if (argc) { + int j = 1; + for (int i = 1; i < argc; i++) { + char *arg = argv[i]; + if (arg) { + if (!strcmp(arg, "-display") && i < argc - 1) { + displayName = argv[++i]; + arg = 0; + } + } + if (arg) + argv[j++] = arg; + } + argc = j; + } // argc + + m_connections << new QXcbConnection(m_nativeInterface.data(), canGrab, displayName); for (int i = 0; i < parameters.size() - 1; i += 2) { #ifdef Q_XCB_DEBUG diff --git a/src/plugins/platforms/xcb/qxcbintegration.h b/src/plugins/platforms/xcb/qxcbintegration.h index 7042628203..cc39fb1462 100644 --- a/src/plugins/platforms/xcb/qxcbintegration.h +++ b/src/plugins/platforms/xcb/qxcbintegration.h @@ -55,7 +55,7 @@ class QXcbScreen; class QXcbIntegration : public QPlatformIntegration { public: - QXcbIntegration(const QStringList ¶meters); + QXcbIntegration(const QStringList ¶meters, int &argc, char **argv); ~QXcbIntegration(); QPlatformWindow *createPlatformWindow(QWindow *window) const; -- cgit v1.2.3