summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/ios/qiosscreen.mm
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2016-06-18 09:29:17 +0200
committerLiang Qi <liang.qi@qt.io>2016-06-20 08:00:26 +0200
commite32f1a4d61f0c55d066a43657ad607131be8ca34 (patch)
tree81ea388722187e1650b2c2b2d9c22eafae5c0527 /src/plugins/platforms/ios/qiosscreen.mm
parentfdb956a3ede6cb0a25112c1e1af6c93fd2051de1 (diff)
parentee2eed350f95285b65e3dd9647e5f366e16fd5a4 (diff)
Merge remote-tracking branch 'origin/5.6' into 5.7
And blacklisted a few tests in tst_QUdpSocket. Conflicts: src/android/jar/src/org/qtproject/qt5/android/QtNative.java src/corelib/global/qglobal.cpp src/corelib/global/qsystemdetection.h src/corelib/io/qfileselector.cpp src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp tests/auto/network/socket/qudpsocket/BLACKLIST Task-number: QTBUG-54205 Change-Id: I11dd1c90186eb1b847d45be87a26041f61d89ef6
Diffstat (limited to 'src/plugins/platforms/ios/qiosscreen.mm')
-rw-r--r--src/plugins/platforms/ios/qiosscreen.mm58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/plugins/platforms/ios/qiosscreen.mm b/src/plugins/platforms/ios/qiosscreen.mm
index bfd22abaa4..d53f0df846 100644
--- a/src/plugins/platforms/ios/qiosscreen.mm
+++ b/src/plugins/platforms/ios/qiosscreen.mm
@@ -46,10 +46,33 @@
#include "qiosviewcontroller.h"
#include "quiview.h"
+#include <QtGui/private/qwindow_p.h>
+
#include <sys/sysctl.h>
// -------------------------------------------------------------------------
+typedef void (^DisplayLinkBlock)(CADisplayLink *displayLink);
+
+@implementation UIScreen (DisplayLinkBlock)
+- (CADisplayLink*)displayLinkWithBlock:(DisplayLinkBlock)block
+{
+ return [self displayLinkWithTarget:[[block copy] autorelease]
+ selector:@selector(invokeDisplayLinkBlock:)];
+}
+@end
+
+@implementation NSObject (DisplayLinkBlock)
+- (void)invokeDisplayLinkBlock:(CADisplayLink *)sender
+{
+ DisplayLinkBlock block = static_cast<id>(self);
+ block(sender);
+}
+@end
+
+
+// -------------------------------------------------------------------------
+
static QIOSScreen* qtPlatformScreenFor(UIScreen *uiScreen)
{
foreach (QScreen *screen, QGuiApplication::screens()) {
@@ -214,10 +237,16 @@ QIOSScreen::QIOSScreen(UIScreen *screen)
}
updateProperties();
+
+ m_displayLink = [m_uiScreen displayLinkWithBlock:^(CADisplayLink *) { deliverUpdateRequests(); }];
+ m_displayLink.paused = YES; // Enabled when clients call QWindow::requestUpdate()
+ [m_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
QIOSScreen::~QIOSScreen()
{
+ [m_displayLink invalidate];
+
[m_orientationListener release];
[m_uiWindow release];
}
@@ -297,6 +326,35 @@ void QIOSScreen::updateProperties()
QWindowSystemInterface::handleScreenGeometryChange(screen(), m_geometry, m_availableGeometry);
}
+void QIOSScreen::setUpdatesPaused(bool paused)
+{
+ m_displayLink.paused = paused;
+}
+
+void QIOSScreen::deliverUpdateRequests() const
+{
+ bool pauseUpdates = true;
+
+ QList<QWindow*> windows = QGuiApplication::allWindows();
+ for (int i = 0; i < windows.size(); ++i) {
+ if (platformScreenForWindow(windows.at(i)) != this)
+ continue;
+
+ QWindowPrivate *wp = static_cast<QWindowPrivate *>(QObjectPrivate::get(windows.at(i)));
+ if (!wp->updateRequestPending)
+ continue;
+
+ wp->deliverUpdateRequest();
+
+ // Another update request was triggered, keep the display link running
+ if (wp->updateRequestPending)
+ pauseUpdates = false;
+ }
+
+ // Pause the display link if there are no pending update requests
+ m_displayLink.paused = pauseUpdates;
+}
+
QRect QIOSScreen::geometry() const
{
return m_geometry;