diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2016-10-28 14:11:21 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2016-10-28 14:14:28 +0000 |
commit | 8cd812455932f896b45aae84c4dc571f60f60b25 (patch) | |
tree | 6c2365856023fbd06c803dbd2607c9226d33bb5c /src/platformsupport | |
parent | e5451f086bb9551527a4f0da06525eef860a53a9 (diff) |
Windows QPA: Do not use QSettings to access the registry
When commenting out the warning in createOrOpenKey()
(src\corelib\io\qsettings_win.cpp:157), applications produce warnings:
QSettings: Failed to create subkey "Software\Microsoft\Windows NT\CurrentVersion\FontSubstitutes": Access is denied.
indicating that an attempt to open the registry in read/write mode fails.
Add a utility function to read out registry strings in read-only mode to
the font database and use that instead.
Change-Id: I4187344cac7ec2ba27f15b51e237575efc171853
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'src/platformsupport')
3 files changed, 29 insertions, 4 deletions
diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp index ad653ab95d..434aa16d16 100644 --- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp @@ -1981,4 +1981,26 @@ int QWindowsFontDatabase::defaultVerticalDPI() return vDPI; } +QString QWindowsFontDatabase::readRegistryString(HKEY parentHandle, const wchar_t *keyPath, const wchar_t *keyName) +{ + QString result; + HKEY handle = 0; + if (RegOpenKeyEx(parentHandle, keyPath, 0, KEY_READ, &handle) == ERROR_SUCCESS) { + // get the size and type of the value + DWORD dataType; + DWORD dataSize; + if (RegQueryValueEx(handle, keyName, 0, &dataType, 0, &dataSize) == ERROR_SUCCESS) { + if (dataType == REG_SZ || dataType == REG_EXPAND_SZ) { + dataSize += 2; // '\0' missing? + QVarLengthArray<unsigned char> data(dataSize); + data[dataSize - 2] = data[dataSize - 1] = '\0'; + if (RegQueryValueEx(handle, keyName, 0, 0, data.data(), &dataSize) == ERROR_SUCCESS) + result = QString::fromWCharArray(reinterpret_cast<const wchar_t *>(data.data())); + } + } + RegCloseKey(handle); + } + return result; +} + QT_END_NAMESPACE diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h index d240f77a66..b7ebfc033f 100644 --- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h @@ -130,6 +130,8 @@ public: static void setFontOptions(unsigned options); static unsigned fontOptions(); + static QString readRegistryString(HKEY parentHandle, const wchar_t *keyPath, const wchar_t *keyName); + private: void populateFamily(const QString &familyName, bool registerAlias); void removeApplicationFonts(); diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp index a1d8c2b9e8..f266e85126 100644 --- a/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp @@ -42,7 +42,6 @@ #include "qwindowsfontenginedirectwrite_p.h" #include "qwindowsfontdatabase_p.h" -#include <QtCore/QSettings> #include <QtCore/QtEndian> #include <QtCore/QVarLengthArray> #include <QtCore/QFile> @@ -915,9 +914,11 @@ void QWindowsFontEngineDirectWrite::initFontInfo(const QFontDef &request, QString QWindowsFontEngineDirectWrite::fontNameSubstitute(const QString &familyName) { - static const char keyC[] = "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\" - "FontSubstitutes"; - return QSettings(QLatin1String(keyC), QSettings::NativeFormat).value(familyName, familyName).toString(); + const wchar_t key[] = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\FontSubstitutes"; + const QString substitute = + QWindowsFontDatabase::readRegistryString(HKEY_LOCAL_MACHINE, key, + reinterpret_cast<const wchar_t *>(familyName.utf16())); + return substitute.isEmpty() ? familyName : substitute; } glyph_metrics_t QWindowsFontEngineDirectWrite::alphaMapBoundingBox(glyph_t glyph, |