macOS: Track changes to our NSView's superview and window properties
As a start, we just log the changes, but going forward we can use this to report parent changes to QPA or get rid of old QNSWindows. Change-Id: Id3625fb0b7608d85240f58bdecc70a5892075da3 Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
This commit is contained in:
parent
5f49788e33
commit
1931aedcf8
@ -68,6 +68,8 @@
|
|||||||
// Private interface
|
// Private interface
|
||||||
@interface QT_MANGLE_NAMESPACE(QNSView) ()
|
@interface QT_MANGLE_NAMESPACE(QNSView) ()
|
||||||
- (BOOL)isTransparentForUserInput;
|
- (BOOL)isTransparentForUserInput;
|
||||||
|
@property (assign) NSView* previousSuperview;
|
||||||
|
@property (assign) NSWindow* previousWindow;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface QT_MANGLE_NAMESPACE(QNSView) (Drawing) <CALayerDelegate>
|
@interface QT_MANGLE_NAMESPACE(QNSView) (Drawing) <CALayerDelegate>
|
||||||
@ -153,6 +155,9 @@
|
|||||||
self.focusRingType = NSFocusRingTypeNone;
|
self.focusRingType = NSFocusRingTypeNone;
|
||||||
self.cursor = nil;
|
self.cursor = nil;
|
||||||
|
|
||||||
|
self.previousSuperview = nil;
|
||||||
|
self.previousWindow = nil;
|
||||||
|
|
||||||
[self initDrawing];
|
[self initDrawing];
|
||||||
[self registerDragTypes];
|
[self registerDragTypes];
|
||||||
|
|
||||||
@ -195,8 +200,40 @@
|
|||||||
return description;
|
return description;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------- Re-parenting ---------------------------------
|
||||||
|
|
||||||
|
- (void)removeFromSuperview
|
||||||
|
{
|
||||||
|
QMacAutoReleasePool pool;
|
||||||
|
[super removeFromSuperview];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)viewWillMoveToSuperview:(NSView *)newSuperview
|
||||||
|
{
|
||||||
|
Q_ASSERT(!self.previousSuperview);
|
||||||
|
self.previousSuperview = self.superview;
|
||||||
|
|
||||||
|
if (newSuperview == self.superview)
|
||||||
|
qCDebug(lcQpaWindow) << "Re-ordering" << self << "inside" << self.superview;
|
||||||
|
else
|
||||||
|
qCDebug(lcQpaWindow) << "Re-parenting" << self << "from" << self.superview << "to" << newSuperview;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)viewDidMoveToSuperview
|
- (void)viewDidMoveToSuperview
|
||||||
{
|
{
|
||||||
|
auto cleanup = qScopeGuard([&] { self.previousSuperview = nil; });
|
||||||
|
|
||||||
|
if (self.superview == self.previousSuperview) {
|
||||||
|
qCDebug(lcQpaWindow) << "Done re-ordering" << self << "new index:"
|
||||||
|
<< [self.superview.subviews indexOfObject:self];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
qCDebug(lcQpaWindow) << "Done re-parenting" << self << "into" << self.superview;
|
||||||
|
|
||||||
|
// Note: at this point the view's window property hasn't been updated to match the window
|
||||||
|
// of the new superview. We have to wait for viewDidMoveToWindow for that to be reflected.
|
||||||
|
|
||||||
if (!m_platformWindow)
|
if (!m_platformWindow)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -210,6 +247,36 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)viewWillMoveToWindow:(NSWindow *)newWindow
|
||||||
|
{
|
||||||
|
Q_ASSERT(!self.previousWindow);
|
||||||
|
self.previousWindow = self.window;
|
||||||
|
|
||||||
|
// This callback is documented to be called also when a view is just moved between
|
||||||
|
// subviews in the same NSWindow, so we're not necessarily moving between NSWindows.
|
||||||
|
if (newWindow == self.window)
|
||||||
|
return;
|
||||||
|
|
||||||
|
qCDebug(lcQpaWindow) << "Moving" << self << "from" << self.window << "to" << newWindow;
|
||||||
|
|
||||||
|
// Note: at this point the superview has already been updated, so we know which view inside
|
||||||
|
// the new window the view will be a child of.
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)viewDidMoveToWindow
|
||||||
|
{
|
||||||
|
auto cleanup = qScopeGuard([&] { self.previousWindow = nil; });
|
||||||
|
|
||||||
|
// This callback is documented to be called also when a view is just moved between
|
||||||
|
// subviews in the same NSWindow, so we're not necessarily moving between NSWindows.
|
||||||
|
if (self.window == self.previousWindow)
|
||||||
|
return;
|
||||||
|
|
||||||
|
qCDebug(lcQpaWindow) << "Done moving" << self << "to" << self.window;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
- (QWindow *)topLevelWindow
|
- (QWindow *)topLevelWindow
|
||||||
{
|
{
|
||||||
if (!m_platformWindow)
|
if (!m_platformWindow)
|
||||||
@ -239,12 +306,6 @@
|
|||||||
// viewDidUnhide so no reason to override it here.
|
// viewDidUnhide so no reason to override it here.
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)removeFromSuperview
|
|
||||||
{
|
|
||||||
QMacAutoReleasePool pool;
|
|
||||||
[super removeFromSuperview];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (BOOL)isTransparentForUserInput
|
- (BOOL)isTransparentForUserInput
|
||||||
{
|
{
|
||||||
return m_platformWindow->window() &&
|
return m_platformWindow->window() &&
|
||||||
|
Loading…
x
Reference in New Issue
Block a user