diff options
Diffstat (limited to 'src/plugins/platforms/mirclient')
6 files changed, 33 insertions, 16 deletions
diff --git a/src/plugins/platforms/mirclient/qmirclientclipboard.cpp b/src/plugins/platforms/mirclient/qmirclientclipboard.cpp index 53246f66c0..4cb2b5f740 100644 --- a/src/plugins/platforms/mirclient/qmirclientclipboard.cpp +++ b/src/plugins/platforms/mirclient/qmirclientclipboard.cpp @@ -100,7 +100,7 @@ void QMirClientClipboard::onDBusClipboardGetContentsFinished(QDBusPendingCallWat Q_ASSERT(call == mPendingGetContentsCall.data()); QDBusPendingReply<QByteArray> reply = *call; - if (reply.isError()) { + if (Q_UNLIKELY(reply.isError())) { qCritical("QMirClientClipboard - Failed to get system clipboard contents via D-Bus. %s, %s", qPrintable(reply.error().name()), qPrintable(reply.error().message())); // TODO: Might try again later a number of times... @@ -114,7 +114,7 @@ void QMirClientClipboard::onDBusClipboardGetContentsFinished(QDBusPendingCallWat void QMirClientClipboard::onDBusClipboardSetContentsFinished(QDBusPendingCallWatcher *call) { QDBusPendingReply<void> reply = *call; - if (reply.isError()) { + if (Q_UNLIKELY(reply.isError())) { qCritical("QMirClientClipboard - Failed to set the system clipboard contents via D-Bus. %s, %s", qPrintable(reply.error().name()), qPrintable(reply.error().message())); // TODO: Might try again later a number of times... @@ -148,9 +148,8 @@ void QMirClientClipboard::setupDBus() QStringLiteral("com.canonical.QtMir.Clipboard"), QStringLiteral("ContentsChanged"), this, SLOT(updateMimeData(QByteArray))); - if (!ok) { + if (Q_UNLIKELY(!ok)) qCritical("QMirClientClipboard - Failed to connect to ContentsChanged signal form the D-Bus system clipboard."); - } mDBusClipboard = new QDBusInterface(QStringLiteral("com.canonical.QtMir"), QStringLiteral("/com/canonical/QtMir/Clipboard"), diff --git a/src/plugins/platforms/mirclient/qmirclientglcontext.cpp b/src/plugins/platforms/mirclient/qmirclientglcontext.cpp index 01db3b8d61..b1ca0b1f7c 100644 --- a/src/plugins/platforms/mirclient/qmirclientglcontext.cpp +++ b/src/plugins/platforms/mirclient/qmirclientglcontext.cpp @@ -39,6 +39,8 @@ #include "qmirclientwindow.h" #include "qmirclientlogging.h" #include <QtPlatformSupport/private/qeglconvenience_p.h> +#include <QtGui/private/qopenglcontext_p.h> +#include <dlfcn.h> #if !defined(QT_NO_DEBUG) static void printOpenGLESConfig() { @@ -103,6 +105,15 @@ bool QMirClientOpenGLContext::makeCurrent(QPlatformSurface* surface) ASSERT(eglMakeCurrent(mEglDisplay, eglSurface, eglSurface, mEglContext) == EGL_TRUE); printOpenGLESConfig(); #endif + + // When running on the emulator, shaders will be compiled using a thin wrapper around the desktop drivers. + // These wrappers might not support the precision qualifiers, so set the workaround flag to true. + const char *rendererString = reinterpret_cast<const char *>(glGetString(GL_RENDERER)); + if (rendererString != 0 && qstrncmp(rendererString, "Android Emulator", 16) == 0) { + QOpenGLContextPrivate *ctx_d = QOpenGLContextPrivate::get(context()); + ctx_d->workaround_missingPrecisionQualifiers = true; + } + return true; } @@ -133,12 +144,15 @@ void QMirClientOpenGLContext::swapBuffers(QPlatformSurface* surface) ubuntuWindow->onSwapBuffersDone(); } -void (*QMirClientOpenGLContext::getProcAddress(const QByteArray& procName)) () +QFunctionPointer QMirClientOpenGLContext::getProcAddress(const char *procName) { #if defined(QT_NO_DEBUG) eglBindAPI(api_in_use()); #else ASSERT(eglBindAPI(api_in_use()) == EGL_TRUE); #endif - return eglGetProcAddress(procName.constData()); + QFunctionPointer proc = (QFunctionPointer) eglGetProcAddress(procName); + if (!proc) + proc = (QFunctionPointer) dlsym(RTLD_DEFAULT, procName); + return proc; } diff --git a/src/plugins/platforms/mirclient/qmirclientglcontext.h b/src/plugins/platforms/mirclient/qmirclientglcontext.h index 29c196ce5c..9278cc7beb 100644 --- a/src/plugins/platforms/mirclient/qmirclientglcontext.h +++ b/src/plugins/platforms/mirclient/qmirclientglcontext.h @@ -53,7 +53,7 @@ public: bool makeCurrent(QPlatformSurface* surface) override; void doneCurrent() override; bool isValid() const override { return mEglContext != EGL_NO_CONTEXT; } - void (*getProcAddress(const QByteArray& procName)) () override; + QFunctionPointer getProcAddress(const char *procName) override; EGLContext eglContext() const { return mEglContext; } diff --git a/src/plugins/platforms/mirclient/qmirclientinput.cpp b/src/plugins/platforms/mirclient/qmirclientinput.cpp index addeda634c..3af714465b 100644 --- a/src/plugins/platforms/mirclient/qmirclientinput.cpp +++ b/src/plugins/platforms/mirclient/qmirclientinput.cpp @@ -214,7 +214,7 @@ void QMirClientInput::customEvent(QEvent* event) const MirEvent *nativeEvent = ubuntuEvent->nativeEvent; if ((ubuntuEvent->window == nullptr) || (ubuntuEvent->window->window() == nullptr)) { - qWarning() << "Attempted to deliver an event to a non-existent window, ignoring."; + qWarning("Attempted to deliver an event to a non-existent window, ignoring."); return; } diff --git a/src/plugins/platforms/mirclient/qmirclientintegration.cpp b/src/plugins/platforms/mirclient/qmirclientintegration.cpp index 4b2572ce0d..a4f9e46fef 100644 --- a/src/plugins/platforms/mirclient/qmirclientintegration.cpp +++ b/src/plugins/platforms/mirclient/qmirclientintegration.cpp @@ -102,7 +102,7 @@ QMirClientClientIntegration::QMirClientClientIntegration() // Create new application instance mInstance = u_application_instance_new_from_description_with_options(mDesc, mOptions); - if (mInstance == nullptr) + if (Q_UNLIKELY(!mInstance)) 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"); @@ -110,8 +110,7 @@ QMirClientClientIntegration::QMirClientClientIntegration() mNativeInterface->setMirConnection(u_application_instance_get_mir_connection(mInstance)); // Create default screen. - mScreen = new QMirClientScreen(u_application_instance_get_mir_connection(mInstance)); - screenAdded(mScreen); + screenAdded(new QMirClientScreen(u_application_instance_get_mir_connection(mInstance))); // Initialize input. if (qEnvironmentVariableIsEmpty("QTUBUNTU_NO_INPUT")) { @@ -140,7 +139,8 @@ QMirClientClientIntegration::~QMirClientClientIntegration() { delete mInput; delete mInputContext; - delete mScreen; + for (QScreen *screen : QGuiApplication::screens()) + QPlatformIntegration::destroyScreen(screen->handle()); delete mServices; } @@ -185,8 +185,13 @@ QPlatformWindow* QMirClientClientIntegration::createPlatformWindow(QWindow* wind QPlatformWindow* QMirClientClientIntegration::createPlatformWindow(QWindow* window) { - return new QMirClientWindow(window, mClipboard, static_cast<QMirClientScreen*>(mScreen), - mInput, u_application_instance_get_mir_connection(mInstance)); + return new QMirClientWindow(window, mClipboard, screen(), + mInput, u_application_instance_get_mir_connection(mInstance)); +} + +QMirClientScreen *QMirClientClientIntegration::screen() const +{ + return static_cast<QMirClientScreen *>(QGuiApplication::primaryScreen()->handle()); } bool QMirClientClientIntegration::hasCapability(QPlatformIntegration::Capability cap) const diff --git a/src/plugins/platforms/mirclient/qmirclientintegration.h b/src/plugins/platforms/mirclient/qmirclientintegration.h index e41cbe2cee..443f61f363 100644 --- a/src/plugins/platforms/mirclient/qmirclientintegration.h +++ b/src/plugins/platforms/mirclient/qmirclientintegration.h @@ -74,7 +74,7 @@ public: QPlatformOpenGLContext* createPlatformOpenGLContext(QOpenGLContext* context); QPlatformWindow* createPlatformWindow(QWindow* window); - QMirClientScreen* screen() const { return mScreen; } + QMirClientScreen* screen() const; private: void setupOptions(); @@ -85,7 +85,6 @@ private: QMirClientPlatformServices* mServices; - QMirClientScreen* mScreen; QMirClientInput* mInput; QPlatformInputContext* mInputContext; QSharedPointer<QMirClientClipboard> mClipboard; |