summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/ios
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@digia.com>2015-01-19 14:49:04 +0100
committerTor Arne Vestbø <tor.arne.vestbo@theqtcompany.com>2015-01-23 19:47:58 +0100
commit1b209ccd6d21f1988d39134f1aa9b07d1af50259 (patch)
tree2eb453e36c94bff00be24b203ac10b5d99adfffd /src/plugins/platforms/ios
parent04e4a09b8567776a67bcc95a40aa70cee4248868 (diff)
iOS: Associate UIScreen and show UIWindow on initial QWindow mapping
We delay showing the UIWindow until the first QWindow is created and mapped to the screen. This allows external screens to stay in mirror mode until a QWindow has been explicitly created on that screen. We also remove the screen-association when the last QWindow on that screen has been removed, which will return the external screen to mirror mode. Change-Id: Iccecb297281d0c4f397f69f2494debff051ade01 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@theqtcompany.com>
Diffstat (limited to 'src/plugins/platforms/ios')
-rw-r--r--src/plugins/platforms/ios/qiosscreen.mm6
-rw-r--r--src/plugins/platforms/ios/qiosviewcontroller.mm50
2 files changed, 43 insertions, 13 deletions
diff --git a/src/plugins/platforms/ios/qiosscreen.mm b/src/plugins/platforms/ios/qiosscreen.mm
index 2389796e58..48be7fc906 100644
--- a/src/plugins/platforms/ios/qiosscreen.mm
+++ b/src/plugins/platforms/ios/qiosscreen.mm
@@ -208,12 +208,6 @@ QIOSScreen::QIOSScreen(UIScreen *screen)
// Create a window and associated view-controller that we can use
m_uiWindow = [[UIWindow alloc] initWithFrame:[m_uiScreen bounds]];
m_uiWindow.rootViewController = [[[QIOSViewController alloc] initWithQIOSScreen:this] autorelease];
-
- // FIXME: Only do once windows are added to the screen, and for any screen
- if (screen == [UIScreen mainScreen]) {
- m_uiWindow.screen = m_uiScreen;
- m_uiWindow.hidden = NO;
- }
}
updateProperties();
diff --git a/src/plugins/platforms/ios/qiosviewcontroller.mm b/src/plugins/platforms/ios/qiosviewcontroller.mm
index ea81033e43..84d6628a8a 100644
--- a/src/plugins/platforms/ios/qiosviewcontroller.mm
+++ b/src/plugins/platforms/ios/qiosviewcontroller.mm
@@ -56,11 +56,54 @@
// -------------------------------------------------------------------------
+@interface QIOSViewController () {
+ @public
+ QIOSScreen *m_screen;
+ BOOL m_updatingProperties;
+}
+@property (nonatomic, assign) BOOL changingOrientation;
+@end
+
+// -------------------------------------------------------------------------
+
@interface QIOSDesktopManagerView : UIView
@end
@implementation QIOSDesktopManagerView
+- (void)didAddSubview:(UIView *)subview
+{
+ Q_UNUSED(subview);
+
+ QIOSScreen *screen = self.qtViewController->m_screen;
+
+ // The 'window' property of our view is not valid until the window
+ // has been shown, so we have to access it through the QIOSScreen.
+ UIWindow *uiWindow = screen->uiWindow();
+
+ if (uiWindow.hidden) {
+ // Associate UIWindow to screen and show it the first time a QWindow
+ // is mapped to the screen. For external screens this means disabling
+ // mirroring mode and presenting alternate content on the screen.
+ uiWindow.screen = screen->uiScreen();
+ uiWindow.hidden = NO;
+ }
+}
+
+- (void)willRemoveSubview:(UIView *)subview
+{
+ Q_UNUSED(subview);
+
+ Q_ASSERT(self.window);
+ UIWindow *uiWindow = self.window;
+
+ if (uiWindow.screen != [UIScreen mainScreen] && self.subviews.count == 1) {
+ // Removing the last view of an external screen, go back to mirror mode
+ uiWindow.screen = nil;
+ uiWindow.hidden = YES;
+ }
+}
+
- (void)layoutSubviews
{
for (int i = int(self.subviews.count) - 1; i >= 0; --i) {
@@ -125,13 +168,6 @@
// -------------------------------------------------------------------------
-@interface QIOSViewController () {
- QIOSScreen *m_screen;
- BOOL m_updatingProperties;
-}
-@property (nonatomic, assign) BOOL changingOrientation;
-@end
-
@implementation QIOSViewController
- (id)initWithQIOSScreen:(QIOSScreen *)screen