summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms
diff options
context:
space:
mode:
authorPeng Wu <peng.wu@intopalo.com>2015-04-08 11:30:39 +0300
committerPengWu <peng.wu@intopalo.com>2015-04-09 10:30:47 +0000
commit331ddacfca90c91c5b44484bf3c78e2aa5b85947 (patch)
tree7079b8ab3c4c309bf53b98e6c30f48a791c000f4 /src/plugins/platforms
parent2af77ab826083d8a2a311bc7af2bc0f744beec25 (diff)
winrt: set correct virtual keyboard size
This is done by multiplying by the DIP scale factor. Task-number: QTBUG-44152 Change-Id: I587a66f1a2f7fa3a713c279f5d877e6acb844620 Reviewed-by: Andrew Knight <qt@panimo.net>
Diffstat (limited to 'src/plugins/platforms')
-rw-r--r--src/plugins/platforms/winrt/qwinrtinputcontext.cpp41
-rw-r--r--src/plugins/platforms/winrt/qwinrtinputcontext.h8
-rw-r--r--src/plugins/platforms/winrt/qwinrtscreen.cpp10
-rw-r--r--src/plugins/platforms/winrt/qwinrtscreen.h1
4 files changed, 31 insertions, 29 deletions
diff --git a/src/plugins/platforms/winrt/qwinrtinputcontext.cpp b/src/plugins/platforms/winrt/qwinrtinputcontext.cpp
index 63d4c01697..f0de578db6 100644
--- a/src/plugins/platforms/winrt/qwinrtinputcontext.cpp
+++ b/src/plugins/platforms/winrt/qwinrtinputcontext.cpp
@@ -32,6 +32,7 @@
****************************************************************************/
#include "qwinrtinputcontext.h"
+#include "qwinrtscreen.h"
#include <QtGui/QWindow>
#include <wrl.h>
@@ -61,8 +62,8 @@ QT_BEGIN_NAMESPACE
Windows Phone, however, supports direct hiding/showing of the keyboard.
*/
-QWinRTInputContext::QWinRTInputContext(ICoreWindow *window)
- : m_window(window)
+QWinRTInputContext::QWinRTInputContext(QWinRTScreen *screen)
+ : m_screen(screen)
{
IInputPaneStatics *statics;
if (FAILED(GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_UI_ViewManagement_InputPane).Get(),
@@ -81,9 +82,7 @@ QWinRTInputContext::QWinRTInputContext(ICoreWindow *window)
inputPane->add_Hiding(Callback<InputPaneVisibilityHandler>(
this, &QWinRTInputContext::onHiding).Get(), &hideToken);
- Rect rect;
- inputPane->get_OccludedRect(&rect);
- m_keyboardRect = QRectF(rect.X, rect.Y, rect.Width, rect.Height);
+ handleVisibilityChange(inputPane);
m_isInputPanelVisible = !m_keyboardRect.isEmpty();
} else {
qWarning(Q_FUNC_INFO ": failed to retrieve InputPane.");
@@ -104,35 +103,29 @@ HRESULT QWinRTInputContext::onShowing(IInputPane *pane, IInputPaneVisibilityEven
{
m_isInputPanelVisible = true;
emitInputPanelVisibleChanged();
-
- Rect rect;
- pane->get_OccludedRect(&rect);
- setKeyboardRect(QRectF(rect.X, rect.Y, rect.Width, rect.Height));
-
- return S_OK;
+ return handleVisibilityChange(pane);
}
HRESULT QWinRTInputContext::onHiding(IInputPane *pane, IInputPaneVisibilityEventArgs *)
{
m_isInputPanelVisible = false;
emitInputPanelVisibleChanged();
+ return handleVisibilityChange(pane);
+}
+HRESULT QWinRTInputContext::handleVisibilityChange(IInputPane *pane)
+{
Rect rect;
pane->get_OccludedRect(&rect);
- setKeyboardRect(QRectF(rect.X, rect.Y, rect.Width, rect.Height));
-
+ const QRectF keyboardRect = QRectF(qRound(rect.X * m_screen->scaleFactor()), qRound(rect.Y * m_screen->scaleFactor()),
+ qRound(rect.Width * m_screen->scaleFactor()), qRound(rect.Height * m_screen->scaleFactor()));
+ if (m_keyboardRect != keyboardRect) {
+ m_keyboardRect = keyboardRect;
+ emitKeyboardRectChanged();
+ }
return S_OK;
}
-void QWinRTInputContext::setKeyboardRect(const QRectF rect)
-{
- if (m_keyboardRect == rect)
- return;
-
- m_keyboardRect = rect;
- emitKeyboardRectChanged();
-}
-
#ifdef Q_OS_WINPHONE
static HRESULT getInputPane(ComPtr<IInputPane2> *inputPane2)
@@ -234,7 +227,7 @@ HRESULT QWinRTInputContext::GetPropertyValue(PROPERTYID idProp, VARIANT *retVal)
break;
case 30020: //UIA_NativeWindowHandlePropertyId
retVal->vt = VT_PTR;
- retVal->punkVal = m_window;
+ retVal->punkVal = m_screen->coreWindow();
break;
}
return S_OK;
@@ -244,7 +237,7 @@ HRESULT QWinRTInputContext::get_HostRawElementProvider(IRawElementProviderSimple
{
// Return the window's element provider
IInspectable *hostProvider;
- HRESULT hr = m_window->get_AutomationHostProvider(&hostProvider);
+ HRESULT hr = m_screen->coreWindow()->get_AutomationHostProvider(&hostProvider);
if (SUCCEEDED(hr)) {
hr = hostProvider->QueryInterface(IID_PPV_ARGS(retVal));
hostProvider->Release();
diff --git a/src/plugins/platforms/winrt/qwinrtinputcontext.h b/src/plugins/platforms/winrt/qwinrtinputcontext.h
index 6b1b66c0a3..761908a9cb 100644
--- a/src/plugins/platforms/winrt/qwinrtinputcontext.h
+++ b/src/plugins/platforms/winrt/qwinrtinputcontext.h
@@ -58,6 +58,7 @@ namespace ABI {
QT_BEGIN_NAMESPACE
+class QWinRTScreen;
class QWinRTInputContext : public QPlatformInputContext
#ifndef Q_OS_WINPHONE
, public Microsoft::WRL::RuntimeClass<
@@ -66,7 +67,7 @@ class QWinRTInputContext : public QPlatformInputContext
#endif // !Q_OS_WINPHONE
{
public:
- explicit QWinRTInputContext(ABI::Windows::UI::Core::ICoreWindow *window);
+ explicit QWinRTInputContext(QWinRTScreen *);
QRectF keyboardRect() const;
@@ -101,9 +102,10 @@ private:
ABI::Windows::UI::ViewManagement::IInputPaneVisibilityEventArgs *);
HRESULT onHiding(ABI::Windows::UI::ViewManagement::IInputPane *,
ABI::Windows::UI::ViewManagement::IInputPaneVisibilityEventArgs *);
- void setKeyboardRect(const QRectF rect);
- ABI::Windows::UI::Core::ICoreWindow *m_window;
+ HRESULT handleVisibilityChange(ABI::Windows::UI::ViewManagement::IInputPane *);
+
+ QWinRTScreen *m_screen;
QRectF m_keyboardRect;
bool m_isInputPanelVisible;
};
diff --git a/src/plugins/platforms/winrt/qwinrtscreen.cpp b/src/plugins/platforms/winrt/qwinrtscreen.cpp
index d7888194c2..d53b4e6ab9 100644
--- a/src/plugins/platforms/winrt/qwinrtscreen.cpp
+++ b/src/plugins/platforms/winrt/qwinrtscreen.cpp
@@ -497,9 +497,9 @@ QWinRTScreen::QWinRTScreen()
Q_ASSERT_SUCCEEDED(hr);
#ifdef Q_OS_WINPHONE
- d->inputContext.reset(new QWinRTInputContext(d->coreWindow.Get()));
+ d->inputContext.reset(new QWinRTInputContext(this));
#else
- d->inputContext = Make<QWinRTInputContext>(d->coreWindow.Get());
+ d->inputContext = Make<QWinRTInputContext>(this);
#endif
Rect rect;
@@ -680,6 +680,12 @@ QDpi QWinRTScreen::logicalDpi() const
return QDpi(d->logicalDpi, d->logicalDpi);
}
+qreal QWinRTScreen::scaleFactor() const
+{
+ Q_D(const QWinRTScreen);
+ return d->scaleFactor;
+}
+
QWinRTInputContext *QWinRTScreen::inputContext() const
{
Q_D(const QWinRTScreen);
diff --git a/src/plugins/platforms/winrt/qwinrtscreen.h b/src/plugins/platforms/winrt/qwinrtscreen.h
index 404c8ca04e..cbef9543a9 100644
--- a/src/plugins/platforms/winrt/qwinrtscreen.h
+++ b/src/plugins/platforms/winrt/qwinrtscreen.h
@@ -93,6 +93,7 @@ public:
QSurfaceFormat surfaceFormat() const;
QSizeF physicalSize() const Q_DECL_OVERRIDE;
QDpi logicalDpi() const Q_DECL_OVERRIDE;
+ qreal scaleFactor() const;
QWinRTInputContext *inputContext() const;
QPlatformCursor *cursor() const;
Qt::KeyboardModifiers keyboardModifiers() const;