Windows QPA: Detect a SetParent into a native window and set isEmbedded
Detecting that a Qt window has been reparented into a native window and setting isEmbedded automatically. While there is no specific message for the change in the parent window, a WM_WINDOWPOSCHANGING message indicating a change in the Z order is sent. We can recognize an embedding condition by detecting that our QWindow does not have another QWindow as a parent, but the HWND associated with it has another HWND as a parent, which is not the desktop window. This change should cover the use case where a Qt-based plugin must return a HWND to a host application, where the host application will then reparent the HWND as it sees fit, outside of Qt control. Task-number: QTBUG-64116 Change-Id: Iec417c0dd55ad68eff1ea75bb6f5b5495489c31e Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
This commit is contained in:
parent
b8e352ad37
commit
04da027439
@ -2070,9 +2070,17 @@ void QWindowsWindow::propagateSizeHints()
|
|||||||
|
|
||||||
bool QWindowsWindow::handleGeometryChangingMessage(MSG *message, const QWindow *qWindow, const QMargins &margins)
|
bool QWindowsWindow::handleGeometryChangingMessage(MSG *message, const QWindow *qWindow, const QMargins &margins)
|
||||||
{
|
{
|
||||||
|
WINDOWPOS *windowPos = reinterpret_cast<WINDOWPOS *>(message->lParam);
|
||||||
|
if ((windowPos->flags & SWP_NOZORDER) == 0) {
|
||||||
|
if (QWindowsWindow *platformWindow = QWindowsWindow::windowsWindowOf(qWindow)) {
|
||||||
|
QWindow *parentWindow = qWindow->parent();
|
||||||
|
HWND parentHWND = GetAncestor(windowPos->hwnd, GA_PARENT);
|
||||||
|
HWND desktopHWND = GetDesktopWindow();
|
||||||
|
platformWindow->m_data.embedded = !parentWindow && parentHWND && (parentHWND != desktopHWND);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!qWindow->isTopLevel()) // Implement hasHeightForWidth().
|
if (!qWindow->isTopLevel()) // Implement hasHeightForWidth().
|
||||||
return false;
|
return false;
|
||||||
WINDOWPOS *windowPos = reinterpret_cast<WINDOWPOS *>(message->lParam);
|
|
||||||
if ((windowPos->flags & (SWP_NOCOPYBITS | SWP_NOSIZE)))
|
if ((windowPos->flags & (SWP_NOCOPYBITS | SWP_NOSIZE)))
|
||||||
return false;
|
return false;
|
||||||
const QRect suggestedFrameGeometry(windowPos->x, windowPos->y,
|
const QRect suggestedFrameGeometry(windowPos->x, windowPos->y,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user