summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/windows
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/windows')
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.cpp2
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp44
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.h1
3 files changed, 47 insertions, 0 deletions
diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp
index 52950ecde5..7d4308d578 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.cpp
+++ b/src/plugins/platforms/windows/qwindowsintegration.cpp
@@ -265,6 +265,8 @@ bool QWindowsIntegration::hasCapability(QPlatformIntegration::Capability cap) co
return true;
# endif // QT_OPENGL_ES_2
#endif // !QT_NO_OPENGL
+ case WindowMasks:
+ return true;
default:
return QPlatformIntegration::hasCapability(cap);
}
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp
index e49b215422..aabea04c20 100644
--- a/src/plugins/platforms/windows/qwindowswindow.cpp
+++ b/src/plugins/platforms/windows/qwindowswindow.cpp
@@ -53,6 +53,7 @@
#include <QtGui/QGuiApplication>
#include <QtGui/QScreen>
#include <QtGui/QWindow>
+#include <QtGui/QRegion>
#include <private/qwindow_p.h>
#include <QtGui/QWindowSystemInterface>
@@ -1344,6 +1345,49 @@ void QWindowsWindow::setOpacity(qreal level)
}
}
+static inline HRGN createRectRegion(const QRect &r)
+{
+ return CreateRectRgn(r.left(), r.top(), r.x() + r.width(), r.y() + r.height());
+}
+
+static inline void addRectToWinRegion(const QRect &rect, HRGN *winRegion)
+{
+ if (const HRGN rectRegion = createRectRegion(rect)) {
+ HRGN result = CreateRectRgn(0, 0, 0, 0);
+ if (CombineRgn(result, *winRegion, rectRegion, RGN_OR)) {
+ DeleteObject(winRegion);
+ *winRegion = result;
+ }
+ DeleteObject(rectRegion);
+ }
+}
+
+static HRGN qRegionToWinRegion(const QRegion &region)
+{
+ const QVector<QRect> rects = region.rects();
+ if (rects.isEmpty())
+ return NULL;
+ const int rectCount = rects.size();
+ if (rectCount == 1)
+ return createRectRegion(region.boundingRect());
+ HRGN hRegion = createRectRegion(rects.front());
+ for (int i = 1; i < rectCount; ++i)
+ addRectToWinRegion(rects.at(i), &hRegion);
+ return hRegion;
+}
+
+void QWindowsWindow::setMask(const QRegion &region)
+{
+ if (region.isEmpty()) {
+ SetWindowRgn(m_data.hwnd, 0, true);
+ return;
+ }
+ const HRGN winRegion = qRegionToWinRegion(region);
+ // SetWindowRgn takes ownership.
+ if (!SetWindowRgn(m_data.hwnd, winRegion, true))
+ DeleteObject(winRegion);
+}
+
void QWindowsWindow::requestActivateWindow()
{
if (QWindowsContext::verboseWindows)
diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h
index 2fd401029e..743e10dff9 100644
--- a/src/plugins/platforms/windows/qwindowswindow.h
+++ b/src/plugins/platforms/windows/qwindowswindow.h
@@ -168,6 +168,7 @@ public:
virtual QMargins frameMargins() const;
virtual void setOpacity(qreal level);
+ virtual void setMask(const QRegion &region);
qreal opacity() const { return m_opacity; }
virtual void requestActivateWindow();