tst_foreignwindow: Add basic test of foreign window reparenting

Pick-to: 6.6
Change-Id: I008fad0f6527503a13ded4818eec5cb280f65cf4
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
This commit is contained in:
Tor Arne Vestbø 2023-08-02 12:22:28 +02:00
parent f50e295680
commit 546d4c9d33
2 changed files with 30 additions and 0 deletions

View File

@ -23,6 +23,8 @@ private slots:
void fromWinId();
void initialState();
void embedForeignWindow();
};
void tst_ForeignWindow::fromWinId()
@ -67,5 +69,22 @@ void tst_ForeignWindow::initialState()
QCOMPARE(foreignWindow->geometry(), initialGeometry);
}
void tst_ForeignWindow::embedForeignWindow()
{
// A foreign window embedded into a Qt UI requires that the rest of Qt
// is to be able to treat the foreign child window as any other window
// that it can show, hide, stack, and move around.
QWindow parentWindow;
NativeWindow nativeWindow;
QVERIFY(nativeWindow);
// As a prerequisite to that, we must be able to reparent the foreign window
std::unique_ptr<QWindow> foreignWindow(QWindow::fromWinId(nativeWindow));
foreignWindow.release()->setParent(&parentWindow);
QCOMPARE(nativeWindow.parentWinId(), parentWindow.winId());
}
#include <tst_foreignwindow.moc>
QTEST_MAIN(tst_ForeignWindow)

View File

@ -18,6 +18,7 @@ public:
~NativeWindow();
operator WId() const { return reinterpret_cast<WId>(m_handle); }
WId parentWinId() const;
void setGeometry(const QRect &rect);
QRect geometry() const;
@ -69,6 +70,11 @@ QRect NativeWindow::geometry() const
return QRectF::fromCGRect(m_handle.frame).toRect();
}
WId NativeWindow::parentWinId() const
{
return WId(m_handle.superview);
}
#elif defined(Q_OS_WIN)
NativeWindow::NativeWindow()
@ -107,6 +113,11 @@ QRect NativeWindow::geometry() const
return {};
}
WId NativeWindow::parentWinId() const
{
return WId(GetAncestor(m_handle, GA_PARENT));
}
#endif
#endif // NATIVEWINDOW_H