summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2024-05-08 09:42:08 +0000
committerThe Qt Project <gerrit-noreply@qt-project.org>2024-05-08 14:28:10 +0000
commitc195fe7d33decbd5ddd47ae46dbf8e0d9c20ba85 (patch)
tree9b7a0ce97c70e21b2db2c7206b7b9266707157aa
parent3eb0c8007c9a8423a8c3476c3c1091c284bb2e52 (diff)
Revert "QWindow: Persist foreign winId to support destroy/create cycles"v6.7.16.7.1
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>
-rw-r--r--src/gui/kernel/qwindow.cpp22
-rw-r--r--src/gui/kernel/qwindow_p.h2
-rw-r--r--src/plugins/platforms/ios/qioswindow.mm3
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp2
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp4
-rw-r--r--tests/auto/gui/kernel/qwindow/tst_foreignwindow.cpp48
-rw-r--r--tests/shared/nativewindow.h2
7 files changed, 5 insertions, 78 deletions
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index b40fd7e8e8..46a787e706 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -521,9 +521,7 @@ void QWindowPrivate::setTopLevelScreen(QScreen *newScreen, bool recreate)
}
}
-static constexpr auto kForeignWindowId = "_q_foreignWinId";
-
-void QWindowPrivate::create(bool recursive)
+void QWindowPrivate::create(bool recursive, WId nativeHandle)
{
Q_Q(QWindow);
if (platformWindow)
@@ -551,8 +549,6 @@ void QWindowPrivate::create(bool recursive)
setTopLevelScreen(screen, false);
}
- const WId nativeHandle = q->property(kForeignWindowId).value<WId>();
-
QPlatformIntegration *platformIntegration = QGuiApplicationPrivate::platformIntegration();
platformWindow = nativeHandle ? platformIntegration->createForeignWindow(q, nativeHandle)
: platformIntegration->createPlatformWindow(q);
@@ -2063,16 +2059,6 @@ void QWindowPrivate::destroy()
QObject *object = childrenWindows.at(i);
if (object->isWindowType()) {
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();
}
}
@@ -3000,11 +2986,7 @@ QWindow *QWindow::fromWinId(WId id)
}
QWindow *window = new QWindow;
-
- // Persist the winId in a private property so that we
- // can recreate the window after being destroyed.
- window->setProperty(kForeignWindowId, id);
- window->create();
+ qt_window_private(window)->create(false, id);
if (!window->handle()) {
delete window;
diff --git a/src/gui/kernel/qwindow_p.h b/src/gui/kernel/qwindow_p.h
index a9716847a1..1bcbda6b8f 100644
--- a/src/gui/kernel/qwindow_p.h
+++ b/src/gui/kernel/qwindow_p.h
@@ -66,7 +66,7 @@ public:
void updateSiblingPosition(SiblingPosition);
bool windowRecreationRequired(QScreen *newScreen) const;
- void create(bool recursive);
+ void create(bool recursive, WId nativeHandle = 0);
void destroy();
void setTopLevelScreen(QScreen *newScreen, bool recreate);
void connectToScreen(QScreen *topLevelScreen);
diff --git a/src/plugins/platforms/ios/qioswindow.mm b/src/plugins/platforms/ios/qioswindow.mm
index 6b1f603225..3631d6be70 100644
--- a/src/plugins/platforms/ios/qioswindow.mm
+++ b/src/plugins/platforms/ios/qioswindow.mm
@@ -55,8 +55,7 @@ QIOSWindow::QIOSWindow(QWindow *window, WId nativeHandle)
connect(qGuiApp, &QGuiApplication::applicationStateChanged, this, &QIOSWindow::applicationStateChanged);
- if (QPlatformWindow::parent())
- setParent(QPlatformWindow::parent());
+ setParent(QPlatformWindow::parent());
if (!isForeignWindow()) {
// Resolve default window geometry in case it was not set before creating the
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp
index c54da57ffe..220c36cc19 100644
--- a/src/plugins/platforms/windows/qwindowswindow.cpp
+++ b/src/plugins/platforms/windows/qwindowswindow.cpp
@@ -1357,8 +1357,6 @@ QWindowsForeignWindow::QWindowsForeignWindow(QWindow *window, HWND hwnd)
, m_hwnd(hwnd)
, m_topLevelStyle(0)
{
- if (QPlatformWindow::parent())
- setParent(QPlatformWindow::parent());
}
void QWindowsForeignWindow::setParent(const QPlatformWindow *newParentWindow)
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index d3e4fa9548..09d4cd9833 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -522,10 +522,6 @@ QXcbForeignWindow::QXcbForeignWindow(QWindow *window, WId nativeHandle)
QRect nativeGeometry(geometry->x, geometry->y, geometry->width, geometry->height);
QPlatformWindow::setGeometry(nativeGeometry);
}
-
- // And reparent, if we have a parent already
- if (QPlatformWindow::parent())
- setParent(QPlatformWindow::parent());
}
QXcbForeignWindow::~QXcbForeignWindow()
diff --git a/tests/auto/gui/kernel/qwindow/tst_foreignwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_foreignwindow.cpp
index 526abd6ea3..e7b05e7037 100644
--- a/tests/auto/gui/kernel/qwindow/tst_foreignwindow.cpp
+++ b/tests/auto/gui/kernel/qwindow/tst_foreignwindow.cpp
@@ -26,9 +26,6 @@ private slots:
void embedForeignWindow();
void embedInForeignWindow();
-
- void destroyExplicitly();
- void destroyWhenParentIsDestroyed();
};
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>
QTEST_MAIN(tst_ForeignWindow)
diff --git a/tests/shared/nativewindow.h b/tests/shared/nativewindow.h
index 957f84f949..6acb9b85d5 100644
--- a/tests/shared/nativewindow.h
+++ b/tests/shared/nativewindow.h
@@ -238,7 +238,7 @@ WId NativeWindow::parentWinId() const
xcb_query_tree_reply_t *tree = xcb_query_tree_reply(
connection, xcb_query_tree(connection, m_handle), nullptr);
const auto cleanup = qScopeGuard([&]{ free(tree); });
- return tree ? tree->parent : 0;
+ return tree->parent;
}
bool NativeWindow::isParentOf(WId childWinId)