diff options
Diffstat (limited to 'src/plugins/platforms')
21 files changed, 255 insertions, 124 deletions
diff --git a/src/plugins/platforms/android/src/androidjniinput.cpp b/src/plugins/platforms/android/src/androidjniinput.cpp index b31e74bb52..4a2d87d6a4 100644 --- a/src/plugins/platforms/android/src/androidjniinput.cpp +++ b/src/plugins/platforms/android/src/androidjniinput.cpp @@ -222,24 +222,11 @@ namespace QtAndroidInput m_touchPoints.push_back(touchPoint); } - static void touchEnd(JNIEnv */*env*/, jobject /*thiz*/, jint /*winId*/, jint action) + static void touchEnd(JNIEnv */*env*/, jobject /*thiz*/, jint /*winId*/, jint /*action*/) { if (m_touchPoints.isEmpty()) return; - QEvent::Type eventType = QEvent::None; - switch (action) { - case 0: - eventType = QEvent::TouchBegin; - break; - case 1: - eventType = QEvent::TouchUpdate; - break; - case 2: - eventType = QEvent::TouchEnd; - break; - } - QAndroidPlatformIntegration *platformIntegration = QtAndroid::androidPlatformIntegration(); QTouchDevice *touchDevice = platformIntegration->touchDevice(); if (touchDevice == 0) { diff --git a/src/plugins/platforms/android/src/opengl/qeglfshooks_android.cpp b/src/plugins/platforms/android/src/opengl/qeglfshooks_android.cpp index 5a35310111..c6e3035476 100644 --- a/src/plugins/platforms/android/src/opengl/qeglfshooks_android.cpp +++ b/src/plugins/platforms/android/src/opengl/qeglfshooks_android.cpp @@ -98,6 +98,7 @@ QDpi QEglFSAndroidHooks::logicalDpi() const EGLNativeWindowType QEglFSAndroidHooks::createNativeWindow(const QSize &size, const QSurfaceFormat &format) { Q_UNUSED(size); + Q_UNUSED(format); ANativeWindow *window = QtAndroid::nativeWindow(); if (window != 0) ANativeWindow_acquire(window); diff --git a/src/plugins/platforms/android/src/qandroidplatformintegration.cpp b/src/plugins/platforms/android/src/qandroidplatformintegration.cpp index 286d4cc7f2..d7ed3499af 100644 --- a/src/plugins/platforms/android/src/qandroidplatformintegration.cpp +++ b/src/plugins/platforms/android/src/qandroidplatformintegration.cpp @@ -82,7 +82,10 @@ void *QAndroidPlatformNativeInterface::nativeResourceForIntegration(const QByteA return QtAndroid::javaVM(); if (resource == "QtActivity") return QtAndroid::activity(); - + if (resource == "AndroidStylePalettes") + return &m_palettes; + if (resource == "AndroidStyleFonts") + return &m_fonts; return 0; } @@ -246,7 +249,7 @@ QStringList QAndroidPlatformIntegration::themeNames() const QPlatformTheme *QAndroidPlatformIntegration::createPlatformTheme(const QString &name) const { if (androidThemeName == name) - return new QAndroidPlatformTheme; + return new QAndroidPlatformTheme(m_androidPlatformNativeInterface); return 0; } diff --git a/src/plugins/platforms/android/src/qandroidplatformintegration.h b/src/plugins/platforms/android/src/qandroidplatformintegration.h index 83d7028665..20aa52cf22 100644 --- a/src/plugins/platforms/android/src/qandroidplatformintegration.h +++ b/src/plugins/platforms/android/src/qandroidplatformintegration.h @@ -71,6 +71,8 @@ class QAndroidPlatformNativeInterface: public QPlatformNativeInterface { public: void *nativeResourceForIntegration(const QByteArray &resource); + QHash<int, QPalette> m_palettes; + QHash<int, QFont> m_fonts; }; class QAndroidPlatformIntegration diff --git a/src/plugins/platforms/android/src/qandroidplatformtheme.cpp b/src/plugins/platforms/android/src/qandroidplatformtheme.cpp index 25f2ade11a..9e08440eed 100644 --- a/src/plugins/platforms/android/src/qandroidplatformtheme.cpp +++ b/src/plugins/platforms/android/src/qandroidplatformtheme.cpp @@ -45,6 +45,12 @@ #include "qandroidplatformmenuitem.h" #include <QVariant> #include <QFileInfo> +#include <qandroidplatformintegration.h> + +QAndroidPlatformTheme::QAndroidPlatformTheme(QAndroidPlatformNativeInterface *androidPlatformNativeInterface) +{ + m_androidPlatformNativeInterface = androidPlatformNativeInterface; +} QPlatformMenuBar *QAndroidPlatformTheme::createPlatformMenuBar() const { @@ -61,13 +67,76 @@ QPlatformMenuItem *QAndroidPlatformTheme::createPlatformMenuItem() const return new QAndroidPlatformMenuItem; } +static inline int paletteType(QPlatformTheme::Palette type) +{ + switch (type) { + case QPlatformTheme::ToolButtonPalette: + case QPlatformTheme::ButtonPalette: + return QPlatformTheme::ButtonPalette; + + case QPlatformTheme::CheckBoxPalette: + return QPlatformTheme::CheckBoxPalette; + + case QPlatformTheme::RadioButtonPalette: + return QPlatformTheme::RadioButtonPalette; + + case QPlatformTheme::ComboBoxPalette: + return QPlatformTheme::ComboBoxPalette; + + case QPlatformTheme::TextEditPalette: + case QPlatformTheme::TextLineEditPalette: + return QPlatformTheme::TextLineEditPalette; + + case QPlatformTheme::ItemViewPalette: + return QPlatformTheme::ItemViewPalette; + + default: + return QPlatformTheme::SystemPalette; + } +} + +const QPalette *QAndroidPlatformTheme::palette(Palette type) const +{ + QHash<int, QPalette>::const_iterator it = m_androidPlatformNativeInterface->m_palettes.find(paletteType(type)); + if (it != m_androidPlatformNativeInterface->m_palettes.end()) + return &(it.value()); + return 0; +} + +static inline int fontType(QPlatformTheme::Font type) +{ + switch (type) { + case QPlatformTheme::LabelFont: + return QPlatformTheme::SystemFont; + + case QPlatformTheme::ToolButtonFont: + return QPlatformTheme::PushButtonFont; + + default: + return type; + } +} + +const QFont *QAndroidPlatformTheme::font(Font type) const +{ + QHash<int, QFont>::const_iterator it = m_androidPlatformNativeInterface->m_fonts.find(fontType(type)); + if (it != m_androidPlatformNativeInterface->m_fonts.end()) + return &(it.value()); + return 0; +} + +static const QLatin1String STYLES_PATH("/data/data/org.kde.necessitas.ministro/files/dl/style/"); +static const QLatin1String STYLE_FILE("/style.json"); + QVariant QAndroidPlatformTheme::themeHint(ThemeHint hint) const { switch (hint) { case StyleNames: if (qgetenv("QT_USE_ANDROID_NATIVE_STYLE").toInt() && (!qgetenv("MINISTRO_ANDROID_STYLE_PATH").isEmpty() - || QFileInfo("/data/data/org.kde.necessitas.ministro/files/qt/style/style.json").exists())) { + || QFileInfo(STYLES_PATH + + QLatin1String(qgetenv("QT_ANDROID_THEME_DISPLAY_DPI")) + + STYLE_FILE).exists())) { return QStringList("android"); } return QStringList("fusion"); diff --git a/src/plugins/platforms/android/src/qandroidplatformtheme.h b/src/plugins/platforms/android/src/qandroidplatformtheme.h index 263878ee16..15d2cb2000 100644 --- a/src/plugins/platforms/android/src/qandroidplatformtheme.h +++ b/src/plugins/platforms/android/src/qandroidplatformtheme.h @@ -43,14 +43,20 @@ #define QANDROIDPLATFORMTHEME_H #include <qpa/qplatformtheme.h> - +class QAndroidPlatformNativeInterface; class QAndroidPlatformTheme: public QPlatformTheme { public: + QAndroidPlatformTheme(QAndroidPlatformNativeInterface * androidPlatformNativeInterface); virtual QPlatformMenuBar *createPlatformMenuBar() const; virtual QPlatformMenu *createPlatformMenu() const; virtual QPlatformMenuItem *createPlatformMenuItem() const; + virtual const QPalette *palette(Palette type = SystemPalette) const; + virtual const QFont *font(Font type = SystemFont) const; virtual QVariant themeHint(ThemeHint hint) const; + +private: + QAndroidPlatformNativeInterface * m_androidPlatformNativeInterface; }; #endif // QANDROIDPLATFORMTHEME_H diff --git a/src/plugins/platforms/kms/qkmsscreen.cpp b/src/plugins/platforms/kms/qkmsscreen.cpp index 892f7bb01f..fcbf6805d7 100644 --- a/src/plugins/platforms/kms/qkmsscreen.cpp +++ b/src/plugins/platforms/kms/qkmsscreen.cpp @@ -131,7 +131,7 @@ void QKmsScreen::initializeScreenMode() } } if (!mode) - mode = mode = &builtin_1024x768; + mode = &builtin_1024x768; drmModeEncoder *encoder = drmModeGetEncoder(m_device->fd(), connector->encoders[0]); if (encoder == 0) diff --git a/src/plugins/platforms/windows/array.h b/src/plugins/platforms/windows/array.h index 74759231f4..9b7e3a0acb 100644 --- a/src/plugins/platforms/windows/array.h +++ b/src/plugins/platforms/windows/array.h @@ -42,7 +42,8 @@ #ifndef ARRAY_H #define ARRAY_H -#include <QtCore/QtAlgorithms> +#include <QtCore/QtGlobal> +#include <algorithm> QT_BEGIN_NAMESPACE @@ -86,7 +87,7 @@ public: const T *oldData = data; data = new T[capacity]; if (oldData) { - qCopy(oldData, oldData + m_size, data); + std::copy(oldData, oldData + m_size, data); delete [] oldData; } m_capacity = capacity; diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp index 0e6c49aedb..b46b7a1d23 100644 --- a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp +++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp @@ -452,7 +452,8 @@ class QWindowsNativeDialogBase : public QObject Q_OBJECT public: virtual void setWindowTitle(const QString &title) = 0; - virtual void exec(HWND owner = 0) = 0; + bool executed() const { return m_executed; } + void exec(HWND owner = 0) { doExec(owner); m_executed = true; } signals: void accepted(); @@ -462,7 +463,12 @@ public slots: virtual void close() = 0; protected: - QWindowsNativeDialogBase() {} + QWindowsNativeDialogBase() : m_executed(false) {} + +private: + virtual void doExec(HWND owner = 0) = 0; + + bool m_executed; }; /*! @@ -492,18 +498,11 @@ QWindowsDialogHelperBase<BaseClass>::QWindowsDialogHelperBase() : template <class BaseClass> QWindowsNativeDialogBase *QWindowsDialogHelperBase<BaseClass>::nativeDialog() const { - if (!m_nativeDialog) { + if (m_nativeDialog.isNull()) { qWarning("%s invoked with no native dialog present.", __FUNCTION__); return 0; } - return m_nativeDialog; -} - -template <class BaseClass> -void QWindowsDialogHelperBase<BaseClass>::deleteNativeDialog() -{ - delete m_nativeDialog; - m_nativeDialog = 0; + return m_nativeDialog.data(); } template <class BaseClass> @@ -515,10 +514,11 @@ void QWindowsDialogHelperBase<BaseClass>::timerEvent(QTimerEvent *) template <class BaseClass> QWindowsNativeDialogBase *QWindowsDialogHelperBase<BaseClass>::ensureNativeDialog() { - // Create dialog and apply common settings. - if (!m_nativeDialog) - m_nativeDialog = createNativeDialog(); - return m_nativeDialog; + // Create dialog and apply common settings. Check "executed" flag as well + // since for example IFileDialog::Show() works only once. + if (m_nativeDialog.isNull() || m_nativeDialog->executed()) + m_nativeDialog = QWindowsNativeDialogBasePtr(createNativeDialog()); + return m_nativeDialog.data(); } /*! @@ -533,18 +533,22 @@ QWindowsNativeDialogBase *QWindowsDialogHelperBase<BaseClass>::ensureNativeDialo class QWindowsDialogThread : public QThread { public: - QWindowsDialogThread(QPlatformDialogHelper *h) : m_helper(h) {} + typedef QSharedPointer<QWindowsNativeDialogBase> QWindowsNativeDialogBasePtr; + + explicit QWindowsDialogThread(const QWindowsNativeDialogBasePtr &d, HWND owner) + : m_dialog(d), m_owner(owner) {} void run(); private: - QPlatformDialogHelper *m_helper; + const QWindowsNativeDialogBasePtr m_dialog; + const HWND m_owner; }; void QWindowsDialogThread::run() { if (QWindowsContext::verboseDialogs) qDebug(">%s" , __FUNCTION__); - m_helper->exec(); + m_dialog->exec(m_owner); deleteLater(); if (QWindowsContext::verboseDialogs) qDebug("<%s" , __FUNCTION__); @@ -563,7 +567,7 @@ bool QWindowsDialogHelperBase<BaseClass>::show(Qt::WindowFlags, } if (QWindowsContext::verboseDialogs) qDebug("%s modal=%d native=%p parent=%p" , - __FUNCTION__, modal, m_nativeDialog, m_ownerWindow); + __FUNCTION__, modal, m_nativeDialog.data(), m_ownerWindow); if (!modal && !supportsNonModalDialog(parent)) return false; // Was it changed in-between? if (!ensureNativeDialog()) @@ -583,7 +587,8 @@ bool QWindowsDialogHelperBase<BaseClass>::show(Qt::WindowFlags, template <class BaseClass> void QWindowsDialogHelperBase<BaseClass>::startDialogThread() { - QWindowsDialogThread *thread = new QWindowsDialogThread(this); + Q_ASSERT(!m_nativeDialog.isNull()); + QWindowsDialogThread *thread = new QWindowsDialogThread(m_nativeDialog, m_ownerWindow); thread->start(); stopTimer(); } @@ -613,7 +618,7 @@ void QWindowsDialogHelperBase<BaseClass>::exec() stopTimer(); if (QWindowsNativeDialogBase *nd = nativeDialog()) { nd->exec(m_ownerWindow); - deleteNativeDialog(); + m_nativeDialog.clear(); } } @@ -810,7 +815,7 @@ public: inline void setDirectory(const QString &directory); inline void updateDirectory() { setDirectory(m_data.directory().toLocalFile()); } inline QString directory() const; - virtual void exec(HWND owner = 0); + virtual void doExec(HWND owner = 0); virtual void setNameFilters(const QStringList &f); inline void selectNameFilter(const QString &filter); inline void updateSelectedNameFilter() { selectNameFilter(m_data.selectedNameFilter()); } @@ -947,10 +952,12 @@ QString QWindowsNativeFileDialogBase::directory() const return QString(); } -void QWindowsNativeFileDialogBase::exec(HWND owner) +void QWindowsNativeFileDialogBase::doExec(HWND owner) { if (QWindowsContext::verboseDialogs) qDebug(">%s on %p", __FUNCTION__, (void *)owner); + // Show() blocks until the user closes the dialog, the dialog window + // gets a WM_CLOSE or the parent window is destroyed. const HRESULT hr = m_fileDialog->Show(owner); QWindowsDialogs::eatMouseMove(); if (QWindowsContext::verboseDialogs) @@ -1611,7 +1618,7 @@ public: static QWindowsXpNativeFileDialog *create(const OptionsPtr &options, const QWindowsFileDialogSharedData &data); virtual void setWindowTitle(const QString &t) { m_title = t; } - virtual void exec(HWND owner = 0); + virtual void doExec(HWND owner = 0); virtual QPlatformDialogHelper::DialogCode result() const { return m_result; } int existingDirCallback(HWND hwnd, UINT uMsg, LPARAM lParam); @@ -1662,7 +1669,7 @@ QWindowsXpNativeFileDialog::QWindowsXpNativeFileDialog(const OptionsPtr &options setWindowTitle(m_options->windowTitle()); } -void QWindowsXpNativeFileDialog::exec(HWND owner) +void QWindowsXpNativeFileDialog::doExec(HWND owner) { int selectedFilterIndex = -1; const QList<QUrl> selectedFiles = @@ -1948,13 +1955,14 @@ public: explicit QWindowsNativeColorDialog(const SharedPointerColor &color); virtual void setWindowTitle(const QString &) {} - virtual void exec(HWND owner = 0); virtual QPlatformDialogHelper::DialogCode result() const { return m_code; } public slots: virtual void close() {} private: + virtual void doExec(HWND owner = 0); + COLORREF m_customColors[CustomColorCount]; QPlatformDialogHelper::DialogCode m_code; SharedPointerColor m_color; @@ -1966,7 +1974,7 @@ QWindowsNativeColorDialog::QWindowsNativeColorDialog(const SharedPointerColor &c std::fill(m_customColors, m_customColors + 16, COLORREF(0)); } -void QWindowsNativeColorDialog::exec(HWND owner) +void QWindowsNativeColorDialog::doExec(HWND owner) { typedef BOOL (WINAPI *ChooseColorWType)(LPCHOOSECOLORW); diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.h b/src/plugins/platforms/windows/qwindowsdialoghelpers.h index c0ee60cc1e..1501b02bd9 100644 --- a/src/plugins/platforms/windows/qwindowsdialoghelpers.h +++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.h @@ -46,6 +46,7 @@ #include <qpa/qplatformdialoghelper.h> #include <qpa/qplatformtheme.h> #include <QtCore/QStringList> +#include <QtCore/QSharedPointer> QT_BEGIN_NAMESPACE @@ -64,8 +65,9 @@ namespace QWindowsDialogs template <class BaseClass> class QWindowsDialogHelperBase : public BaseClass { + Q_DISABLE_COPY(QWindowsDialogHelperBase) public: - ~QWindowsDialogHelperBase() { deleteNativeDialog(); } + typedef QSharedPointer<QWindowsNativeDialogBase> QWindowsNativeDialogBasePtr; virtual void exec(); virtual bool show(Qt::WindowFlags windowFlags, @@ -79,7 +81,6 @@ protected: QWindowsDialogHelperBase(); QWindowsNativeDialogBase *nativeDialog() const; inline bool hasNativeDialog() const { return m_nativeDialog; } - void deleteNativeDialog(); void timerEvent(QTimerEvent *); private: @@ -88,7 +89,7 @@ private: inline void startDialogThread(); inline void stopTimer(); - QWindowsNativeDialogBase *m_nativeDialog; + QWindowsNativeDialogBasePtr m_nativeDialog; HWND m_ownerWindow; int m_timerId; }; diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp index a6bce6502b..22be4418a9 100644 --- a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp +++ b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp @@ -1759,7 +1759,6 @@ QFontEngine *QWindowsFontDatabase::createEngine(int script, const QFontDef &requ QFontEngine *fe = 0; if (!useDirectWrite) { QWindowsFontEngine *few = new QWindowsFontEngine(request.family, hfont, stockFont, lf, data); - few->setObjectName(QStringLiteral("QWindowsFontEngine_") + request.family); if (preferClearTypeAA) few->glyphFormat = QFontEngineGlyphCache::Raster_RGBMask; @@ -1788,7 +1787,6 @@ QFontEngine *QWindowsFontDatabase::createEngine(int script, const QFontDef &requ request.pixelSize, data); fedw->initFontInfo(request, dpi, directWriteFont); - fedw->setObjectName(QStringLiteral("QWindowsFontEngineDirectWrite_") + request.family); fe = fedw; } else { qErrnoWarning("%s: CreateFontFace failed", __FUNCTION__); @@ -1806,7 +1804,6 @@ QFontEngine *QWindowsFontDatabase::createEngine(int script, const QFontDef &requ QStringList list = family_list; list.append(extraFonts); QFontEngine *mfe = new QWindowsMultiFontEngine(fe, list); - mfe->setObjectName(QStringLiteral("QWindowsMultiFontEngine_") + request.family); mfe->fontDef = fe->fontDef; fe = mfe; } diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp index 6037c201ac..9be0ff9d55 100644 --- a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp +++ b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp @@ -54,6 +54,9 @@ #include <QtGui/QFontDatabase> #include <wchar.h> +#ifdef Q_OS_WINCE +#include <QtEndian> +#endif QT_BEGIN_NAMESPACE @@ -271,6 +274,12 @@ static bool addFontToDatabase(const QString &familyName, uchar charSet, continue; fontCache.insert(fontName, fontFile); settings.setValue(fontName, fontFile); + + if (localizedName(fontName)) { + QString englishFontName = getEnglishName(fontName); + fontCache.insert(englishFontName, fontFile); + settings.setValue(englishFontName, fontFile); + } } value = fontCache.value(faceName); @@ -283,7 +292,11 @@ static bool addFontToDatabase(const QString &familyName, uchar charSet, return false; if (!QDir::isAbsolutePath(value)) +#ifndef Q_OS_WINCE value.prepend(QFile::decodeName(qgetenv("windir") + "\\Fonts\\")); +#else + value.prepend(QFile::decodeName("/Windows/")); +#endif QPlatformFontDatabase::registerFont(faceName, QString(), foundryName, weight, style, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(value, index)); @@ -307,6 +320,24 @@ static bool addFontToDatabase(const QString &familyName, uchar charSet, return true; } +#ifdef Q_OS_WINCE +static QByteArray getFntTable(HFONT hfont, uint tag) +{ + HDC hdc = GetDC(0); + HGDIOBJ oldFont = SelectObject(hdc, hfont); + quint32 t = qFromBigEndian<quint32>(tag); + QByteArray buffer; + + DWORD length = GetFontData(hdc, t, 0, NULL, 0); + if (length != GDI_ERROR) { + buffer.resize(length); + GetFontData(hdc, t, 0, reinterpret_cast<uchar *>(buffer.data()), length); + } + SelectObject(hdc, oldFont); + return buffer; +} +#endif + static int CALLBACK storeFont(ENUMLOGFONTEX* f, NEWTEXTMETRICEX *textmetric, int type, LPARAM namesSetIn) { @@ -316,7 +347,33 @@ static int CALLBACK storeFont(ENUMLOGFONTEX* f, NEWTEXTMETRICEX *textmetric, + QString::fromWCharArray(f->elfFullName); const uchar charSet = f->elfLogFont.lfCharSet; +#ifndef Q_OS_WINCE const FONTSIGNATURE signature = textmetric->ntmFontSig; +#else + FONTSIGNATURE signature; + QByteArray table; + + if (type & TRUETYPE_FONTTYPE) { + HFONT hfont = CreateFontIndirect(&f->elfLogFont); + table = getFntTable(hfont, MAKE_TAG('O', 'S', '/', '2')); + DeleteObject((HGDIOBJ)hfont); + } + + if (table.length() >= 86) { + // See also qfontdatabase_mac.cpp, offsets taken from OS/2 table in the TrueType spec + uchar *tableData = reinterpret_cast<uchar *>(table.data()); + + signature.fsUsb[0] = qFromBigEndian<quint32>(tableData + 42); + signature.fsUsb[1] = qFromBigEndian<quint32>(tableData + 46); + signature.fsUsb[2] = qFromBigEndian<quint32>(tableData + 50); + signature.fsUsb[3] = qFromBigEndian<quint32>(tableData + 54); + + signature.fsCsb[0] = qFromBigEndian<quint32>(tableData + 78); + signature.fsCsb[1] = qFromBigEndian<quint32>(tableData + 82); + } else { + memset(&signature, 0, sizeof(signature)); + } +#endif // NEWTEXTMETRICEX is a NEWTEXTMETRIC, which according to the documentation is // identical to a TEXTMETRIC except for the last four members, which we don't use @@ -501,6 +558,17 @@ QStringList QWindowsFontDatabaseFT::fallbacksForFamily(const QString &family, QF default: result << QString::fromLatin1("Arial"); } + +#ifdef Q_OS_WINCE + QSettings settings(QLatin1String("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\FontLink\\SystemLink"), QSettings::NativeFormat); + const QStringList fontList = settings.value(family).toStringList(); + foreach (const QString &fallback, fontList) { + const int sep = fallback.indexOf(QLatin1Char(',')); + if (sep > 0) + result << fallback.mid(sep + 1); + } +#endif + if (QWindowsContext::verboseFonts) qDebug() << __FUNCTION__ << family << style << styleHint << script << result << m_families; diff --git a/src/plugins/platforms/windows/qwindowsfontengine.cpp b/src/plugins/platforms/windows/qwindowsfontengine.cpp index 64457f4b67..ac57a1b396 100644 --- a/src/plugins/platforms/windows/qwindowsfontengine.cpp +++ b/src/plugins/platforms/windows/qwindowsfontengine.cpp @@ -336,6 +336,13 @@ QWindowsFontEngine::QWindowsFontEngine(const QString &name, if (!resolvedGetCharWidthI) resolveGetCharWidthI(); + + // ### Properties accessed by QWin32PrintEngine (QtPrintSupport) + QVariantMap userData; + userData.insert(QStringLiteral("logFont"), QVariant::fromValue(m_logfont)); + userData.insert(QStringLiteral("hFont"), QVariant::fromValue(hfont)); + userData.insert(QStringLiteral("trueType"), QVariant(bool(ttf))); + setUserData(userData); } QWindowsFontEngine::~QWindowsFontEngine() @@ -1366,7 +1373,7 @@ void QWindowsMultiFontEngine::loadEngine(int at) #endif { QWindowsFontEngine *fe = static_cast<QWindowsFontEngine*>(fontEngine); - lf = fe->logFont(); + lf = fe->m_logfont; data = fe->fontEngineData(); } @@ -1391,8 +1398,6 @@ void QWindowsMultiFontEngine::loadEngine(int at) QWindowsFontEngineDirectWrite *fedw = new QWindowsFontEngineDirectWrite(directWriteFontFace, fontEngine->fontDef.pixelSize, data); - fedw->setObjectName(QStringLiteral("QWindowsFontEngineDirectWrite_") + fontEngine->fontDef.family); - fedw->fontDef = fontDef; fedw->ref.ref(); engines[at] = fedw; diff --git a/src/plugins/platforms/windows/qwindowsfontengine.h b/src/plugins/platforms/windows/qwindowsfontengine.h index 60ff61fcb9..d783b6048c 100644 --- a/src/plugins/platforms/windows/qwindowsfontengine.h +++ b/src/plugins/platforms/windows/qwindowsfontengine.h @@ -68,10 +68,7 @@ class QWindowsFontEngineData; class QWindowsFontEngine : public QFontEngine { - Q_OBJECT - Q_PROPERTY(HFONT hFont READ hFont STORED false) - Q_PROPERTY(LOGFONT logFont READ logFont STORED false) - Q_PROPERTY(bool trueType READ trueType STORED false) + friend class QWindowsMultiFontEngine; public: QWindowsFontEngine(const QString &name, HFONT, bool, LOGFONT, @@ -137,11 +134,6 @@ public: const QSharedPointer<QWindowsFontEngineData> &fontEngineData() const { return m_fontEngineData; } - // Properties accessed by QWin32PrintEngine (Qt Print Support) - LOGFONT logFont() const { return m_logfont; } - HFONT hFont() const { return hfont; } - bool trueType() const { return ttf; } - void setUniqueFamilyName(const QString &newName) { uniqueFamilyName = newName; } private: diff --git a/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.h b/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.h index ab14cb49eb..57a6a3ba1d 100644 --- a/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.h +++ b/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.h @@ -61,7 +61,6 @@ QT_BEGIN_NAMESPACE class QWindowsFontEngineDirectWrite : public QFontEngine { - Q_OBJECT public: explicit QWindowsFontEngineDirectWrite(IDWriteFontFace *directWriteFontFace, qreal pixelSize, diff --git a/src/plugins/platforms/windows/qwindowsinputcontext.cpp b/src/plugins/platforms/windows/qwindowsinputcontext.cpp index 5287b79ac3..a84d30de0f 100644 --- a/src/plugins/platforms/windows/qwindowsinputcontext.cpp +++ b/src/plugins/platforms/windows/qwindowsinputcontext.cpp @@ -56,6 +56,8 @@ #include <QtGui/QPalette> #include <QtGui/QGuiApplication> +#include <algorithm> + QT_BEGIN_NAMESPACE static inline QByteArray debugComposition(int lParam) @@ -583,8 +585,8 @@ int QWindowsInputContext::reconvertString(RECONVERTSTRING *reconv) reconv->dwTargetStrLen = reconv->dwCompStrLen; reconv->dwTargetStrOffset = reconv->dwCompStrOffset; ushort *pastReconv = reinterpret_cast<ushort *>(reconv + 1); - qCopy(surroundingText.utf16(), surroundingText.utf16() + surroundingText.size(), - pastReconv); + std::copy(surroundingText.utf16(), surroundingText.utf16() + surroundingText.size(), + pastReconv); return memSize; } diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp index 754d7a0288..5f1f9cf149 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.cpp +++ b/src/plugins/platforms/windows/qwindowsintegration.cpp @@ -342,6 +342,8 @@ static inline unsigned parseOptions(const QStringList ¶mList) } } else if (param == QLatin1String("gl=gdi")) { options |= QWindowsIntegration::DisableArb; + } else if (param == QLatin1String("mousefromtouch")) { + options |= QWindowsIntegration::PassOsMouseEventsSynthesizedFromTouch; } } return options; @@ -557,13 +559,15 @@ QVariant QWindowsIntegration::styleHint(QPlatformIntegration::StyleHint hint) co break; case QPlatformIntegration::UseRtlExtensions: return QVariant(d->m_context.useRTLExtensions()); -#ifdef Q_OS_WINCE case QPlatformIntegration::SynthesizeMouseFromTouchEvents: +#ifdef Q_OS_WINCE // We do not want Qt to synthesize mouse events as Windows also does that. // Alternatively, Windows-generated touch mouse events can be identified and // ignored by checking GetMessageExtraInfo() for MI_WP_SIGNATURE (0xFF515700). return false; -#endif // Q_OS_WINCE +#else // Q_OS_WINCE + return QVariant(!(d->m_options & PassOsMouseEventsSynthesizedFromTouch)); +#endif // !Q_OS_WINCE default: break; } diff --git a/src/plugins/platforms/windows/qwindowsintegration.h b/src/plugins/platforms/windows/qwindowsintegration.h index ca484415be..b3854d673a 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.h +++ b/src/plugins/platforms/windows/qwindowsintegration.h @@ -58,7 +58,8 @@ public: FontDatabaseNative = 0x2, DisableArb = 0x4, NoNativeDialogs = 0x8, - XpNativeDialogs = 0x10 + XpNativeDialogs = 0x10, + PassOsMouseEventsSynthesizedFromTouch = 0x20 // Pass OS-generated mouse events from touch. }; explicit QWindowsIntegration(const QStringList ¶mList); diff --git a/src/plugins/platforms/windows/qwindowsmousehandler.cpp b/src/plugins/platforms/windows/qwindowsmousehandler.cpp index 43286eadf3..3782b7e020 100644 --- a/src/plugins/platforms/windows/qwindowsmousehandler.cpp +++ b/src/plugins/platforms/windows/qwindowsmousehandler.cpp @@ -169,10 +169,13 @@ bool QWindowsMouseHandler::translateMouseEvent(QWindow *window, HWND hwnd, #ifndef Q_OS_WINCE // Check for events synthesized from touch. Lower byte is touch index, 0 means pen. - const quint64 extraInfo = GetMessageExtraInfo(); - const bool fromTouch = (extraInfo & signatureMask) == miWpSignature && (extraInfo & 0xff); - if (fromTouch) - return false; + static const bool passSynthesizedMouseEvents = QWindowsIntegration::instance()->options() & QWindowsIntegration::PassOsMouseEventsSynthesizedFromTouch; + if (!passSynthesizedMouseEvents) { + const quint64 extraInfo = GetMessageExtraInfo(); + const bool fromTouch = (extraInfo & signatureMask) == miWpSignature && (extraInfo & 0xff); + if (fromTouch) + return false; + } #endif // !Q_OS_WINCE const QPoint winEventPosition(GET_X_LPARAM(msg.lParam), GET_Y_LPARAM(msg.lParam)); diff --git a/src/plugins/platforms/windows/qwindowstheme.cpp b/src/plugins/platforms/windows/qwindowstheme.cpp index 49fdfc15b8..eb1bbd1ab0 100644 --- a/src/plugins/platforms/windows/qwindowstheme.cpp +++ b/src/plugins/platforms/windows/qwindowstheme.cpp @@ -57,7 +57,9 @@ #else # include <commctrl.h> # include <objbase.h> -# include <commoncontrols.h> +# ifndef Q_CC_MINGW +# include <commoncontrols.h> +# endif # include <shellapi.h> #endif @@ -677,7 +679,7 @@ QPixmap QWindowsTheme::fileIconPixmap(const QFileInfo &fileInfo, const QSizeF &s static QCache<QString, FakePointer<int> > dirIconEntryCache(1000); static QMutex mx; - static int defaultFolderIIcon = 0; + static int defaultFolderIIcon = -1; const bool useDefaultFolderIcon = iconOptions & QPlatformTheme::DontUseCustomDirectoryIcons; QPixmap pixmap; @@ -693,8 +695,8 @@ QPixmap QWindowsTheme::fileIconPixmap(const QFileInfo &fileInfo, const QSizeF &s bool cacheableDirIcon = fileInfo.isDir() && !fileInfo.isRoot(); if (cacheableDirIcon) { QMutexLocker locker(&mx); - int iIcon = (useDefaultFolderIcon && defaultFolderIIcon) ? defaultFolderIIcon - : **dirIconEntryCache.object(filePath); + int iIcon = (useDefaultFolderIcon && defaultFolderIIcon >= 0) ? defaultFolderIIcon + : **dirIconEntryCache.object(filePath); if (iIcon) { QPixmapCache::find(dirIconPixmapCacheKey(iIcon, iconSize, requestedImageListSize), pixmap); if (pixmap.isNull()) // Let's keep both caches in sync @@ -726,7 +728,7 @@ QPixmap QWindowsTheme::fileIconPixmap(const QFileInfo &fileInfo, const QSizeF &s if (val && info.hIcon) { QString key; if (cacheableDirIcon) { - if (useDefaultFolderIcon && !defaultFolderIIcon) + if (useDefaultFolderIcon && defaultFolderIIcon < 0) defaultFolderIIcon = info.iIcon; //using the unique icon index provided by windows save us from duplicate keys diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp index 99e9932847..72299d5a9a 100644 --- a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp +++ b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp @@ -66,30 +66,28 @@ # include <stdio.h> #endif +#include <algorithm> + QT_BEGIN_NAMESPACE -class QXcbResourceMap : public QMap<QByteArray, QXcbNativeInterface::ResourceType> +// return QXcbNativeInterface::ResourceType for the key. +static int resourceType(const QByteArray &key) { -public: - QXcbResourceMap() - :QMap<QByteArray, QXcbNativeInterface::ResourceType>() - { - insert("display",QXcbNativeInterface::Display); - insert("egldisplay",QXcbNativeInterface::EglDisplay); - insert("connection",QXcbNativeInterface::Connection); - insert("screen",QXcbNativeInterface::Screen); - insert("eglcontext",QXcbNativeInterface::EglContext); - insert("glxcontext",QXcbNativeInterface::GLXContext); - insert("apptime",QXcbNativeInterface::AppTime); - insert("appusertime",QXcbNativeInterface::AppUserTime); - insert("hintstyle", QXcbNativeInterface::ScreenHintStyle); - insert("startupid", QXcbNativeInterface::StartupId); - insert(QByteArrayLiteral("traywindow"), QXcbNativeInterface::TrayWindow); - insert(QByteArrayLiteral("gettimestamp"), QXcbNativeInterface::GetTimestamp); - } -}; - -Q_GLOBAL_STATIC(QXcbResourceMap, qXcbResourceMap) + static const QByteArray names[] = { // match QXcbNativeInterface::ResourceType + QByteArrayLiteral("display"), QByteArrayLiteral("egldisplay"), + QByteArrayLiteral("connection"), QByteArrayLiteral("screen"), + QByteArrayLiteral("graphicsdevice"), QByteArrayLiteral("eglcontext"), + QByteArrayLiteral("glxcontext"), QByteArrayLiteral("apptime"), + QByteArrayLiteral("appusertime"), QByteArrayLiteral("hintstyle"), + QByteArrayLiteral("startupid"), QByteArrayLiteral("traywindow"), + QByteArrayLiteral("gettimestamp") + }; + const QByteArray *end = names + sizeof(names) / sizeof(names[0]); + const QByteArray *result = std::find(names, end, key); + if (result == end) + result = std::find(names, end, key.toLower()); + return int(result - names); +} QXcbNativeInterface::QXcbNativeInterface() : m_genericEventFilterType(QByteArrayLiteral("xcb_generic_event_t")) @@ -136,13 +134,8 @@ QRect QXcbNativeInterface::systemTrayWindowGlobalGeometry(const QWindow *window) void *QXcbNativeInterface::nativeResourceForIntegration(const QByteArray &resourceString) { - QByteArray lowerCaseResource = resourceString.toLower(); - if (!qXcbResourceMap()->contains(lowerCaseResource)) - return 0; - - ResourceType resource = qXcbResourceMap()->value(lowerCaseResource); void *result = 0; - switch (resource) { + switch (resourceType(resourceString)) { case StartupId: result = startupId(); break; @@ -155,13 +148,8 @@ void *QXcbNativeInterface::nativeResourceForIntegration(const QByteArray &resour void *QXcbNativeInterface::nativeResourceForContext(const QByteArray &resourceString, QOpenGLContext *context) { - QByteArray lowerCaseResource = resourceString.toLower(); - if (!qXcbResourceMap()->contains(lowerCaseResource)) - return 0; - - ResourceType resource = qXcbResourceMap()->value(lowerCaseResource); void *result = 0; - switch(resource) { + switch (resourceType(resourceString)) { case EglContext: result = eglContextForContext(context); break; @@ -177,12 +165,9 @@ void *QXcbNativeInterface::nativeResourceForContext(const QByteArray &resourceSt void *QXcbNativeInterface::nativeResourceForScreen(const QByteArray &resource, QScreen *screen) { - const QXcbResourceMap::const_iterator it = qXcbResourceMap()->constFind(resource.toLower()); - if (it == qXcbResourceMap()->constEnd() || !screen->handle()) - return 0; void *result = 0; const QXcbScreen *xcbScreen = static_cast<QXcbScreen *>(screen->handle()); - switch (it.value()) { + switch (resourceType(resource)) { case Display: #ifdef XCB_USE_XLIB result = xcbScreen->connection()->xlib_display(); @@ -212,13 +197,8 @@ void *QXcbNativeInterface::nativeResourceForScreen(const QByteArray &resource, Q void *QXcbNativeInterface::nativeResourceForWindow(const QByteArray &resourceString, QWindow *window) { - QByteArray lowerCaseResource = resourceString.toLower(); - if (!qXcbResourceMap()->contains(lowerCaseResource)) - return 0; - - ResourceType resource = qXcbResourceMap()->value(lowerCaseResource); void *result = 0; - switch(resource) { + switch (resourceType(resourceString)) { case Display: result = displayForWindow(window); break; |