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:
parent
04e4a09b85
commit
1b209ccd6d
@ -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();
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user