diff options
author | Paul Olav Tvete <paul.tvete@theqtcompany.com> | 2015-08-07 12:55:03 +0200 |
---|---|---|
committer | Paul Olav Tvete <paul.tvete@theqtcompany.com> | 2015-08-07 12:23:29 +0000 |
commit | 8c4067a1cac0d93ced039955d1b1f3b8820e5cc8 (patch) | |
tree | 67fcd08d0a6390c841ad0a90cc31016773221610 /src/plugins/platforms/mirclient/qmirclientintegration.cpp | |
parent | 81f259a91b461b9779b66287f8592dbbd910fd18 (diff) |
Rename files and classes to Qt Project standard
Change-Id: Ie694227780bc0c8cdd9398e45e2e0a5d73c8a7d4
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@theqtcompany.com>
Diffstat (limited to 'src/plugins/platforms/mirclient/qmirclientintegration.cpp')
-rw-r--r-- | src/plugins/platforms/mirclient/qmirclientintegration.cpp | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/src/plugins/platforms/mirclient/qmirclientintegration.cpp b/src/plugins/platforms/mirclient/qmirclientintegration.cpp new file mode 100644 index 0000000000..269d390f56 --- /dev/null +++ b/src/plugins/platforms/mirclient/qmirclientintegration.cpp @@ -0,0 +1,243 @@ +/* + * Copyright (C) 2014-2015 Canonical, Ltd. + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3, as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, + * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// Qt +#include <QGuiApplication> +#include <private/qguiapplication_p.h> +#include <qpa/qplatformnativeinterface.h> +#include <qpa/qplatforminputcontextfactory_p.h> +#include <qpa/qplatforminputcontext.h> +#include <QtPlatformSupport/private/qgenericunixfontdatabase_p.h> +#include <QtPlatformSupport/private/qgenericunixeventdispatcher_p.h> +#include <QOpenGLContext> + +// Local +#include "qmirclientbackingstore.h" +#include "qmirclientclipboard.h" +#include "qmirclientglcontext.h" +#include "qmirclientinput.h" +#include "qmirclientintegration.h" +#include "qmirclientlogging.h" +#include "qmirclientnativeinterface.h" +#include "qmirclientscreen.h" +#include "qmirclienttheme.h" +#include "qmirclientwindow.h" + +// platform-api +#include <ubuntu/application/lifecycle_delegate.h> +#include <ubuntu/application/id.h> +#include <ubuntu/application/options.h> + +static void resumedCallback(const UApplicationOptions *options, void* context) +{ + Q_UNUSED(options) + Q_UNUSED(context) + DASSERT(context != NULL); + QCoreApplication::postEvent(QCoreApplication::instance(), + new QEvent(QEvent::ApplicationActivate)); +} + +static void aboutToStopCallback(UApplicationArchive *archive, void* context) +{ + Q_UNUSED(archive) + DASSERT(context != NULL); + QMirClientClientIntegration* integration = static_cast<QMirClientClientIntegration*>(context); + integration->inputContext()->hideInputPanel(); + QCoreApplication::postEvent(QCoreApplication::instance(), + new QEvent(QEvent::ApplicationDeactivate)); +} + +QMirClientClientIntegration::QMirClientClientIntegration() + : QPlatformIntegration() + , mNativeInterface(new QMirClientNativeInterface) + , mFontDb(new QGenericUnixFontDatabase) + , mServices(new QMirClientPlatformServices) + , mClipboard(new QMirClientClipboard) + , mScaleFactor(1.0) +{ + setupOptions(); + setupDescription(); + + // Create new application instance + mInstance = u_application_instance_new_from_description_with_options(mDesc, mOptions); + + if (mInstance == nullptr) + qFatal("QMirClientClientIntegration: connection to Mir server failed. Check that a Mir server is\n" + "running, and the correct socket is being used and is accessible. The shell may have\n" + "rejected the incoming connection, so check its log file"); + + // Create default screen. + mScreen = new QMirClientScreen(u_application_instance_get_mir_connection(mInstance)); + screenAdded(mScreen); + + // Initialize input. + if (qEnvironmentVariableIsEmpty("QTUBUNTU_NO_INPUT")) { + mInput = new QMirClientInput(this); + mInputContext = QPlatformInputContextFactory::create(); + } else { + mInput = nullptr; + mInputContext = nullptr; + } + + // compute the scale factor + const int defaultGridUnit = 8; + int gridUnit = defaultGridUnit; + QByteArray gridUnitString = qgetenv("GRID_UNIT_PX"); + if (!gridUnitString.isEmpty()) { + bool ok; + gridUnit = gridUnitString.toInt(&ok); + if (!ok) { + gridUnit = defaultGridUnit; + } + } + mScaleFactor = static_cast<qreal>(gridUnit) / defaultGridUnit; +} + +QMirClientClientIntegration::~QMirClientClientIntegration() +{ + delete mInput; + delete mInputContext; + delete mScreen; + delete mServices; +} + +QPlatformServices *QMirClientClientIntegration::services() const +{ + return mServices; +} + +void QMirClientClientIntegration::setupOptions() +{ + QStringList args = QCoreApplication::arguments(); + int argc = args.size() + 1; + char **argv = new char*[argc]; + for (int i = 0; i < argc - 1; i++) + argv[i] = qstrdup(args.at(i).toLocal8Bit()); + argv[argc - 1] = nullptr; + + mOptions = u_application_options_new_from_cmd_line(argc - 1, argv); + + for (int i = 0; i < argc; i++) + delete [] argv[i]; + delete [] argv; +} + +void QMirClientClientIntegration::setupDescription() +{ + mDesc = u_application_description_new(); + UApplicationId* id = u_application_id_new_from_stringn("QtUbuntu", 8); + u_application_description_set_application_id(mDesc, id); + + UApplicationLifecycleDelegate* delegate = u_application_lifecycle_delegate_new(); + u_application_lifecycle_delegate_set_application_resumed_cb(delegate, &resumedCallback); + u_application_lifecycle_delegate_set_application_about_to_stop_cb(delegate, &aboutToStopCallback); + u_application_lifecycle_delegate_set_context(delegate, this); + u_application_description_set_application_lifecycle_delegate(mDesc, delegate); +} + +QPlatformWindow* QMirClientClientIntegration::createPlatformWindow(QWindow* window) const +{ + return const_cast<QMirClientClientIntegration*>(this)->createPlatformWindow(window); +} + +QPlatformWindow* QMirClientClientIntegration::createPlatformWindow(QWindow* window) +{ + QPlatformWindow* platformWindow = new QMirClientWindow( + window, mClipboard, static_cast<QMirClientScreen*>(mScreen), mInput, u_application_instance_get_mir_connection(mInstance)); + platformWindow->requestActivateWindow(); + return platformWindow; +} + +bool QMirClientClientIntegration::hasCapability(QPlatformIntegration::Capability cap) const +{ + switch (cap) { + case ThreadedPixmaps: + return true; + break; + + case OpenGL: + return true; + break; + + case ThreadedOpenGL: + if (qEnvironmentVariableIsEmpty("QTUBUNTU_NO_THREADED_OPENGL")) { + return true; + } else { + DLOG("ubuntumirclient: disabled threaded OpenGL"); + return false; + } + break; + + default: + return QPlatformIntegration::hasCapability(cap); + } +} + +QAbstractEventDispatcher *QMirClientClientIntegration::createEventDispatcher() const +{ + return createUnixEventDispatcher(); +} + +QPlatformBackingStore* QMirClientClientIntegration::createPlatformBackingStore(QWindow* window) const +{ + return new QMirClientBackingStore(window); +} + +QPlatformOpenGLContext* QMirClientClientIntegration::createPlatformOpenGLContext( + QOpenGLContext* context) const +{ + return const_cast<QMirClientClientIntegration*>(this)->createPlatformOpenGLContext(context); +} + +QPlatformOpenGLContext* QMirClientClientIntegration::createPlatformOpenGLContext( + QOpenGLContext* context) +{ + return new QMirClientOpenGLContext(static_cast<QMirClientScreen*>(context->screen()->handle()), + static_cast<QMirClientOpenGLContext*>(context->shareHandle())); +} + +QStringList QMirClientClientIntegration::themeNames() const +{ + return QStringList(QMirClientTheme::name); +} + +QPlatformTheme* QMirClientClientIntegration::createPlatformTheme(const QString& name) const +{ + Q_UNUSED(name); + return new QMirClientTheme; +} + +QVariant QMirClientClientIntegration::styleHint(StyleHint hint) const +{ + switch (hint) { + case QPlatformIntegration::StartDragDistance: { + // default is 10 pixels (see QPlatformTheme::defaultThemeHint) + return 10.0 * mScaleFactor; + } + case QPlatformIntegration::PasswordMaskDelay: { + // return time in milliseconds - 1 second + return QVariant(1000); + } + default: + break; + } + return QPlatformIntegration::styleHint(hint); +} + +QPlatformClipboard* QMirClientClientIntegration::clipboard() const +{ + return mClipboard.data(); +} |