diff options
author | Frederik Gladhorn <frederik.gladhorn@theqtcompany.com> | 2014-11-27 18:28:12 +0100 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@theqtcompany.com> | 2014-11-27 18:28:12 +0100 |
commit | ce6990c3e742e0833df0561246554cf07a888efb (patch) | |
tree | 412380582040f5bb314eb90ae029b41a883aa439 /src/plugins/platforms | |
parent | 09e674849a40f5eb7e9f95fd2a952c621aec86d1 (diff) | |
parent | fa9bde7d3a12ede956339c570f7b32f95d231e57 (diff) |
Merge remote-tracking branch 'origin/5.4' into dev
Change-Id: Id20053d261b4fbbcc0ac8ba49dd3ef2253fa4b95
Diffstat (limited to 'src/plugins/platforms')
18 files changed, 143 insertions, 54 deletions
diff --git a/src/plugins/platforms/android/qandroidplatformmenu.cpp b/src/plugins/platforms/android/qandroidplatformmenu.cpp index 8f992f6bea..f8e7df8784 100644 --- a/src/plugins/platforms/android/qandroidplatformmenu.cpp +++ b/src/plugins/platforms/android/qandroidplatformmenu.cpp @@ -53,18 +53,18 @@ QAndroidPlatformMenu::~QAndroidPlatformMenu() void QAndroidPlatformMenu::insertMenuItem(QPlatformMenuItem *menuItem, QPlatformMenuItem *before) { QMutexLocker lock(&m_menuItemsMutex); - m_menuItems.insert(qFind(m_menuItems.begin(), - m_menuItems.end(), - static_cast<QAndroidPlatformMenuItem *>(before)), + m_menuItems.insert(std::find(m_menuItems.begin(), + m_menuItems.end(), + static_cast<QAndroidPlatformMenuItem *>(before)), static_cast<QAndroidPlatformMenuItem *>(menuItem)); } void QAndroidPlatformMenu::removeMenuItem(QPlatformMenuItem *menuItem) { QMutexLocker lock(&m_menuItemsMutex); - PlatformMenuItemsType::iterator it = qFind(m_menuItems.begin(), - m_menuItems.end(), - static_cast<QAndroidPlatformMenuItem *>(menuItem)); + PlatformMenuItemsType::iterator it = std::find(m_menuItems.begin(), + m_menuItems.end(), + static_cast<QAndroidPlatformMenuItem *>(menuItem)); if (it != m_menuItems.end()) m_menuItems.erase(it); } diff --git a/src/plugins/platforms/android/qandroidplatformmenubar.cpp b/src/plugins/platforms/android/qandroidplatformmenubar.cpp index 87ebaa8554..2892c3ef3b 100644 --- a/src/plugins/platforms/android/qandroidplatformmenubar.cpp +++ b/src/plugins/platforms/android/qandroidplatformmenubar.cpp @@ -51,18 +51,18 @@ QAndroidPlatformMenuBar::~QAndroidPlatformMenuBar() void QAndroidPlatformMenuBar::insertMenu(QPlatformMenu *menu, QPlatformMenu *before) { QMutexLocker lock(&m_menusListMutex); - m_menus.insert(qFind(m_menus.begin(), - m_menus.end(), - static_cast<QAndroidPlatformMenu *>(before)), - static_cast<QAndroidPlatformMenu *>(menu)); + m_menus.insert(std::find(m_menus.begin(), + m_menus.end(), + static_cast<QAndroidPlatformMenu *>(before)), + static_cast<QAndroidPlatformMenu *>(menu)); } void QAndroidPlatformMenuBar::removeMenu(QPlatformMenu *menu) { QMutexLocker lock(&m_menusListMutex); - m_menus.erase(qFind(m_menus.begin(), - m_menus.end(), - static_cast<QAndroidPlatformMenu *>(menu))); + m_menus.erase(std::find(m_menus.begin(), + m_menus.end(), + static_cast<QAndroidPlatformMenu *>(menu))); } void QAndroidPlatformMenuBar::syncMenu(QPlatformMenu *menu) diff --git a/src/plugins/platforms/android/qandroidplatformtheme.cpp b/src/plugins/platforms/android/qandroidplatformtheme.cpp index b955cff44d..ef7093942c 100644 --- a/src/plugins/platforms/android/qandroidplatformtheme.cpp +++ b/src/plugins/platforms/android/qandroidplatformtheme.cpp @@ -347,6 +347,9 @@ QAndroidPlatformTheme::QAndroidPlatformTheme(QAndroidPlatformNativeInterface *an m_androidStyleData = loadAndroidStyle(&m_defaultPalette); QGuiApplication::setPalette(m_defaultPalette); androidPlatformNativeInterface->m_androidStyle = m_androidStyleData; + + // default in case the style has not set a font + m_systemFont = QFont(QLatin1String("Roboto"), 14.0 * 100 / 72); // keep default size the same after changing from 100 dpi to 72 dpi } QPlatformMenuBar *QAndroidPlatformTheme::createPlatformMenuBar() const @@ -429,10 +432,8 @@ const QFont *QAndroidPlatformTheme::font(Font type) const return &(it.value()); } - // default in case the style has not set a font - static QFont systemFont("Roboto", 14.0 * 100 / 72); // keep default size the same after changing from 100 dpi to 72 dpi if (type == QPlatformTheme::SystemFont) - return &systemFont; + return &m_systemFont; return 0; } diff --git a/src/plugins/platforms/android/qandroidplatformtheme.h b/src/plugins/platforms/android/qandroidplatformtheme.h index 334e86ad7a..e842e672d6 100644 --- a/src/plugins/platforms/android/qandroidplatformtheme.h +++ b/src/plugins/platforms/android/qandroidplatformtheme.h @@ -35,6 +35,7 @@ #define QANDROIDPLATFORMTHEME_H #include <qpa/qplatformtheme.h> +#include <QtGui/qfont.h> #include <QtGui/qpalette.h> #include <QJsonObject> @@ -73,6 +74,7 @@ public: private: std::shared_ptr<AndroidStyle> m_androidStyleData; QPalette m_defaultPalette; + QFont m_systemFont; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/directfb/directfb.pro b/src/plugins/platforms/directfb/directfb.pro index 13481f6198..89d8d42cea 100644 --- a/src/plugins/platforms/directfb/directfb.pro +++ b/src/plugins/platforms/directfb/directfb.pro @@ -29,8 +29,6 @@ HEADERS = qdirectfbintegration.h \ qdirectfbscreen.h \ qdirectfbeglhooks.h -contains(QT_CONFIG, libudev): DEFINES += QDEVICEDISCOVERY_UDEV - # ### port the GL context contains(QT_CONFIG, directfb_egl) { HEADERS += qdirectfb_egl.h diff --git a/src/plugins/platforms/ios/qiosinputcontext.h b/src/plugins/platforms/ios/qiosinputcontext.h index d2a9c261ba..b4ff695f1a 100644 --- a/src/plugins/platforms/ios/qiosinputcontext.h +++ b/src/plugins/platforms/ios/qiosinputcontext.h @@ -63,25 +63,27 @@ public: QIOSInputContext(); ~QIOSInputContext(); - QRectF keyboardRect() const; + bool isValid() const Q_DECL_OVERRIDE { return true; } - void showInputPanel(); - void hideInputPanel(); + void showInputPanel() Q_DECL_OVERRIDE; + void hideInputPanel() Q_DECL_OVERRIDE; - void clearCurrentFocusObject(); + bool isInputPanelVisible() const Q_DECL_OVERRIDE; + QRectF keyboardRect() const Q_DECL_OVERRIDE; + + void update(Qt::InputMethodQueries) Q_DECL_OVERRIDE; + void reset() Q_DECL_OVERRIDE; + void commit() Q_DECL_OVERRIDE; - bool isInputPanelVisible() const; - void setFocusObject(QObject *object); + void clearCurrentFocusObject(); + void setFocusObject(QObject *object) Q_DECL_OVERRIDE; void focusWindowChanged(QWindow *focusWindow); void cursorRectangleChanged(); + void scrollToCursor(); void scroll(int y); - void update(Qt::InputMethodQueries); - void reset(); - void commit(); - const ImeState &imeState() { return m_imeState; }; bool inputMethodAccepted() const; diff --git a/src/plugins/platforms/ios/qioswindow.h b/src/plugins/platforms/ios/qioswindow.h index 65b4f6dd7d..21a05a302e 100644 --- a/src/plugins/platforms/ios/qioswindow.h +++ b/src/plugins/platforms/ios/qioswindow.h @@ -63,6 +63,7 @@ public: void setOpacity(qreal level) Q_DECL_OVERRIDE; bool isExposed() const Q_DECL_OVERRIDE; + void propagateSizeHints() Q_DECL_OVERRIDE {} void raise() { raiseOrLower(true); } void lower() { raiseOrLower(false); } diff --git a/src/plugins/platforms/ios/qioswindow.mm b/src/plugins/platforms/ios/qioswindow.mm index b0c5f15306..480062e4de 100644 --- a/src/plugins/platforms/ios/qioswindow.mm +++ b/src/plugins/platforms/ios/qioswindow.mm @@ -145,9 +145,10 @@ void QIOSWindow::setVisible(bool visible) bool QIOSWindow::shouldAutoActivateWindow() const { // We don't want to do automatic window activation for popup windows - // (including Tool, ToolTip and SplashScreen windows), unless they - // are standalone (no parent/transient parent), and hence not active. - return !(window()->type() & Qt::Popup) || !window()->isActive(); + // that are unlikely to contain editable controls (to avoid hiding + // the keyboard while the popup is showing) + const Qt::WindowType type = window()->type(); + return (type != Qt::Popup && type != Qt::ToolTip) || !window()->isActive(); } void QIOSWindow::setOpacity(qreal level) diff --git a/src/plugins/platforms/kms/kms.pro b/src/plugins/platforms/kms/kms.pro index 948d986fc5..baa8778153 100644 --- a/src/plugins/platforms/kms/kms.pro +++ b/src/plugins/platforms/kms/kms.pro @@ -9,7 +9,6 @@ QT += core-private gui-private platformsupport-private qtHaveModule(opengl):QT += opengl-private DEFINES += MESA_EGL_NO_X11_HEADERS __GBM__ -contains(QT_CONFIG, libudev): DEFINES += QDEVICEDISCOVERY_UDEV CONFIG += link_pkgconfig egl qpa/genericunixfontdatabase diff --git a/src/plugins/platforms/linuxfb/linuxfb.pro b/src/plugins/platforms/linuxfb/linuxfb.pro index 5e185e357f..389d45c29c 100644 --- a/src/plugins/platforms/linuxfb/linuxfb.pro +++ b/src/plugins/platforms/linuxfb/linuxfb.pro @@ -9,7 +9,6 @@ QT += core-private gui-private platformsupport-private SOURCES = main.cpp qlinuxfbintegration.cpp qlinuxfbscreen.cpp HEADERS = qlinuxfbintegration.h qlinuxfbscreen.h -contains(QT_CONFIG, libudev): DEFINES += QDEVICEDISCOVERY_UDEV CONFIG += qpa/genericunixfontdatabase diff --git a/src/plugins/platforms/windows/qtwindowsglobal.h b/src/plugins/platforms/windows/qtwindowsglobal.h index 99c97d156f..90e6d6ab9d 100644 --- a/src/plugins/platforms/windows/qtwindowsglobal.h +++ b/src/plugins/platforms/windows/qtwindowsglobal.h @@ -72,7 +72,8 @@ enum WindowsEventType // Simplify event types ShowEventOnParentRestoring = WindowEventFlag + 20, HideEvent = WindowEventFlag + 8, DestroyEvent = WindowEventFlag + 9, - MoveEvent = WindowEventFlag + 10, + GeometryChangingEvent = WindowEventFlag + 10, + MoveEvent = WindowEventFlag + 11, ResizeEvent = WindowEventFlag + 12, QuerySizeHints = WindowEventFlag + 15, CalculateSize = WindowEventFlag + 16, @@ -146,6 +147,10 @@ inline QtWindows::WindowsEventType windowsEventType(UINT message, WPARAM wParamI case WM_MOUSEWHEEL: case WM_MOUSEHWHEEL: return QtWindows::MouseWheelEvent; +#ifndef Q_OS_WINCE + case WM_WINDOWPOSCHANGING: + return QtWindows::GeometryChangingEvent; +#endif case WM_MOVE: return QtWindows::MoveEvent; case WM_SHOWWINDOW: diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index 22a4dbb09f..4f1a1a375f 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -995,6 +995,8 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message, return QWindowsGeometryHint::handleCalculateSize(platformWindow->customMargins(), msg, result); case QtWindows::NonClientHitTest: return platformWindow->handleNonClientHitTest(QPoint(msg.pt.x, msg.pt.y), result); + case QtWindows::GeometryChangingEvent: + return platformWindow->QWindowsWindow::handleGeometryChanging(&msg); #endif // !Q_OS_WINCE case QtWindows::ExposeEvent: return platformWindow->handleWmPaint(hwnd, message, wParam, lParam); diff --git a/src/plugins/platforms/windows/qwindowsfontengine.cpp b/src/plugins/platforms/windows/qwindowsfontengine.cpp index 376b1bdc37..6b13d93259 100644 --- a/src/plugins/platforms/windows/qwindowsfontengine.cpp +++ b/src/plugins/platforms/windows/qwindowsfontengine.cpp @@ -289,14 +289,15 @@ QWindowsFontEngine::QWindowsFontEngine(const QString &name, qCDebug(lcQpaFonts) << __FUNCTION__ << name << lf.lfHeight; HDC hdc = m_fontEngineData->hdc; SelectObject(hdc, hfont); - fontDef.pixelSize = -lf.lfHeight; const BOOL res = GetTextMetrics(hdc, &tm); - fontDef.fixedPitch = !(tm.tmPitchAndFamily & TMPF_FIXED_PITCH); if (!res) { qErrnoWarning("%s: GetTextMetrics failed", __FUNCTION__); ZeroMemory(&tm, sizeof(TEXTMETRIC)); } + fontDef.pixelSize = -lf.lfHeight; + fontDef.fixedPitch = !(tm.tmPitchAndFamily & TMPF_FIXED_PITCH); + cache_cost = tm.tmHeight * tm.tmAveCharWidth * 2000; getCMap(); diff --git a/src/plugins/platforms/windows/qwindowsinputcontext.cpp b/src/plugins/platforms/windows/qwindowsinputcontext.cpp index 929c6165d2..94a27d146f 100644 --- a/src/plugins/platforms/windows/qwindowsinputcontext.cpp +++ b/src/plugins/platforms/windows/qwindowsinputcontext.cpp @@ -145,6 +145,7 @@ static inline void imeNotifyCancelComposition(HWND hwnd) */ +HIMC QWindowsInputContext::m_defaultContext = 0; QWindowsInputContext::CompositionContext::CompositionContext() : hwnd(0), haveCaret(false), position(0), isComposing(false) @@ -163,6 +164,21 @@ QWindowsInputContext::~QWindowsInputContext() { } +bool QWindowsInputContext::hasCapability(Capability capability) const +{ + switch (capability) { + case QPlatformInputContext::HiddenTextCapability: +#ifndef Q_OS_WINCE + return false; // QTBUG-40691, do not show IME on desktop for password entry fields. +#else + break; // Windows CE: Show software keyboard. +#endif + default: + break; + } + return true; +} + /*! \brief Cancels a composition. */ @@ -184,13 +200,33 @@ void QWindowsInputContext::reset() doneContext(); } -void QWindowsInputContext::setFocusObject(QObject *) +void QWindowsInputContext::setFocusObject(QObject *object) { // ### fixme: On Windows 8.1, it has been observed that the Input context // remains active when this happens resulting in a lock-up. Consecutive // key events still have VK_PROCESSKEY set and are thus ignored. if (m_compositionContext.isComposing) imeNotifyCancelComposition(m_compositionContext.hwnd); + + const QWindow *window = QGuiApplication::focusWindow(); + if (object && window) { + QWindowsWindow *platformWindow = QWindowsWindow::baseWindowOf(window); + if (inputMethodAccepted()) { + // Re-enable IME by associating default context saved on first disabling. + if (platformWindow->testFlag(QWindowsWindow::InputMethodDisabled)) { + ImmAssociateContext(platformWindow->handle(), QWindowsInputContext::m_defaultContext); + platformWindow->clearFlag(QWindowsWindow::InputMethodDisabled); + } + } else { + // Disable IME by associating 0 context. Store context first time. + if (!platformWindow->testFlag(QWindowsWindow::InputMethodDisabled)) { + const HIMC oldImC = ImmAssociateContext(platformWindow->handle(), 0); + platformWindow->setFlag(QWindowsWindow::InputMethodDisabled); + if (!QWindowsInputContext::m_defaultContext && oldImC) + QWindowsInputContext::m_defaultContext = oldImC; + } + } + } } /*! diff --git a/src/plugins/platforms/windows/qwindowsinputcontext.h b/src/plugins/platforms/windows/qwindowsinputcontext.h index db1c005207..86243952ec 100644 --- a/src/plugins/platforms/windows/qwindowsinputcontext.h +++ b/src/plugins/platforms/windows/qwindowsinputcontext.h @@ -62,6 +62,7 @@ public: explicit QWindowsInputContext(); ~QWindowsInputContext(); + bool hasCapability(Capability capability) const Q_DECL_OVERRIDE; void reset() Q_DECL_OVERRIDE; void update(Qt::InputMethodQueries) Q_DECL_OVERRIDE; void invokeAction(QInputMethod::Action, int cursorPosition) Q_DECL_OVERRIDE; @@ -87,6 +88,7 @@ private: void endContextComposition(); const DWORD m_WM_MSIME_MOUSE; + static HIMC m_defaultContext; CompositionContext m_compositionContext; bool m_endCompositionRecursionGuard; }; diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 8a80729354..0b4bb9b09d 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -1783,6 +1783,43 @@ void QWindowsWindow::propagateSizeHints() qCDebug(lcQpaWindows) << __FUNCTION__ << this << window(); } +bool QWindowsWindow::handleGeometryChanging(MSG *message) const +{ +#ifndef Q_OS_WINCE + QWindow *qWin = window(); + if (!qWin->isTopLevel()) + return false; + WINDOWPOS *windowPos = reinterpret_cast<WINDOWPOS *>(message->lParam); + if ((windowPos->flags & (SWP_NOCOPYBITS | SWP_NOSIZE))) + return false; + const QMargins marginsDp = frameMarginsDp(); + const QRect suggestedFrameGeometryDp(windowPos->x, windowPos->y, + windowPos->cx, windowPos->cy); + const qreal factor = QWindowsScaling::factor(); + const QRect suggestedGeometryDp = suggestedFrameGeometryDp - marginsDp; + const QRectF suggestedGeometry = QRectF(QPointF(suggestedGeometryDp.topLeft()) / factor, + QSizeF(suggestedGeometryDp.size()) / factor); + const QRectF correctedGeometryF = + qt_window_private(qWin)->closestAcceptableGeometry(suggestedGeometry); + if (!correctedGeometryF.isValid()) + return false; + const QRect correctedFrameGeometryDp + = QRectF(correctedGeometryF.topLeft() * factor, + correctedGeometryF.size() * factor).toRect() + + marginsDp; + if (correctedFrameGeometryDp == suggestedFrameGeometryDp) + return false; + windowPos->x = correctedFrameGeometryDp.left(); + windowPos->y = correctedFrameGeometryDp.top(); + windowPos->cx = correctedFrameGeometryDp.width(); + windowPos->cy = correctedFrameGeometryDp.height(); + return true; +#else // !Q_OS_WINCE + Q_UNUSED(message) + return false; +#endif +} + QMargins QWindowsWindow::frameMarginsDp() const { // Frames are invalidated by style changes (window state, flags). diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h index 71debf2476..a63a9f56e3 100644 --- a/src/plugins/platforms/windows/qwindowswindow.h +++ b/src/plugins/platforms/windows/qwindowswindow.h @@ -138,7 +138,8 @@ public: Exposed = 0x10000, WithinCreate = 0x20000, WithinMaximize = 0x40000, - MaximizeToFullScreen = 0x80000 + MaximizeToFullScreen = 0x80000, + InputMethodDisabled =0x100000 }; QWindowsWindow(QWindow *window, const QWindowsWindowData &data); @@ -182,6 +183,7 @@ public: void windowEvent(QEvent *event); void propagateSizeHints() Q_DECL_OVERRIDE; + bool handleGeometryChanging(MSG *message) const; QMargins frameMarginsDp() const; QMargins frameMargins() const Q_DECL_OVERRIDE { return frameMarginsDp() / QWindowsScaling::factor(); } diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 85af8ee1d2..e1ccc3f086 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -2022,6 +2022,19 @@ void QXcbWindow::handleMouseEvent(xcb_timestamp_t time, const QPoint &local, con QWindowSystemInterface::handleMouseEvent(window(), time, local, global, connection()->buttons(), modifiers); } +static bool ignoreLeaveEvent(const xcb_leave_notify_event_t *event) +{ + return event->detail == XCB_NOTIFY_DETAIL_VIRTUAL + || event->detail == XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL; +} + +static bool ignoreEnterEvent(const xcb_enter_notify_event_t *event) +{ + return ((event->mode != XCB_NOTIFY_MODE_NORMAL && event->mode != XCB_NOTIFY_MODE_UNGRAB) + || event->detail == XCB_NOTIFY_DETAIL_VIRTUAL + || event->detail == XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL); +} + class EnterEventChecker { public: @@ -2033,13 +2046,8 @@ public: return false; xcb_enter_notify_event_t *enter = (xcb_enter_notify_event_t *)event; - - if ((enter->mode != XCB_NOTIFY_MODE_NORMAL && enter->mode != XCB_NOTIFY_MODE_UNGRAB) - || enter->detail == XCB_NOTIFY_DETAIL_VIRTUAL - || enter->detail == XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL) - { + if (ignoreEnterEvent(enter)) return false; - } return true; } @@ -2052,12 +2060,9 @@ void QXcbWindow::handleEnterNotifyEvent(const xcb_enter_notify_event_t *event) connection()->handleEnterEvent(event); #endif - if ((event->mode != XCB_NOTIFY_MODE_NORMAL && event->mode != XCB_NOTIFY_MODE_UNGRAB) - || event->detail == XCB_NOTIFY_DETAIL_VIRTUAL - || event->detail == XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL) - { + if (ignoreEnterEvent(event)) return; - } + const int dpr = int(devicePixelRatio()); const QPoint local(event->event_x/dpr, event->event_y/dpr); const QPoint global(event->root_x/dpr, event->root_y/dpr); @@ -2068,12 +2073,8 @@ void QXcbWindow::handleLeaveNotifyEvent(const xcb_leave_notify_event_t *event) { connection()->setTime(event->time); - if ((event->mode != XCB_NOTIFY_MODE_NORMAL && event->mode != XCB_NOTIFY_MODE_UNGRAB) - || event->detail == XCB_NOTIFY_DETAIL_VIRTUAL - || event->detail == XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL) - { + if (ignoreLeaveEvent(event)) return; - } EnterEventChecker checker; xcb_enter_notify_event_t *enter = (xcb_enter_notify_event_t *)connection()->checkEvent(checker); |