Revert "QWindow: Persist foreign winId to support destroy/create cycles"
This reverts commit 4d5aedac1de02ec21bc6f4ae8c66e1e7bfc665a4. It broke window activation on iOS somehow. Change-Id: I01fc476d23a65f39aa33d9abd06417ffcd13b5aa Task-number: QTBUG-125142 Reviewed-by: Jani Heikkinen <jani.heikkinen@qt.io>
This commit is contained in:
parent
3eb0c8007c
commit
c195fe7d33
@ -521,9 +521,7 @@ void QWindowPrivate::setTopLevelScreen(QScreen *newScreen, bool recreate)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr auto kForeignWindowId = "_q_foreignWinId";
|
void QWindowPrivate::create(bool recursive, WId nativeHandle)
|
||||||
|
|
||||||
void QWindowPrivate::create(bool recursive)
|
|
||||||
{
|
{
|
||||||
Q_Q(QWindow);
|
Q_Q(QWindow);
|
||||||
if (platformWindow)
|
if (platformWindow)
|
||||||
@ -551,8 +549,6 @@ void QWindowPrivate::create(bool recursive)
|
|||||||
setTopLevelScreen(screen, false);
|
setTopLevelScreen(screen, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
const WId nativeHandle = q->property(kForeignWindowId).value<WId>();
|
|
||||||
|
|
||||||
QPlatformIntegration *platformIntegration = QGuiApplicationPrivate::platformIntegration();
|
QPlatformIntegration *platformIntegration = QGuiApplicationPrivate::platformIntegration();
|
||||||
platformWindow = nativeHandle ? platformIntegration->createForeignWindow(q, nativeHandle)
|
platformWindow = nativeHandle ? platformIntegration->createForeignWindow(q, nativeHandle)
|
||||||
: platformIntegration->createPlatformWindow(q);
|
: platformIntegration->createPlatformWindow(q);
|
||||||
@ -2063,16 +2059,6 @@ void QWindowPrivate::destroy()
|
|||||||
QObject *object = childrenWindows.at(i);
|
QObject *object = childrenWindows.at(i);
|
||||||
if (object->isWindowType()) {
|
if (object->isWindowType()) {
|
||||||
QWindow *w = static_cast<QWindow*>(object);
|
QWindow *w = static_cast<QWindow*>(object);
|
||||||
auto *childPlatformWindow = w->handle();
|
|
||||||
if (!childPlatformWindow)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Decouple the foreign window from this window,
|
|
||||||
// so that destroying our native handle doesn't
|
|
||||||
// bring down the foreign window as well.
|
|
||||||
if (childPlatformWindow->isForeignWindow())
|
|
||||||
childPlatformWindow->setParent(nullptr);
|
|
||||||
|
|
||||||
qt_window_private(w)->destroy();
|
qt_window_private(w)->destroy();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3000,11 +2986,7 @@ QWindow *QWindow::fromWinId(WId id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
QWindow *window = new QWindow;
|
QWindow *window = new QWindow;
|
||||||
|
qt_window_private(window)->create(false, id);
|
||||||
// Persist the winId in a private property so that we
|
|
||||||
// can recreate the window after being destroyed.
|
|
||||||
window->setProperty(kForeignWindowId, id);
|
|
||||||
window->create();
|
|
||||||
|
|
||||||
if (!window->handle()) {
|
if (!window->handle()) {
|
||||||
delete window;
|
delete window;
|
||||||
|
@ -66,7 +66,7 @@ public:
|
|||||||
void updateSiblingPosition(SiblingPosition);
|
void updateSiblingPosition(SiblingPosition);
|
||||||
|
|
||||||
bool windowRecreationRequired(QScreen *newScreen) const;
|
bool windowRecreationRequired(QScreen *newScreen) const;
|
||||||
void create(bool recursive);
|
void create(bool recursive, WId nativeHandle = 0);
|
||||||
void destroy();
|
void destroy();
|
||||||
void setTopLevelScreen(QScreen *newScreen, bool recreate);
|
void setTopLevelScreen(QScreen *newScreen, bool recreate);
|
||||||
void connectToScreen(QScreen *topLevelScreen);
|
void connectToScreen(QScreen *topLevelScreen);
|
||||||
|
@ -55,7 +55,6 @@ QIOSWindow::QIOSWindow(QWindow *window, WId nativeHandle)
|
|||||||
|
|
||||||
connect(qGuiApp, &QGuiApplication::applicationStateChanged, this, &QIOSWindow::applicationStateChanged);
|
connect(qGuiApp, &QGuiApplication::applicationStateChanged, this, &QIOSWindow::applicationStateChanged);
|
||||||
|
|
||||||
if (QPlatformWindow::parent())
|
|
||||||
setParent(QPlatformWindow::parent());
|
setParent(QPlatformWindow::parent());
|
||||||
|
|
||||||
if (!isForeignWindow()) {
|
if (!isForeignWindow()) {
|
||||||
|
@ -1357,8 +1357,6 @@ QWindowsForeignWindow::QWindowsForeignWindow(QWindow *window, HWND hwnd)
|
|||||||
, m_hwnd(hwnd)
|
, m_hwnd(hwnd)
|
||||||
, m_topLevelStyle(0)
|
, m_topLevelStyle(0)
|
||||||
{
|
{
|
||||||
if (QPlatformWindow::parent())
|
|
||||||
setParent(QPlatformWindow::parent());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QWindowsForeignWindow::setParent(const QPlatformWindow *newParentWindow)
|
void QWindowsForeignWindow::setParent(const QPlatformWindow *newParentWindow)
|
||||||
|
@ -522,10 +522,6 @@ QXcbForeignWindow::QXcbForeignWindow(QWindow *window, WId nativeHandle)
|
|||||||
QRect nativeGeometry(geometry->x, geometry->y, geometry->width, geometry->height);
|
QRect nativeGeometry(geometry->x, geometry->y, geometry->width, geometry->height);
|
||||||
QPlatformWindow::setGeometry(nativeGeometry);
|
QPlatformWindow::setGeometry(nativeGeometry);
|
||||||
}
|
}
|
||||||
|
|
||||||
// And reparent, if we have a parent already
|
|
||||||
if (QPlatformWindow::parent())
|
|
||||||
setParent(QPlatformWindow::parent());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QXcbForeignWindow::~QXcbForeignWindow()
|
QXcbForeignWindow::~QXcbForeignWindow()
|
||||||
|
@ -26,9 +26,6 @@ private slots:
|
|||||||
|
|
||||||
void embedForeignWindow();
|
void embedForeignWindow();
|
||||||
void embedInForeignWindow();
|
void embedInForeignWindow();
|
||||||
|
|
||||||
void destroyExplicitly();
|
|
||||||
void destroyWhenParentIsDestroyed();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void tst_ForeignWindow::fromWinId()
|
void tst_ForeignWindow::fromWinId()
|
||||||
@ -141,50 +138,5 @@ void tst_ForeignWindow::embedInForeignWindow()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_ForeignWindow::destroyExplicitly()
|
|
||||||
{
|
|
||||||
NativeWindow nativeWindow;
|
|
||||||
QVERIFY(nativeWindow);
|
|
||||||
|
|
||||||
std::unique_ptr<QWindow> foreignWindow(QWindow::fromWinId(nativeWindow));
|
|
||||||
QVERIFY(foreignWindow->handle());
|
|
||||||
|
|
||||||
// Explicitly destroying a foreign window is a no-op, as
|
|
||||||
// the documentation claims that it "releases the native
|
|
||||||
// platform resources associated with this window.", which
|
|
||||||
// is not technically true for foreign windows.
|
|
||||||
auto *windowHandleBeforeDestroy = foreignWindow->handle();
|
|
||||||
foreignWindow->destroy();
|
|
||||||
QCOMPARE(foreignWindow->handle(), windowHandleBeforeDestroy);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tst_ForeignWindow::destroyWhenParentIsDestroyed()
|
|
||||||
{
|
|
||||||
QWindow parentWindow;
|
|
||||||
|
|
||||||
NativeWindow nativeWindow;
|
|
||||||
QVERIFY(nativeWindow);
|
|
||||||
|
|
||||||
std::unique_ptr<QWindow> foreignWindow(QWindow::fromWinId(nativeWindow));
|
|
||||||
foreignWindow->setParent(&parentWindow);
|
|
||||||
QTRY_COMPARE(nativeWindow.parentWinId(), parentWindow.winId());
|
|
||||||
|
|
||||||
// Reparenting into a window will result in creating it
|
|
||||||
QVERIFY(parentWindow.handle());
|
|
||||||
|
|
||||||
// Destroying the parent window of the foreign window results
|
|
||||||
// in destroying the foreign window as well, as the foreign
|
|
||||||
// window no longer has a parent it can be embedded in.
|
|
||||||
QVERIFY(foreignWindow->handle());
|
|
||||||
parentWindow.destroy();
|
|
||||||
QVERIFY(!foreignWindow->handle());
|
|
||||||
|
|
||||||
// But the foreign window can be recreated again, and will
|
|
||||||
// continue to be a native child of the parent window.
|
|
||||||
foreignWindow->create();
|
|
||||||
QVERIFY(foreignWindow->handle());
|
|
||||||
QTRY_COMPARE(nativeWindow.parentWinId(), parentWindow.winId());
|
|
||||||
}
|
|
||||||
|
|
||||||
#include <tst_foreignwindow.moc>
|
#include <tst_foreignwindow.moc>
|
||||||
QTEST_MAIN(tst_ForeignWindow)
|
QTEST_MAIN(tst_ForeignWindow)
|
||||||
|
@ -238,7 +238,7 @@ WId NativeWindow::parentWinId() const
|
|||||||
xcb_query_tree_reply_t *tree = xcb_query_tree_reply(
|
xcb_query_tree_reply_t *tree = xcb_query_tree_reply(
|
||||||
connection, xcb_query_tree(connection, m_handle), nullptr);
|
connection, xcb_query_tree(connection, m_handle), nullptr);
|
||||||
const auto cleanup = qScopeGuard([&]{ free(tree); });
|
const auto cleanup = qScopeGuard([&]{ free(tree); });
|
||||||
return tree ? tree->parent : 0;
|
return tree->parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NativeWindow::isParentOf(WId childWinId)
|
bool NativeWindow::isParentOf(WId childWinId)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user