summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/mirclient
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/mirclient')
-rw-r--r--src/plugins/platforms/mirclient/qmirclientclipboard.cpp7
-rw-r--r--src/plugins/platforms/mirclient/qmirclientglcontext.cpp18
-rw-r--r--src/plugins/platforms/mirclient/qmirclientglcontext.h2
-rw-r--r--src/plugins/platforms/mirclient/qmirclientinput.cpp2
-rw-r--r--src/plugins/platforms/mirclient/qmirclientintegration.cpp17
-rw-r--r--src/plugins/platforms/mirclient/qmirclientintegration.h3
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;