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 <Friedemann.Kleint@nokia.com>
This commit is contained in:
parent
4dd2de9c76
commit
bbb15b4612
@ -1392,6 +1392,13 @@ void QWindowsWindow::setMask(const QRegion ®ion)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const HRGN winRegion = qRegionToWinRegion(region);
|
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.
|
// SetWindowRgn takes ownership.
|
||||||
if (!SetWindowRgn(m_data.hwnd, winRegion, true))
|
if (!SetWindowRgn(m_data.hwnd, winRegion, true))
|
||||||
DeleteObject(winRegion);
|
DeleteObject(winRegion);
|
||||||
|
@ -151,6 +151,9 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
|
|||||||
// Check children and create windows for them if necessary
|
// Check children and create windows for them if necessary
|
||||||
q_createNativeChildrenAndSetParent(q);
|
q_createNativeChildrenAndSetParent(q);
|
||||||
|
|
||||||
|
if (extra && !extra->mask.isEmpty())
|
||||||
|
setMask_sys(extra->mask);
|
||||||
|
|
||||||
// If widget is already shown, set window visible, too
|
// If widget is already shown, set window visible, too
|
||||||
if (q->isVisible())
|
if (q->isVisible())
|
||||||
win->setVisible(true);
|
win->setVisible(true);
|
||||||
|
Loading…
Reference in New Issue
Block a user