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>
This commit is contained in:
Tor Arne Vestbø 2015-01-19 14:49:04 +01:00 committed by Tor Arne Vestbø
parent 04e4a09b85
commit 1b209ccd6d
2 changed files with 43 additions and 13 deletions

View File

@ -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();

View File

@ -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