summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorten Johan Sørvig <morten.sorvig@digia.com>2014-02-03 22:21:43 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-02-08 10:39:17 +0100
commit2a6e372a490f6b539b5417b3275392ba6a041bd3 (patch)
tree4687ebeed7820359d9655fa7acd3af61a08033da
parentfd0f1bc321a684a0dd57329943f1e6264f8fc7c6 (diff)
Cocoa: Option handling.
Add qt_mac_resolveOption(). Support setting options using either an environment variable or a QWindow property, with a default fallback value. The options are resolved with precedence in the mentioned order. Adds options for the following: NSView setWantsBestResolutionOPenGLSurface NSVIew setWantsLayer NSOpenGLContext NSOpenGLCPSurfaceOrder The window properties use the _q_mac_camelCase format. The environment variables use the QT_MAC_ALL_CAPS format. Change-Id: I1978a02d62e107a2120d81ffdd0f7b32f7731644 Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
-rw-r--r--src/plugins/platforms/cocoa/qcocoaglcontext.mm6
-rw-r--r--src/plugins/platforms/cocoa/qcocoahelpers.h33
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm10
3 files changed, 47 insertions, 2 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoaglcontext.mm b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
index 4b637a707d..6f76892d93 100644
--- a/src/plugins/platforms/cocoa/qcocoaglcontext.mm
+++ b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
@@ -42,6 +42,7 @@
#include "qcocoaglcontext.h"
#include "qcocoawindow.h"
#include "qcocoaautoreleasepool.h"
+#include "qcocoahelpers.h"
#include <qdebug.h>
#include <QtCore/private/qcore_mac_p.h>
#include <QtPlatformSupport/private/cglconvenience_p.h>
@@ -151,6 +152,11 @@ QCocoaGLContext::QCocoaGLContext(const QSurfaceFormat &format, QPlatformOpenGLCo
[m_context setValues:&zeroOpacity forParameter:NSOpenGLCPSurfaceOpacity];
}
+
+ // OpenGL surfaces can be ordered either above(default) or below the NSWindow.
+ const GLint order = qt_mac_resolveOption(1, "QT_MAC_OPENGL_SURFACE_ORDER");
+ [m_context setValues:&order forParameter:NSOpenGLCPSurfaceOrder];
+
updateSurfaceFormat();
}
diff --git a/src/plugins/platforms/cocoa/qcocoahelpers.h b/src/plugins/platforms/cocoa/qcocoahelpers.h
index 64e1640a69..419bf631aa 100644
--- a/src/plugins/platforms/cocoa/qcocoahelpers.h
+++ b/src/plugins/platforms/cocoa/qcocoahelpers.h
@@ -162,6 +162,39 @@ CGContextRef qt_mac_cg_context(QPaintDevice *pdev);
CGImageRef qt_mac_toCGImage(const QImage &qImage, bool isMask, uchar **dataCopy);
QImage qt_mac_toQImage(CGImageRef image);
+template<typename T>
+T qt_mac_resolveOption(const T &fallback, const QByteArray &environment)
+{
+ // check for environment variable
+ if (!environment.isEmpty()) {
+ QByteArray env = qgetenv(environment);
+ if (!env.isEmpty())
+ return T(env.toInt()); // works when T is bool, int.
+ }
+
+ return fallback;
+}
+
+template<typename T>
+T qt_mac_resolveOption(const T &fallback, QWindow *window, const QByteArray &property, const QByteArray &environment)
+{
+ // check for environment variable
+ if (!environment.isEmpty()) {
+ QByteArray env = qgetenv(environment);
+ if (!env.isEmpty())
+ return T(env.toInt()); // works when T is bool, int.
+ }
+
+ // check for window property
+ if (window && !property.isNull()) {
+ QVariant windowProperty = window->property(property);
+ if (windowProperty.isValid())
+ return windowProperty.value<T>();
+ }
+
+ // return default value.
+ return fallback;
+}
QT_END_NAMESPACE
#endif //QCOCOAHELPERS_H
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index d13c6a8a3f..b1a230479e 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -252,9 +252,15 @@ QCocoaWindow::QCocoaWindow(QWindow *tlw)
// problem, except if the appilcation wants to have a "custom" viewport.
// (like the hellogl example)
if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_7
- && tlw->surfaceType() == QSurface::OpenGLSurface)
- [m_contentView setWantsBestResolutionOpenGLSurface:YES];
+ && tlw->surfaceType() == QSurface::OpenGLSurface) {
+ BOOL enable = qt_mac_resolveOption(YES, tlw, "_q_mac_wantsBestResolutionOpenGLSurface",
+ "QT_MAC_WANTS_BEST_RESOLUTION_OPENGL_SURFACE");
+ [m_contentView setWantsBestResolutionOpenGLSurface:enable];
+ }
#endif
+ BOOL enable = qt_mac_resolveOption(NO, tlw, "_q_mac_wantsLayer",
+ "QT_MAC_WANTS_LAYER");
+ [m_contentView setWantsLayer:enable];
}
setGeometry(tlw->geometry());
recreateWindow(parent());