Fix geometry handling for native child windows
Don't move the native child window position for native child windows. Initial-patch-by: Błażej Szczygieł <spaz16@wp.pl> Task-number: QTBUG-82312 Fixes: QTBUG-79166 Change-Id: I117ef08da13c8e90ff60cf034126c9efdc17b836 Reviewed-by: Błażej Szczygieł <mumei6102@gmail.com> Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io> Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
This commit is contained in:
parent
7447e2b337
commit
08d5059320
@ -1666,7 +1666,7 @@ void QWindow::setGeometry(const QRect &rect)
|
||||
if (newScreen && isTopLevel())
|
||||
nativeRect = QHighDpi::toNativePixels(rect, newScreen);
|
||||
else
|
||||
nativeRect = QHighDpi::toNativePixels(rect, this);
|
||||
nativeRect = QHighDpi::toNativeLocalPosition(rect, newScreen);
|
||||
d->platformWindow->setGeometry(nativeRect);
|
||||
} else {
|
||||
d->geometry = rect;
|
||||
@ -1717,8 +1717,12 @@ QScreen *QWindowPrivate::screenForGeometry(const QRect &newGeometry) const
|
||||
QRect QWindow::geometry() const
|
||||
{
|
||||
Q_D(const QWindow);
|
||||
if (d->platformWindow)
|
||||
return QHighDpi::fromNativePixels(d->platformWindow->geometry(), this);
|
||||
if (d->platformWindow) {
|
||||
const auto nativeGeometry = d->platformWindow->geometry();
|
||||
return isTopLevel()
|
||||
? QHighDpi::fromNativePixels(nativeGeometry, this)
|
||||
: QHighDpi::fromNativeLocalPosition(nativeGeometry, this);
|
||||
}
|
||||
return d->geometry;
|
||||
}
|
||||
|
||||
|
@ -296,14 +296,21 @@ QWindowSystemInterfacePrivate::GeometryChangeEvent::GeometryChangeEvent(QWindow
|
||||
, window(window)
|
||||
, newGeometry(newGeometry)
|
||||
{
|
||||
if (const QPlatformWindow *pw = window->handle())
|
||||
requestedGeometry = QHighDpi::fromNativePixels(pw->QPlatformWindow::geometry(), window);
|
||||
if (const QPlatformWindow *pw = window->handle()) {
|
||||
const auto nativeGeometry = pw->QPlatformWindow::geometry();
|
||||
requestedGeometry = window->isTopLevel()
|
||||
? QHighDpi::fromNativePixels(nativeGeometry, window)
|
||||
: QHighDpi::fromNativeLocalPosition(nativeGeometry, window);
|
||||
}
|
||||
}
|
||||
|
||||
QT_DEFINE_QPA_EVENT_HANDLER(void, handleGeometryChange, QWindow *window, const QRect &newRect)
|
||||
{
|
||||
Q_ASSERT(window);
|
||||
QWindowSystemInterfacePrivate::GeometryChangeEvent *e = new QWindowSystemInterfacePrivate::GeometryChangeEvent(window, QHighDpi::fromNativePixels(newRect, window));
|
||||
const auto newRectDi = window->isTopLevel()
|
||||
? QHighDpi::fromNativePixels(newRect, window)
|
||||
: QHighDpi::fromNativeLocalPosition(newRect, window);
|
||||
auto e = new QWindowSystemInterfacePrivate::GeometryChangeEvent(window, newRectDi);
|
||||
if (window->handle()) {
|
||||
// Persist the new geometry so that QWindow::geometry() can be queried in the resize event
|
||||
window->handle()->QPlatformWindow::setGeometry(newRect);
|
||||
|
@ -334,7 +334,9 @@ QPlatformWindow *QWindowsIntegration::createPlatformWindow(QWindow *window) cons
|
||||
|
||||
QWindowsWindowData requested;
|
||||
requested.flags = window->flags();
|
||||
requested.geometry = QHighDpi::toNativePixels(window->geometry(), window);
|
||||
requested.geometry = window->isTopLevel()
|
||||
? QHighDpi::toNativePixels(window->geometry(), window)
|
||||
: QHighDpi::toNativeLocalPosition(window->geometry(), window);
|
||||
// Apply custom margins (see QWindowsWindow::setCustomMargins())).
|
||||
const QVariant customMarginsV = window->property("_q_windowsCustomMargins");
|
||||
if (customMarginsV.isValid())
|
||||
|
@ -276,7 +276,9 @@ void QXcbWindow::create()
|
||||
|
||||
QXcbScreen *currentScreen = xcbScreen();
|
||||
QXcbScreen *platformScreen = parent() ? parentScreen() : initialScreen();
|
||||
QRect rect = QHighDpi::toNativePixels(window()->geometry(), platformScreen);
|
||||
QRect rect = parent()
|
||||
? QHighDpi::toNativeLocalPosition(window()->geometry(), platformScreen)
|
||||
: QHighDpi::toNativePixels(window()->geometry(), platformScreen);
|
||||
|
||||
if (type == Qt::Desktop) {
|
||||
m_window = platformScreen->root();
|
||||
|
Loading…
Reference in New Issue
Block a user