summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/winrt
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/winrt')
-rw-r--r--src/plugins/platforms/winrt/qwinrtbackingstore.cpp14
-rw-r--r--src/plugins/platforms/winrt/qwinrteglcontext.cpp68
-rw-r--r--src/plugins/platforms/winrt/qwinrtintegration.cpp3
-rw-r--r--src/plugins/platforms/winrt/qwinrtscreen.cpp132
-rw-r--r--src/plugins/platforms/winrt/qwinrttheme.cpp185
-rw-r--r--src/plugins/platforms/winrt/qwinrtwindow.cpp3
-rw-r--r--src/plugins/platforms/winrt/winrt.pro2
7 files changed, 311 insertions, 96 deletions
diff --git a/src/plugins/platforms/winrt/qwinrtbackingstore.cpp b/src/plugins/platforms/winrt/qwinrtbackingstore.cpp
index dcf8239538..4517200a2d 100644
--- a/src/plugins/platforms/winrt/qwinrtbackingstore.cpp
+++ b/src/plugins/platforms/winrt/qwinrtbackingstore.cpp
@@ -42,8 +42,8 @@
#include <QtGui/QOpenGLContext>
#include <QtGui/QOpenGLFramebufferObject>
-#include <GLES3/gl3.h>
-#include <GLES3/gl3ext.h>
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
QT_BEGIN_NAMESPACE
@@ -66,7 +66,8 @@ QWinRTBackingStore::QWinRTBackingStore(QWindow *window)
d->initialized = false;
d->screen = static_cast<QWinRTScreen*>(window->screen()->handle());
- window->setSurfaceType(QSurface::OpenGLSurface); // Required for flipping, but could be done in the swap
+ if (window->surfaceType() == QSurface::RasterSurface)
+ window->setSurfaceType(QSurface::OpenGLSurface);
}
bool QWinRTBackingStore::initialize()
@@ -78,7 +79,6 @@ bool QWinRTBackingStore::initialize()
d->context.reset(new QOpenGLContext);
QSurfaceFormat format = window()->requestedFormat();
- format.setVersion(3, 0); // Required for ES3 framebuffer blit
d->context->setFormat(format);
d->context->setScreen(window()->screen());
if (!d->context->create())
@@ -121,13 +121,13 @@ void QWinRTBackingStore::flush(QWindow *window, const QRegion &region, const QPo
GL_RGBA, GL_UNSIGNED_BYTE, d->paintDevice.constScanLine(bounds.y()));
glBindTexture(GL_TEXTURE_2D, 0);
- glBindFramebuffer(GL_READ_FRAMEBUFFER, d->fbo->handle());
- glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
+ glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, d->fbo->handle());
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, 0);
const int y1 = bounds.y();
const int y2 = y1 + bounds.height();
const int x1 = bounds.x();
const int x2 = x1 + bounds.width();
- glBlitFramebuffer(x1, y1, x2, y2,
+ glBlitFramebufferANGLE(x1, y1, x2, y2,
x1, d->size.height() - y1, x2, d->size.height() - y2,
GL_COLOR_BUFFER_BIT, GL_NEAREST);
diff --git a/src/plugins/platforms/winrt/qwinrteglcontext.cpp b/src/plugins/platforms/winrt/qwinrteglcontext.cpp
index 9cb45336d6..3fd0278360 100644
--- a/src/plugins/platforms/winrt/qwinrteglcontext.cpp
+++ b/src/plugins/platforms/winrt/qwinrteglcontext.cpp
@@ -40,6 +40,8 @@
#include <functional>
+#include <d3d11.h>
+
#include <EGL/egl.h>
#define EGL_EGLEXT_PROTOTYPES
#include <EGL/eglext.h>
@@ -49,13 +51,30 @@
QT_BEGIN_NAMESPACE
+struct WinRTEGLDisplay
+{
+ WinRTEGLDisplay() {
+ eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ if (eglDisplay == EGL_NO_DISPLAY)
+ qCritical("Failed to initialize EGL display: 0x%x", eglGetError());
+ }
+ ~WinRTEGLDisplay() {
+ eglTerminate(eglDisplay);
+ }
+
+ EGLDisplay eglDisplay;
+};
+
+Q_GLOBAL_STATIC(WinRTEGLDisplay, g)
+
class QWinRTEGLContextPrivate
{
public:
+ QWinRTEGLContextPrivate() : eglContext(EGL_NO_CONTEXT), eglShareContext(EGL_NO_CONTEXT) { }
QSurfaceFormat format;
- EGLDisplay eglDisplay;
EGLConfig eglConfig;
EGLContext eglContext;
+ EGLContext eglShareContext;
};
QWinRTEGLContext::QWinRTEGLContext(QOpenGLContext *context)
@@ -64,30 +83,44 @@ QWinRTEGLContext::QWinRTEGLContext(QOpenGLContext *context)
Q_D(QWinRTEGLContext);
d->format = context->format();
d->format.setRenderableType(QSurfaceFormat::OpenGLES);
+ if (QPlatformOpenGLContext *shareHandle = context->shareHandle())
+ d->eglShareContext = static_cast<QWinRTEGLContext *>(shareHandle)->d_ptr->eglContext;
}
QWinRTEGLContext::~QWinRTEGLContext()
{
Q_D(QWinRTEGLContext);
if (d->eglContext != EGL_NO_CONTEXT)
- eglDestroyContext(d->eglDisplay, d->eglContext);
- if (d->eglDisplay != EGL_NO_DISPLAY)
- eglTerminate(d->eglDisplay);
+ eglDestroyContext(g->eglDisplay, d->eglContext);
}
void QWinRTEGLContext::initialize()
{
Q_D(QWinRTEGLContext);
+ // Test if the hardware supports at least level 9_3
+ D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_9_3 }; // minimum feature level
+ HRESULT hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, featureLevels, 1,
+ D3D11_SDK_VERSION, nullptr, nullptr, nullptr);
+ EGLint deviceType = SUCCEEDED(hr) ? EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE
+ : EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE;
+
eglBindAPI(EGL_OPENGL_ES_API);
- d->eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
- if (d->eglDisplay == EGL_NO_DISPLAY)
+
+ const EGLint displayAttributes[] = {
+ EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE,
+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, deviceType,
+ EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE, true,
+ EGL_NONE,
+ };
+ g->eglDisplay = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, displayAttributes);
+ if (g->eglDisplay == EGL_NO_DISPLAY)
qCritical("Failed to initialize EGL display: 0x%x", eglGetError());
- if (!eglInitialize(d->eglDisplay, nullptr, nullptr))
+ if (!eglInitialize(g->eglDisplay, nullptr, nullptr))
qCritical("Failed to initialize EGL: 0x%x", eglGetError());
- d->eglConfig = q_configFromGLFormat(d->eglDisplay, d->format);
+ d->eglConfig = q_configFromGLFormat(g->eglDisplay, d->format);
const EGLint flags = d->format.testOption(QSurfaceFormat::DebugContext)
? EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR : 0;
@@ -97,7 +130,7 @@ void QWinRTEGLContext::initialize()
EGL_CONTEXT_FLAGS_KHR, flags,
EGL_NONE
};
- d->eglContext = eglCreateContext(d->eglDisplay, d->eglConfig, nullptr, attributes);
+ d->eglContext = eglCreateContext(g->eglDisplay, d->eglConfig, d->eglShareContext, attributes);
if (d->eglContext == EGL_NO_CONTEXT) {
qWarning("QEGLPlatformContext: Failed to create context: %x", eglGetError());
return;
@@ -107,41 +140,40 @@ void QWinRTEGLContext::initialize()
bool QWinRTEGLContext::makeCurrent(QPlatformSurface *windowSurface)
{
Q_D(QWinRTEGLContext);
- Q_ASSERT(windowSurface->surface()->surfaceType() == QSurface::OpenGLSurface);
+ Q_ASSERT(windowSurface->surface()->supportsOpenGL());
QWinRTWindow *window = static_cast<QWinRTWindow *>(windowSurface);
if (window->eglSurface() == EGL_NO_SURFACE)
- window->createEglSurface(d->eglDisplay, d->eglConfig);
+ window->createEglSurface(g->eglDisplay, d->eglConfig);
EGLSurface surface = window->eglSurface();
if (surface == EGL_NO_SURFACE)
return false;
- const bool ok = eglMakeCurrent(d->eglDisplay, surface, surface, d->eglContext);
+ const bool ok = eglMakeCurrent(g->eglDisplay, surface, surface, d->eglContext);
if (!ok) {
qWarning("QEGLPlatformContext: eglMakeCurrent failed: %x", eglGetError());
return false;
}
- eglSwapInterval(d->eglDisplay, d->format.swapInterval());
+ eglSwapInterval(g->eglDisplay, d->format.swapInterval());
return true;
}
void QWinRTEGLContext::doneCurrent()
{
- Q_D(const QWinRTEGLContext);
- const bool ok = eglMakeCurrent(d->eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+ const bool ok = eglMakeCurrent(g->eglDisplay, EGL_NO_SURFACE,
+ EGL_NO_SURFACE, EGL_NO_CONTEXT);
if (!ok)
qWarning("QEGLPlatformContext: eglMakeCurrent failed: %x", eglGetError());
}
void QWinRTEGLContext::swapBuffers(QPlatformSurface *windowSurface)
{
- Q_D(QWinRTEGLContext);
- Q_ASSERT(windowSurface->surface()->surfaceType() == QSurface::OpenGLSurface);
+ Q_ASSERT(windowSurface->surface()->supportsOpenGL());
const QWinRTWindow *window = static_cast<QWinRTWindow *>(windowSurface);
- eglSwapBuffers(d->eglDisplay, window->eglSurface());
+ eglSwapBuffers(g->eglDisplay, window->eglSurface());
}
QSurfaceFormat QWinRTEGLContext::format() const
diff --git a/src/plugins/platforms/winrt/qwinrtintegration.cpp b/src/plugins/platforms/winrt/qwinrtintegration.cpp
index 7ee3bf8593..23bb6c16ec 100644
--- a/src/plugins/platforms/winrt/qwinrtintegration.cpp
+++ b/src/plugins/platforms/winrt/qwinrtintegration.cpp
@@ -134,10 +134,10 @@ QWinRTIntegration::QWinRTIntegration() : d_ptr(new QWinRTIntegrationPrivate)
QEventDispatcherWinRT::runOnXamlThread([d]() {
d->mainScreen = new QWinRTScreen;
+ d->inputContext.reset(new QWinRTInputContext(d->mainScreen));
return S_OK;
});
- d->inputContext.reset(new QWinRTInputContext(d->mainScreen));
screenAdded(d->mainScreen);
d->platformServices = new QWinRTServices;
}
@@ -188,6 +188,7 @@ bool QWinRTIntegration::hasCapability(QPlatformIntegration::Capability cap) cons
case ApplicationState:
case NonFullScreenWindows:
case MultipleWindows:
+ case RasterGLSurface:
return true;
default:
return QPlatformIntegration::hasCapability(cap);
diff --git a/src/plugins/platforms/winrt/qwinrtscreen.cpp b/src/plugins/platforms/winrt/qwinrtscreen.cpp
index 0fe3262398..8ba71d88e7 100644
--- a/src/plugins/platforms/winrt/qwinrtscreen.cpp
+++ b/src/plugins/platforms/winrt/qwinrtscreen.cpp
@@ -89,6 +89,27 @@ typedef ITypedEventHandler<StatusBar*, IInspectable*> StatusBarHandler;
QT_BEGIN_NAMESPACE
+struct KeyInfo {
+ KeyInfo()
+ : virtualKey(0)
+ {
+ }
+
+ KeyInfo(const QString &text, quint32 virtualKey)
+ : text(text)
+ , virtualKey(virtualKey)
+ {
+ }
+
+ KeyInfo(quint32 virtualKey)
+ : virtualKey(virtualKey)
+ {
+ }
+
+ QString text;
+ quint32 virtualKey;
+};
+
static inline Qt::ScreenOrientations qtOrientationsFromNative(DisplayOrientations native)
{
Qt::ScreenOrientations orientations = Qt::PrimaryOrientation;
@@ -435,10 +456,7 @@ public:
Qt::ScreenOrientation nativeOrientation;
Qt::ScreenOrientation orientation;
QList<QWindow *> visibleWindows;
-#ifndef Q_OS_WINPHONE
- QHash<quint32, QPair<Qt::Key, QString>> activeKeys;
-#endif
-
+ QHash<Qt::Key, KeyInfo> activeKeys;
QHash<CoreWindowCallbackRemover, EventRegistrationToken> windowTokens;
QHash<DisplayCallbackRemover, EventRegistrationToken> displayTokens;
#ifdef Q_OS_WINPHONE
@@ -827,57 +845,94 @@ void QWinRTScreen::handleExpose()
HRESULT QWinRTScreen::onKeyDown(ABI::Windows::UI::Core::ICoreWindow *, ABI::Windows::UI::Core::IKeyEventArgs *args)
{
+ Q_D(QWinRTScreen);
VirtualKey virtualKey;
- args->get_VirtualKey(&virtualKey);
+ HRESULT hr = args->get_VirtualKey(&virtualKey);
+ Q_ASSERT_SUCCEEDED(hr);
+ CorePhysicalKeyStatus status;
+ hr = args->get_KeyStatus(&status);
+ Q_ASSERT_SUCCEEDED(hr);
+
Qt::Key key = qKeyFromVirtual(virtualKey);
// Defer character key presses to onCharacterReceived
- if (key == Qt::Key_unknown || (key >= Qt::Key_Space && key <= Qt::Key_ydiaeresis))
+ if (key == Qt::Key_unknown || (key >= Qt::Key_Space && key <= Qt::Key_ydiaeresis)) {
+ d->activeKeys.insert(key, KeyInfo(virtualKey));
return S_OK;
- QWindowSystemInterface::handleKeyEvent(topWindow(), QEvent::KeyPress, key, keyboardModifiers());
+ }
+
+ QWindowSystemInterface::handleExtendedKeyEvent(
+ topWindow(),
+ QEvent::KeyPress,
+ key,
+ keyboardModifiers(),
+ !status.ScanCode ? -1 : status.ScanCode,
+ virtualKey,
+ 0,
+ QString(),
+ status.RepeatCount > 1,
+ !status.RepeatCount ? 1 : status.RepeatCount,
+ false);
return S_OK;
}
HRESULT QWinRTScreen::onKeyUp(ABI::Windows::UI::Core::ICoreWindow *, ABI::Windows::UI::Core::IKeyEventArgs *args)
{
- Qt::KeyboardModifiers mods = keyboardModifiers();
-#ifndef Q_OS_WINPHONE
Q_D(QWinRTScreen);
- CorePhysicalKeyStatus status; // Look for a pressed character key
- if (SUCCEEDED(args->get_KeyStatus(&status)) && d->activeKeys.contains(status.ScanCode)) {
- QPair<Qt::Key, QString> keyStatus = d->activeKeys.take(status.ScanCode);
- QWindowSystemInterface::handleKeyEvent(topWindow(), QEvent::KeyRelease,
- keyStatus.first, mods, keyStatus.second);
- return S_OK;
- }
-#endif // !Q_OS_WINPHONE
VirtualKey virtualKey;
- args->get_VirtualKey(&virtualKey);
- QWindowSystemInterface::handleKeyEvent(topWindow(), QEvent::KeyRelease,
- qKeyFromVirtual(virtualKey), mods);
+ HRESULT hr = args->get_VirtualKey(&virtualKey);
+ Q_ASSERT_SUCCEEDED(hr);
+ CorePhysicalKeyStatus status;
+ hr = args->get_KeyStatus(&status);
+ Q_ASSERT_SUCCEEDED(hr);
+
+ Qt::Key key = qKeyFromVirtual(virtualKey);
+ const KeyInfo info = d->activeKeys.take(key);
+ QWindowSystemInterface::handleExtendedKeyEvent(
+ topWindow(),
+ QEvent::KeyRelease,
+ key,
+ keyboardModifiers(),
+ !status.ScanCode ? -1 : status.ScanCode,
+ virtualKey,
+ 0,
+ info.text,
+ status.RepeatCount > 1,
+ !status.RepeatCount ? 1 : status.RepeatCount,
+ false);
return S_OK;
}
HRESULT QWinRTScreen::onCharacterReceived(ICoreWindow *, ICharacterReceivedEventArgs *args)
{
+ Q_D(QWinRTScreen);
quint32 keyCode;
- args->get_KeyCode(&keyCode);
+ HRESULT hr = args->get_KeyCode(&keyCode);
+ Q_ASSERT_SUCCEEDED(hr);
+ CorePhysicalKeyStatus status;
+ hr = args->get_KeyStatus(&status);
+ Q_ASSERT_SUCCEEDED(hr);
+
// Don't generate character events for non-printables; the meta key stage is enough
if (qIsNonPrintable(keyCode))
return S_OK;
- Qt::KeyboardModifiers mods = keyboardModifiers();
- Qt::Key key = qKeyFromCode(keyCode, mods);
- QString text = QChar(keyCode);
- QWindowSystemInterface::handleKeyEvent(topWindow(), QEvent::KeyPress, key, mods, text);
-#ifndef Q_OS_WINPHONE
- Q_D(QWinRTScreen);
- CorePhysicalKeyStatus status; // Defer release to onKeyUp for physical keys
- if (SUCCEEDED(args->get_KeyStatus(&status)) && !status.IsKeyReleased) {
- d->activeKeys.insert(status.ScanCode, qMakePair(key, text));
- return S_OK;
- }
-#endif // !Q_OS_WINPHONE
- QWindowSystemInterface::handleKeyEvent(topWindow(), QEvent::KeyRelease, key, mods, text);
+ const Qt::KeyboardModifiers modifiers = keyboardModifiers();
+ const Qt::Key key = qKeyFromCode(keyCode, modifiers);
+ const QString text = QChar(keyCode);
+ const quint32 virtualKey = d->activeKeys.value(key).virtualKey;
+ QWindowSystemInterface::handleExtendedKeyEvent(
+ topWindow(),
+ QEvent::KeyPress,
+ key,
+ modifiers,
+ !status.ScanCode ? -1 : status.ScanCode,
+ virtualKey,
+ 0,
+ text,
+ status.RepeatCount > 1,
+ !status.RepeatCount ? 1 : status.RepeatCount,
+ false);
+ d->activeKeys.insert(key, KeyInfo(text, virtualKey));
return S_OK;
}
@@ -914,6 +969,11 @@ HRESULT QWinRTScreen::onPointerUpdated(ICoreWindow *, IPointerEventArgs *args)
Point point;
pointerPoint->get_Position(&point);
QPointF pos(point.X * d->scaleFactor, point.Y * d->scaleFactor);
+ QPointF localPos = pos;
+ if (topWindow()) {
+ const QPointF globalPosDelta = pos - pos.toPoint();
+ localPos = topWindow()->mapFromGlobal(pos.toPoint()) + globalPosDelta;
+ }
VirtualKeyModifiers modifiers;
args->get_KeyModifiers(&modifiers);
@@ -947,7 +1007,7 @@ HRESULT QWinRTScreen::onPointerUpdated(ICoreWindow *, IPointerEventArgs *args)
boolean isHorizontal;
properties->get_IsHorizontalMouseWheel(&isHorizontal);
QPoint angleDelta(isHorizontal ? delta : 0, isHorizontal ? 0 : delta);
- QWindowSystemInterface::handleWheelEvent(topWindow(), pos, pos, QPoint(), angleDelta, mods);
+ QWindowSystemInterface::handleWheelEvent(topWindow(), localPos, pos, QPoint(), angleDelta, mods);
break;
}
@@ -973,7 +1033,7 @@ HRESULT QWinRTScreen::onPointerUpdated(ICoreWindow *, IPointerEventArgs *args)
if (isPressed)
buttons |= Qt::XButton2;
- QWindowSystemInterface::handleMouseEvent(topWindow(), pos, pos, buttons, mods);
+ QWindowSystemInterface::handleMouseEvent(topWindow(), localPos, pos, buttons, mods);
break;
}
diff --git a/src/plugins/platforms/winrt/qwinrttheme.cpp b/src/plugins/platforms/winrt/qwinrttheme.cpp
index c32ec8a151..7d09551f5b 100644
--- a/src/plugins/platforms/winrt/qwinrttheme.cpp
+++ b/src/plugins/platforms/winrt/qwinrttheme.cpp
@@ -44,7 +44,13 @@
#include <wrl.h>
#include <windows.ui.h>
#include <windows.ui.viewmanagement.h>
+#if _MSC_VER >= 1900
+#include <windows.foundation.metadata.h>
+using namespace ABI::Windows::Foundation::Metadata;
+#endif
+
using namespace Microsoft::WRL;
+using namespace Microsoft::WRL::Wrappers;
using namespace ABI::Windows::UI;
using namespace ABI::Windows::UI::ViewManagement;
@@ -73,102 +79,215 @@ static inline QColor fromColor(const Color &color)
return QColor(color.R, color.G, color.B, color.A);
}
-QWinRTTheme::QWinRTTheme()
- : d_ptr(new QWinRTThemePrivate)
+#if _MSC_VER >= 1900
+static bool uiColorSettings(const wchar_t *value, UIElementType type, Color *color)
{
- Q_D(QWinRTTheme);
+ static ComPtr<IApiInformationStatics> apiInformationStatics;
+ HRESULT hr;
+ if (!apiInformationStatics) {
+ hr = RoGetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Foundation_Metadata_ApiInformation).Get(),
+ IID_PPV_ARGS(&apiInformationStatics));
+ RETURN_FALSE_IF_FAILED("Could not get ApiInformationStatics");
+ }
+
+ static const HStringReference enumRef(L"Windows.UI.ViewManagement.UIElementType");
+ HStringReference valueRef(value);
+
+ boolean exists;
+ hr = apiInformationStatics->IsEnumNamedValuePresent(enumRef.Get(), valueRef.Get(), &exists);
+
+ if (hr != S_OK || !exists)
+ return false;
+
+ return SUCCEEDED(uiSettings()->UIElementColor(type, color));
+}
+
+static void nativeColorSettings(QPalette &p)
+{
+ Color color;
+
+ if (uiColorSettings(L"ActiveCaption", UIElementType_ActiveCaption, &color))
+ p.setColor(QPalette::ToolTipBase, fromColor(color));
+
+ if (uiColorSettings(L"Background", UIElementType_Background, &color))
+ p.setColor(QPalette::AlternateBase, fromColor(color));
+
+ if (uiColorSettings(L"ButtonFace", UIElementType_ButtonFace, &color)) {
+ p.setColor(QPalette::Button, fromColor(color));
+ p.setColor(QPalette::Midlight, fromColor(color).lighter(110));
+ p.setColor(QPalette::Light, fromColor(color).lighter(150));
+ p.setColor(QPalette::Mid, fromColor(color).dark(130));
+ p.setColor(QPalette::Dark, fromColor(color).dark(150));
+ }
+
+ if (uiColorSettings(L"ButtonText", UIElementType_ButtonText, &color)) {
+ p.setColor(QPalette::ButtonText, fromColor(color));
+ p.setColor(QPalette::Text, fromColor(color));
+ }
+
+ if (uiColorSettings(L"CaptionText", UIElementType_CaptionText, &color))
+ p.setColor(QPalette::ToolTipText, fromColor(color));
+
+ if (uiColorSettings(L"Highlight", UIElementType_Highlight, &color))
+ p.setColor(QPalette::Highlight, fromColor(color));
+
+ if (uiColorSettings(L"HighlightText", UIElementType_HighlightText, &color))
+ p.setColor(QPalette::HighlightedText, fromColor(color));
+
+ if (uiColorSettings(L"Window", UIElementType_Window, &color)) {
+ p.setColor(QPalette::Window, fromColor(color));
+ p.setColor(QPalette::Base, fromColor(color));
+ }
+
+ if (uiColorSettings(L"Hotlight", UIElementType_Hotlight, &color))
+ p.setColor(QPalette::BrightText, fromColor(color));
+
+ //Phone related
+ if (uiColorSettings(L"PopupBackground", UIElementType_PopupBackground, &color)) {
+ p.setColor(QPalette::ToolTipBase, fromColor(color));
+ p.setColor(QPalette::AlternateBase, fromColor(color));
+ }
+
+ if (uiColorSettings(L"NonTextMedium", UIElementType_NonTextMedium, &color))
+ p.setColor(QPalette::Button, fromColor(color));
+
+ if (uiColorSettings(L"NonTextMediumHigh", UIElementType_NonTextMediumHigh, &color))
+ p.setColor(QPalette::Midlight, fromColor(color));
+
+ if (uiColorSettings(L"NonTextHigh", UIElementType_NonTextHigh, &color))
+ p.setColor(QPalette::Light, fromColor(color));
+
+ if (uiColorSettings(L"NonTextMediumLow", UIElementType_NonTextMediumLow, &color))
+ p.setColor(QPalette::Mid, fromColor(color));
+
+ if (uiColorSettings(L"NonTextLow", UIElementType_NonTextLow, &color))
+ p.setColor(QPalette::Dark, fromColor(color));
+
+ if (uiColorSettings(L"TextHigh", UIElementType_TextHigh, &color)) {
+ p.setColor(QPalette::ButtonText, fromColor(color));
+ p.setColor(QPalette::Text, fromColor(color));
+ p.setColor(QPalette::WindowText, fromColor(color));
+ }
+
+ if (uiColorSettings(L"TextMedium", UIElementType_TextMedium, &color))
+ p.setColor(QPalette::ToolTipText, fromColor(color));
+
+ if (uiColorSettings(L"AccentColor", UIElementType_AccentColor, &color))
+ p.setColor(QPalette::Highlight, fromColor(color));
+ if (uiColorSettings(L"PageBackground", UIElementType_PageBackground, &color)) {
+ p.setColor(QPalette::Window, fromColor(color));
+ p.setColor(QPalette::Base, fromColor(color));
+ }
+
+ if (uiColorSettings(L"TextContrastWithHigh", UIElementType_TextContrastWithHigh, &color))
+ p.setColor(QPalette::BrightText, fromColor(color));
+}
+
+#else // _MSC_VER >= 1900
+
+static void nativeColorSettings(QPalette &p)
+{
HRESULT hr;
Color color;
#ifdef Q_OS_WINPHONE
hr = uiSettings()->UIElementColor(UIElementType_PopupBackground, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::ToolTipBase, fromColor(color));
- d->palette.setColor(QPalette::AlternateBase, fromColor(color));
+ p.setColor(QPalette::ToolTipBase, fromColor(color));
+ p.setColor(QPalette::AlternateBase, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_NonTextMedium, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Button, fromColor(color));
+ p.setColor(QPalette::Button, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_NonTextMediumHigh, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Midlight, fromColor(color));
+ p.setColor(QPalette::Midlight, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_NonTextHigh, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Light, fromColor(color));
+ p.setColor(QPalette::Light, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_NonTextMediumLow, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Mid, fromColor(color));
+ p.setColor(QPalette::Mid, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_NonTextLow, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Dark, fromColor(color));
+ p.setColor(QPalette::Dark, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_TextHigh, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::ButtonText, fromColor(color));
- d->palette.setColor(QPalette::Text, fromColor(color));
- d->palette.setColor(QPalette::WindowText, fromColor(color));
+ p.setColor(QPalette::ButtonText, fromColor(color));
+ p.setColor(QPalette::Text, fromColor(color));
+ p.setColor(QPalette::WindowText, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_TextMedium, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::ToolTipText, fromColor(color));
+ p.setColor(QPalette::ToolTipText, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_AccentColor, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Highlight, fromColor(color));
+ p.setColor(QPalette::Highlight, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_PageBackground, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Window, fromColor(color));
- d->palette.setColor(QPalette::Base, fromColor(color));
+ p.setColor(QPalette::Window, fromColor(color));
+ p.setColor(QPalette::Base, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_TextContrastWithHigh, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::BrightText, fromColor(color));
+ p.setColor(QPalette::BrightText, fromColor(color));
#else
hr = uiSettings()->UIElementColor(UIElementType_ActiveCaption, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::ToolTipBase, fromColor(color));
+ p.setColor(QPalette::ToolTipBase, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_Background, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::AlternateBase, fromColor(color));
+ p.setColor(QPalette::AlternateBase, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_ButtonFace, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Button, fromColor(color));
- d->palette.setColor(QPalette::Midlight, fromColor(color).lighter(110));
- d->palette.setColor(QPalette::Light, fromColor(color).lighter(150));
- d->palette.setColor(QPalette::Mid, fromColor(color).dark(130));
- d->palette.setColor(QPalette::Dark, fromColor(color).dark(150));
+ p.setColor(QPalette::Button, fromColor(color));
+ p.setColor(QPalette::Midlight, fromColor(color).lighter(110));
+ p.setColor(QPalette::Light, fromColor(color).lighter(150));
+ p.setColor(QPalette::Mid, fromColor(color).dark(130));
+ p.setColor(QPalette::Dark, fromColor(color).dark(150));
hr = uiSettings()->UIElementColor(UIElementType_ButtonText, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::ButtonText, fromColor(color));
- d->palette.setColor(QPalette::Text, fromColor(color));
+ p.setColor(QPalette::ButtonText, fromColor(color));
+ p.setColor(QPalette::Text, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_CaptionText, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::ToolTipText, fromColor(color));
+ p.setColor(QPalette::ToolTipText, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_Highlight, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Highlight, fromColor(color));
+ p.setColor(QPalette::Highlight, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_HighlightText, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::HighlightedText, fromColor(color));
+ p.setColor(QPalette::HighlightedText, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_Window, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::Window, fromColor(color));
- d->palette.setColor(QPalette::Base, fromColor(color));
+ p.setColor(QPalette::Window, fromColor(color));
+ p.setColor(QPalette::Base, fromColor(color));
hr = uiSettings()->UIElementColor(UIElementType_Hotlight, &color);
Q_ASSERT_SUCCEEDED(hr);
- d->palette.setColor(QPalette::BrightText, fromColor(color));
+ p.setColor(QPalette::BrightText, fromColor(color));
#endif
}
+#endif // _MSC_VER < 1900
+
+QWinRTTheme::QWinRTTheme()
+ : d_ptr(new QWinRTThemePrivate)
+{
+ Q_D(QWinRTTheme);
+
+ nativeColorSettings(d->palette);
+}
bool QWinRTTheme::usePlatformNativeDialog(DialogType type) const
{
diff --git a/src/plugins/platforms/winrt/qwinrtwindow.cpp b/src/plugins/platforms/winrt/qwinrtwindow.cpp
index c5b06a5d8a..0d43e76c1a 100644
--- a/src/plugins/platforms/winrt/qwinrtwindow.cpp
+++ b/src/plugins/platforms/winrt/qwinrtwindow.cpp
@@ -175,6 +175,9 @@ QWinRTWindow::~QWinRTWindow()
});
RETURN_VOID_IF_FAILED("Failed to completely destroy window resources, likely because the application is shutting down");
+ if (!d->surface)
+ return;
+
EGLBoolean value = eglDestroySurface(d->display, d->surface);
d->surface = EGL_NO_SURFACE;
if (value == EGL_FALSE)
diff --git a/src/plugins/platforms/winrt/winrt.pro b/src/plugins/platforms/winrt/winrt.pro
index 2718ea62bb..be6aad02d1 100644
--- a/src/plugins/platforms/winrt/winrt.pro
+++ b/src/plugins/platforms/winrt/winrt.pro
@@ -10,7 +10,7 @@ QT += core-private gui-private platformsupport-private
DEFINES *= QT_NO_CAST_FROM_ASCII __WRL_NO_DEFAULT_LIB__ GL_GLEXT_PROTOTYPES
-LIBS += $$QMAKE_LIBS_CORE -ldwrite
+LIBS += $$QMAKE_LIBS_CORE -ldwrite -ld3d11
INCLUDEPATH += $$QT_SOURCE_TREE/src/3rdparty/freetype/include
SOURCES = \