diff options
author | Liang Qi <liang.qi@qt.io> | 2016-06-20 14:09:00 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2016-06-21 08:39:41 +0200 |
commit | ea438b2508f329698e11c6dae6994d441c6e67df (patch) | |
tree | 7a6052b98ba1ff6e0258c52cfc2726e197f53dd2 /src/plugins/platforms/ios/qiosscreen.mm | |
parent | a2f319e9fb2f7595fc16d0d79e26438463051a53 (diff) | |
parent | 5f0ec7305e4310123ddeb98d3523087e3c560d9c (diff) |
Merge remote-tracking branch 'origin/5.7' into dev
Conflicts:
src/corelib/global/qglobal.cpp
src/corelib/global/qsysinfo.h
src/corelib/kernel/qcoreapplication_win.cpp
src/gui/text/qdistancefield.cpp
src/gui/text/qdistancefield_p.h
src/plugins/platforms/windows/qwindowsglcontext.cpp
src/plugins/platforms/windows/qwindowsglcontext.h
Change-Id: Ib3500acc2b28553bde06758cd9a2e19eb7fe2978
Diffstat (limited to 'src/plugins/platforms/ios/qiosscreen.mm')
-rw-r--r-- | src/plugins/platforms/ios/qiosscreen.mm | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/plugins/platforms/ios/qiosscreen.mm b/src/plugins/platforms/ios/qiosscreen.mm index 246f04b8dc..ae3a84ce67 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()) { @@ -218,10 +241,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]; } @@ -304,6 +333,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; |