From bbb15b4612946851d7d81940a9cd6e3a3753c3f2 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 27 Jun 2012 17:15:42 +0300 Subject: [PATCH] Further fixes to widget masking If mask was set to a widget before the widget was shown, the mask was not applied. Also, if toplevel widgets were set a mask in Windows, the mask was applied to frame coordinates instead of client coordinates. Ported relevant code from Qt4 to fix these issues. Change-Id: Id6187cf4952b81b5b60c167e2fd284b7dc83ed9c Reviewed-by: Friedemann Kleint --- src/plugins/platforms/windows/qwindowswindow.cpp | 7 +++++++ src/widgets/kernel/qwidget_qpa.cpp | 3 +++ 2 files changed, 10 insertions(+) diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index a7140a3..2b86113 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -1392,6 +1392,13 @@ void QWindowsWindow::setMask(const QRegion ®ion) return; } const HRGN winRegion = qRegionToWinRegion(region); + + // Mask is in client area coordinates, so offset it in case we have a frame + if (window()->isTopLevel()) { + const QMargins margins = frameMargins(); + OffsetRgn(winRegion, margins.left(), margins.top()); + } + // SetWindowRgn takes ownership. if (!SetWindowRgn(m_data.hwnd, winRegion, true)) DeleteObject(winRegion); diff --git a/src/widgets/kernel/qwidget_qpa.cpp b/src/widgets/kernel/qwidget_qpa.cpp index 25d79fa..c524491 100644 --- a/src/widgets/kernel/qwidget_qpa.cpp +++ b/src/widgets/kernel/qwidget_qpa.cpp @@ -151,6 +151,9 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO // Check children and create windows for them if necessary q_createNativeChildrenAndSetParent(q); + if (extra && !extra->mask.isEmpty()) + setMask_sys(extra->mask); + // If widget is already shown, set window visible, too if (q->isVisible()) win->setVisible(true); -- 2.7.4