Hello community, here is the log from the commit of package libqt5-qtbase for openSUSE:Factory checked in at 2014-10-14 13:24:52 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libqt5-qtbase (Old) and /work/SRC/openSUSE:Factory/.libqt5-qtbase.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libqt5-qtbase" Changes: -------- --- /work/SRC/openSUSE:Factory/libqt5-qtbase/libqt5-qtbase.changes 2014-10-01 11:22:04.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.libqt5-qtbase.new/libqt5-qtbase.changes 2014-10-14 13:25:08.000000000 +0200 @@ -1,0 +2,17 @@ +Sun Oct 12 15:21:11 UTC 2014 - [email protected] + +- Added 0001-QFileDialog-emit-urlsSelected-urlSelected-in-accept.patch, + 0002-QUrl-fromLocalFile-QString-should-lead-to-an-empty-U.patch, + 0003-QFileDialog-turn-workingDirectory-into-a-QUrl.patch and + 0004-QFileDialog-implement-getOpenFileUrl-and-friends-for.patch + from upstream to improve QFileDialog behaviour with both local + and remote URL's +- Added 0001-QKdeTheme-use-system-wide-kdeglobals-as-a-fallback.patch: + QTBUG-36184 +- Added 0001-Add-QFont-strategy-to-disable-subpixel-antialiasing.patch, + 0002-Move-SubpixelAntialiasingType-from-QFontEngineFT-to-.patch, + 0003-Support-autohint-and-lcdfilter-fontconfig-configurat.patch + and 0004-GTK2-theme-should-use-GTK-configured-font-variant.patch + QTBUG-40396, QTBUG-32254, QTBUG-39643 + +------------------------------------------------------------------- New: ---- 0001-Add-QFont-strategy-to-disable-subpixel-antialiasing.patch 0001-QFileDialog-emit-urlsSelected-urlSelected-in-accept.patch 0001-QKdeTheme-use-system-wide-kdeglobals-as-a-fallback.patch 0002-Move-SubpixelAntialiasingType-from-QFontEngineFT-to-.patch 0002-QUrl-fromLocalFile-QString-should-lead-to-an-empty-U.patch 0003-QFileDialog-turn-workingDirectory-into-a-QUrl.patch 0003-Support-autohint-and-lcdfilter-fontconfig-configurat.patch 0004-GTK2-theme-should-use-GTK-configured-font-variant.patch 0004-QFileDialog-implement-getOpenFileUrl-and-friends-for.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libqt5-qtbase.spec ++++++ --- /var/tmp/diff_new_pack.O7dAW9/_old 2014-10-14 13:25:09.000000000 +0200 +++ /var/tmp/diff_new_pack.O7dAW9/_new 2014-10-14 13:25:09.000000000 +0200 @@ -60,6 +60,24 @@ Patch2003: 00010-Replace-the-const-QString-global-static-with-a-QStri.patch # PATCH-FIX-UPSTREAM 00011-Use-correct-signal-name-when-disconnecting.patch Patch2004: 00011-Use-correct-signal-name-when-disconnecting.patch +# PATCH-FIX-UPSTREAM 0001-QFileDialog-emit-urlsSelected-urlSelected-in-accept.patch +Patch2005: 0001-QFileDialog-emit-urlsSelected-urlSelected-in-accept.patch +# PATCH-FIX-UPSTREAM 0002-QUrl-fromLocalFile-QString-should-lead-to-an-empty-U.patch +Patch2006: 0002-QUrl-fromLocalFile-QString-should-lead-to-an-empty-U.patch +# PATCH-FIX-UPSTREAM 0003-QFileDialog-turn-workingDirectory-into-a-QUrl.patch +Patch2007: 0003-QFileDialog-turn-workingDirectory-into-a-QUrl.patch +# PATCH-FIX-UPSTREAM 0004-QFileDialog-implement-getOpenFileUrl-and-friends-for.patch +Patch2008: 0004-QFileDialog-implement-getOpenFileUrl-and-friends-for.patch +# PATCH-FIX-UPSTREAM 0001-QKdeTheme-use-system-wide-kdeglobals-as-a-fallback.patch +Patch2009: 0001-QKdeTheme-use-system-wide-kdeglobals-as-a-fallback.patch +# PATCH-FIX-UPSTREAM 0001-Add-QFont-strategy-to-disable-subpixel-antialiasing.patch +Patch2010: 0001-Add-QFont-strategy-to-disable-subpixel-antialiasing.patch +# PATCH-FIX-UPSTREAM 0002-Move-SubpixelAntialiasingType-from-QFontEngineFT-to-.patch +Patch2011: 0002-Move-SubpixelAntialiasingType-from-QFontEngineFT-to-.patch +# PATCH-FIX-UPSTREAM 0003-Support-autohint-and-lcdfilter-fontconfig-configurat.patch +Patch2012: 0003-Support-autohint-and-lcdfilter-fontconfig-configurat.patch +# PATCH-FIX-UPSTREAM 0004-GTK2-theme-should-use-GTK-configured-font-variant.patch +Patch2013: 0004-GTK2-theme-should-use-GTK-configured-font-variant.patch BuildRequires: alsa-devel BuildRequires: cups-devel BuildRequires: fdupes @@ -149,6 +167,15 @@ %patch2002 -p1 %patch2003 -p1 %patch2004 -p1 +%patch2005 -p1 +%patch2006 -p1 +%patch2007 -p1 +%patch2008 -p1 +%patch2009 -p1 +%patch2010 -p1 +%patch2011 -p1 +%patch2012 -p1 +%patch2013 -p1 # be sure not to use them rm -r src/3rdparty/{libjpeg,freetype,libpng,zlib} ++++++ 0001-Add-QFont-strategy-to-disable-subpixel-antialiasing.patch ++++++ >From 820b20e593b7b0d92e6a78e7b23457f321aa0bc1 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen <[email protected]> Date: Thu, 24 Jul 2014 14:33:00 +0200 Subject: [PATCH 1/4] Add QFont strategy to disable subpixel antialiasing This patch adds the option to disable subpixel antialiasing on QFont basis. This can be useful when painting to offscreen surfaces. On OS X this option disables the aggressive LCD font smoothing, which can be necessary for certain fonts it may otherwise ruin. Task-number: QTBUG-40396 Change-Id: I1664b636520ae63ee1503b5df7436748106b9f5c Reviewed-by: Eskil Abrahamsen Blomfeldt <[email protected]> (cherry picked from commit 7ff4621100b3df7ba9b336ac60204da4b548e642) --- src/gui/text/qfont.cpp | 1 + src/gui/text/qfont.h | 1 + .../fontdatabases/fontconfig/qfontconfigdatabase.cpp | 4 +++- src/plugins/platforms/cocoa/qpaintengine_mac.mm | 7 +++++++ src/plugins/platforms/windows/qwindowsfontdatabase.cpp | 4 +++- 5 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/gui/text/qfont.cpp b/src/gui/text/qfont.cpp index cf40dd0..82676d7 100644 --- a/src/gui/text/qfont.cpp +++ b/src/gui/text/qfont.cpp @@ -1376,6 +1376,7 @@ QFont::StyleHint QFont::styleHint() const \value PreferOutline prefers outline fonts (as opposed to bitmap fonts). \value ForceOutline forces the use of outline fonts. \value NoAntialias don't antialias the fonts. + \value NoSubpixelAntialias avoid subpixel antialiasing on the fonts if possible. \value PreferAntialias antialias if possible. \value OpenGLCompatible forces the use of OpenGL compatible fonts. diff --git a/src/gui/text/qfont.h b/src/gui/text/qfont.h index 7fbaf24..f48f4cf 100644 --- a/src/gui/text/qfont.h +++ b/src/gui/text/qfont.h @@ -83,6 +83,7 @@ public: NoAntialias = 0x0100, OpenGLCompatible = 0x0200, ForceIntegerMetrics = 0x0400, + NoSubpixelAntialias = 0x0800, NoFontMerging = 0x8000 }; diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp index b8da972..e10e10b 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp +++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp @@ -634,7 +634,9 @@ QFontEngine *QFontconfigDatabase::fontEngine(const QFontDef &f, void *usrPtr) } if (antialias) { - QFontEngineFT::SubpixelAntialiasingType subpixelType = subpixelTypeFromMatch(match); + QFontEngineFT::SubpixelAntialiasingType subpixelType = QFontEngineFT::Subpixel_None; + if (!(f.styleStrategy & QFont::NoSubpixelAntialias)) + subpixelType = subpixelTypeFromMatch(match); engine->subpixelType = subpixelType; format = (subpixelType == QFontEngineFT::Subpixel_None) diff --git a/src/plugins/platforms/cocoa/qpaintengine_mac.mm b/src/plugins/platforms/cocoa/qpaintengine_mac.mm index f4cd071..d48cbdf 100644 --- a/src/plugins/platforms/cocoa/qpaintengine_mac.mm +++ b/src/plugins/platforms/cocoa/qpaintengine_mac.mm @@ -1084,6 +1084,10 @@ void QCoreGraphicsPaintEngine::drawTextItem(const QPointF &pos, const QTextItem if (textAA != lineAA) CGContextSetShouldAntialias(d->hd, textAA); + const bool smoothing = textAA && !(fe->fontDef.styleStrategy & QFont::NoSubpixelAntialias); + if (d->disabledSmoothFonts == smoothing) + CGContextSetShouldSmoothFonts(d->hd, smoothing); + if (ti.glyphs.numGlyphs) { switch (fe->type()) { case QFontEngine::Mac: @@ -1100,6 +1104,9 @@ void QCoreGraphicsPaintEngine::drawTextItem(const QPointF &pos, const QTextItem if (textAA != lineAA) CGContextSetShouldAntialias(d->hd, !textAA); + if (smoothing == d->disabledSmoothFonts) + CGContextSetShouldSmoothFonts(d->hd, !d->disabledSmoothFonts); + updatePen(oldPen); updateBrush(oldBrush, oldBrushOrigin); } diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp index f30dcba..27262ec 100644 --- a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp +++ b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp @@ -1521,13 +1521,15 @@ LOGFONT QWindowsFontDatabase::fontDefToLOGFONT(const QFontDef &request) #endif if (request.styleStrategy & QFont::PreferAntialias) { - if (QSysInfo::WindowsVersion >= QSysInfo::WV_XP) { + if (QSysInfo::WindowsVersion >= QSysInfo::WV_XP && !(request.styleStrategy & QFont::NoSubpixelAntialias)) { qual = CLEARTYPE_QUALITY; } else { qual = ANTIALIASED_QUALITY; } } else if (request.styleStrategy & QFont::NoAntialias) { qual = NONANTIALIASED_QUALITY; + } else if ((request.styleStrategy & QFont::NoSubpixelAntialias) && sharedFontData()->clearTypeEnabled) { + qual = ANTIALIASED_QUALITY; } lf.lfQuality = qual; -- 2.1.1 ++++++ 0001-QFileDialog-emit-urlsSelected-urlSelected-in-accept.patch ++++++ >From 9879e5b90b1babcf38236d2c46c187eacf613711 Mon Sep 17 00:00:00 2001 From: David Faure <[email protected]> Date: Wed, 9 Jul 2014 11:24:16 +0200 Subject: [PATCH 1/4] QFileDialog: emit urlsSelected+urlSelected in accept(). Not just filesSelected+fileSelected (which only happens for local files). Change-Id: Ife592c3c921231356f96cbc2871b6d724a15d2c8 Reviewed-by: Friedemann Kleint <[email protected]> (cherry picked from commit da088c5ace607904ec817033d2d48c689ff4816a) --- src/widgets/dialogs/qfiledialog.cpp | 21 +++++++++++++-------- src/widgets/dialogs/qfiledialog.h | 4 ++-- src/widgets/dialogs/qfiledialog_p.h | 4 ++-- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp index 9219757..037964b 100644 --- a/src/widgets/dialogs/qfiledialog.cpp +++ b/src/widgets/dialogs/qfiledialog.cpp @@ -577,8 +577,8 @@ QFileDialogPrivate::~QFileDialogPrivate() void QFileDialogPrivate::initHelper(QPlatformDialogHelper *h) { QFileDialog *d = q_func(); - QObject::connect(h, SIGNAL(fileSelected(QUrl)), d, SLOT(_q_nativeFileSelected(QUrl))); - QObject::connect(h, SIGNAL(filesSelected(QList<QUrl>)), d, SLOT(_q_nativeFilesSelected(QList<QUrl>))); + QObject::connect(h, SIGNAL(fileSelected(QUrl)), d, SLOT(_q_emitUrlSelected(QUrl))); + QObject::connect(h, SIGNAL(filesSelected(QList<QUrl>)), d, SLOT(_q_emitUrlsSelected(QList<QUrl>))); QObject::connect(h, SIGNAL(currentChanged(QUrl)), d, SLOT(_q_nativeCurrentChanged(QUrl))); QObject::connect(h, SIGNAL(directoryEntered(QUrl)), d, SLOT(_q_nativeEnterDirectory(QUrl))); QObject::connect(h, SIGNAL(filterSelected(QString)), d, SIGNAL(filterSelected(QString))); @@ -2607,15 +2607,20 @@ void QFileDialog::done(int result) void QFileDialog::accept() { Q_D(QFileDialog); - QStringList files = selectedFiles(); - if (files.isEmpty()) - return; if (!d->usingWidgets()) { - d->emitFilesSelected(files); + const QList<QUrl> urls = selectedUrls(); + if (urls.isEmpty()) + return; + d->_q_emitUrlsSelected(urls); + if (urls.count() == 1) + d->_q_emitUrlSelected(urls.first()); QDialog::accept(); return; } + QStringList files = selectedFiles(); + if (files.isEmpty()) + return; QString lineEditText = d->lineEdit()->text(); // "hidden feature" type .. and then enter, and it will move up a dir // special case for ".." @@ -3646,7 +3651,7 @@ void QFileDialogPrivate::_q_fileRenamed(const QString &path, const QString oldNa } } -void QFileDialogPrivate::_q_nativeFileSelected(const QUrl &file) +void QFileDialogPrivate::_q_emitUrlSelected(const QUrl &file) { Q_Q(QFileDialog); emit q->urlSelected(file); @@ -3654,7 +3659,7 @@ void QFileDialogPrivate::_q_nativeFileSelected(const QUrl &file) emit q->fileSelected(file.toLocalFile()); } -void QFileDialogPrivate::_q_nativeFilesSelected(const QList<QUrl> &files) +void QFileDialogPrivate::_q_emitUrlsSelected(const QList<QUrl> &files) { Q_Q(QFileDialog); emit q->urlsSelected(files); diff --git a/src/widgets/dialogs/qfiledialog.h b/src/widgets/dialogs/qfiledialog.h index 404e16c..184e072 100644 --- a/src/widgets/dialogs/qfiledialog.h +++ b/src/widgets/dialogs/qfiledialog.h @@ -287,8 +287,8 @@ private: Q_PRIVATE_SLOT(d_func(), void _q_updateOkButton()) Q_PRIVATE_SLOT(d_func(), void _q_currentChanged(const QModelIndex &index)) Q_PRIVATE_SLOT(d_func(), void _q_enterDirectory(const QModelIndex &index)) - Q_PRIVATE_SLOT(d_func(), void _q_nativeFileSelected(const QUrl &)) - Q_PRIVATE_SLOT(d_func(), void _q_nativeFilesSelected(const QList<QUrl> &)) + Q_PRIVATE_SLOT(d_func(), void _q_emitUrlSelected(const QUrl &)) + Q_PRIVATE_SLOT(d_func(), void _q_emitUrlsSelected(const QList<QUrl> &)) Q_PRIVATE_SLOT(d_func(), void _q_nativeCurrentChanged(const QUrl &)) Q_PRIVATE_SLOT(d_func(), void _q_nativeEnterDirectory(const QUrl&)) Q_PRIVATE_SLOT(d_func(), void _q_goToDirectory(const QString &path)) diff --git a/src/widgets/dialogs/qfiledialog_p.h b/src/widgets/dialogs/qfiledialog_p.h index 632bbca..9e1c23b 100644 --- a/src/widgets/dialogs/qfiledialog_p.h +++ b/src/widgets/dialogs/qfiledialog_p.h @@ -210,8 +210,8 @@ public: void _q_updateOkButton(); void _q_currentChanged(const QModelIndex &index); void _q_enterDirectory(const QModelIndex &index); - void _q_nativeFileSelected(const QUrl &file); - void _q_nativeFilesSelected(const QList<QUrl> &files); + void _q_emitUrlSelected(const QUrl &file); + void _q_emitUrlsSelected(const QList<QUrl> &files); void _q_nativeCurrentChanged(const QUrl &file); void _q_nativeEnterDirectory(const QUrl &directory); void _q_goToDirectory(const QString &); -- 2.1.1 ++++++ 0001-QKdeTheme-use-system-wide-kdeglobals-as-a-fallback.patch ++++++ >From 17bc5a22d5b3c289478f6fb91cd344708d957078 Mon Sep 17 00:00:00 2001 From: J-P Nurmi <[email protected]> Date: Thu, 6 Feb 2014 17:14:25 +0100 Subject: [PATCH 1/1] QKdeTheme: use system-wide kdeglobals as a fallback Determine KDE prefixes in the following priority order: - KDEHOME and KDEDIRS environment variables - ~/.kde(<version>) - read prefixes from /etc/kde<version>rc - fallback to /etc/kde<version> Task-number: QTBUG-36184 Change-Id: I9010ea485f1954b21bda73b02993dbddef67eb1d Reviewed-by: Dominik Holland <[email protected]> Reviewed-by: David Faure <[email protected]> (cherry picked from commit eedd300b0ecf83a365f48c084e09f1446238e157) --- .../themes/genericunix/qgenericunixthemes.cpp | 167 +++++++++++++-------- .../themes/genericunix/qgenericunixthemes_p.h | 2 +- 2 files changed, 103 insertions(+), 66 deletions(-) diff --git a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp index b68aa85..dac417a 100644 --- a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp +++ b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp @@ -51,6 +51,7 @@ #include <QtCore/QFileInfo> #include <QtCore/QFile> #include <QtCore/QDebug> +#include <QtCore/QHash> #include <QtCore/QSettings> #include <QtCore/QVariant> #include <QtCore/QStringList> @@ -171,26 +172,26 @@ QVariant QGenericUnixTheme::themeHint(ThemeHint hint) const class QKdeThemePrivate : public QPlatformThemePrivate { public: - QKdeThemePrivate(const QString &kdeHome, int kdeVersion) - : kdeHome(kdeHome) + QKdeThemePrivate(const QStringList &kdeDirs, int kdeVersion) + : kdeDirs(kdeDirs) , kdeVersion(kdeVersion) , toolButtonStyle(Qt::ToolButtonTextBesideIcon) , toolBarIconSize(0) , singleClick(true) { } - QString globalSettingsFile() const + static QString kdeGlobals(const QString &kdeDir) { - return kdeHome + QStringLiteral("/share/config/kdeglobals"); + return kdeDir + QStringLiteral("/share/config/kdeglobals"); } void refresh(); - static void readKdeSystemPalette(const QSettings &kdeSettings, QPalette *pal); - static QFont *readKdeFontSetting(const QSettings &settings, const QString &key); - static QStringList kdeIconThemeSearchPaths(const QString &kdeHome); + static QVariant readKdeSetting(const QString &key, const QStringList &kdeDirs, QHash<QString, QSettings*> &kdeSettings); + static void readKdeSystemPalette(const QStringList &kdeDirs, QHash<QString, QSettings*> &kdeSettings, QPalette *pal); + static QFont *kdeFont(const QVariant &fontValue); + static QStringList kdeIconThemeSearchPaths(const QStringList &kdeDirs); - - const QString kdeHome; + const QStringList kdeDirs; const int kdeVersion; ResourceHelper resources; @@ -212,36 +213,33 @@ void QKdeThemePrivate::refresh() styleNames << QStringLiteral("Oxygen") << QStringLiteral("fusion") << QStringLiteral("windows"); iconFallbackThemeName = iconThemeName = QStringLiteral("oxygen"); - // Read settings file. - const QString settingsFile = globalSettingsFile(); - if (!QFileInfo(settingsFile).isReadable()) - return; - - const QSettings kdeSettings(settingsFile, QSettings::IniFormat); + QHash<QString, QSettings*> kdeSettings; QPalette systemPalette = QPalette(); - readKdeSystemPalette(kdeSettings, &systemPalette); + readKdeSystemPalette(kdeDirs, kdeSettings, &systemPalette); resources.palettes[QPlatformTheme::SystemPalette] = new QPalette(systemPalette); //## TODO tooltip color - const QVariant styleValue = kdeSettings.value(QStringLiteral("widgetStyle")); + const QVariant styleValue = readKdeSetting(QStringLiteral("widgetStyle"), kdeDirs, kdeSettings); if (styleValue.isValid()) { const QString style = styleValue.toString(); if (style != styleNames.front()) styleNames.push_front(style); } - singleClick = kdeSettings.value(QStringLiteral("KDE/SingleClick"), true).toBool(); + const QVariant singleClickValue = readKdeSetting(QStringLiteral("KDE/SingleClick"), kdeDirs, kdeSettings); + if (singleClickValue.isValid()) + singleClick = singleClickValue.toBool(); - const QVariant themeValue = kdeSettings.value(QStringLiteral("Icons/Theme")); + const QVariant themeValue = readKdeSetting(QStringLiteral("Icons/Theme"), kdeDirs, kdeSettings); if (themeValue.isValid()) iconThemeName = themeValue.toString(); - const QVariant toolBarIconSizeValue = kdeSettings.value(QStringLiteral("ToolbarIcons/Size")); + const QVariant toolBarIconSizeValue = readKdeSetting(QStringLiteral("ToolbarIcons/Size"), kdeDirs, kdeSettings); if (toolBarIconSizeValue.isValid()) toolBarIconSize = toolBarIconSizeValue.toInt(); - const QVariant toolbarStyleValue = kdeSettings.value(QStringLiteral("ToolButtonStyle")); + const QVariant toolbarStyleValue = readKdeSetting(QStringLiteral("Toolbar style/ToolButtonStyle"), kdeDirs, kdeSettings); if (toolbarStyleValue.isValid()) { const QString toolBarStyle = toolbarStyleValue.toString(); if (toolBarStyle == QStringLiteral("TextBesideIcon")) @@ -253,26 +251,46 @@ void QKdeThemePrivate::refresh() } // Read system font, ignore 'smallestReadableFont' - if (QFont *systemFont = readKdeFontSetting(kdeSettings, QStringLiteral("font"))) + if (QFont *systemFont = kdeFont(readKdeSetting(QStringLiteral("font"), kdeDirs, kdeSettings))) resources.fonts[QPlatformTheme::SystemFont] = systemFont; else resources.fonts[QPlatformTheme::SystemFont] = new QFont(QLatin1String(defaultSystemFontNameC), defaultSystemFontSize); - if (QFont *fixedFont = readKdeFontSetting(kdeSettings, QStringLiteral("fixed"))) { + if (QFont *fixedFont = kdeFont(readKdeSetting(QStringLiteral("fixed"), kdeDirs, kdeSettings))) { resources.fonts[QPlatformTheme::FixedFont] = fixedFont; } else { fixedFont = new QFont(QLatin1String(defaultSystemFontNameC), defaultSystemFontSize); fixedFont->setStyleHint(QFont::TypeWriter); resources.fonts[QPlatformTheme::FixedFont] = fixedFont; } + + qDeleteAll(kdeSettings); +} + +QVariant QKdeThemePrivate::readKdeSetting(const QString &key, const QStringList &kdeDirs, QHash<QString, QSettings*> &kdeSettings) +{ + foreach (const QString &kdeDir, kdeDirs) { + QSettings *settings = kdeSettings.value(kdeDir); + if (!settings) { + const QString kdeGlobalsPath = kdeGlobals(kdeDir); + if (QFileInfo(kdeGlobalsPath).isReadable()) { + settings = new QSettings(kdeGlobalsPath, QSettings::IniFormat); + kdeSettings.insert(kdeDir, settings); + } + } + if (settings) { + const QVariant value = settings->value(key); + if (value.isValid()) + return value; + } + } + return QVariant(); } // Reads the color from the KDE configuration, and store it in the // palette with the given color role if found. -static inline bool kdeColor(QPalette *pal, QPalette::ColorRole role, - const QSettings &kdeSettings, const QString &key) +static inline bool kdeColor(QPalette *pal, QPalette::ColorRole role, const QVariant &value) { - const QVariant value = kdeSettings.value(key); if (!value.isValid()) return false; const QStringList values = value.toStringList(); @@ -282,9 +300,9 @@ static inline bool kdeColor(QPalette *pal, QPalette::ColorRole role, return true; } -void QKdeThemePrivate::readKdeSystemPalette(const QSettings &kdeSettings, QPalette *pal) +void QKdeThemePrivate::readKdeSystemPalette(const QStringList &kdeDirs, QHash<QString, QSettings*> &kdeSettings, QPalette *pal) { - if (!kdeSettings.contains(QStringLiteral("Colors:Button/BackgroundNormal"))) { + if (!kdeColor(pal, QPalette::Button, readKdeSetting(QStringLiteral("Colors:Button/BackgroundNormal"), kdeDirs, kdeSettings))) { // kcolorscheme.cpp: SetDefaultColors const QColor defaultWindowBackground(214, 210, 208); const QColor defaultButtonBackground(223, 220, 217); @@ -292,19 +310,18 @@ void QKdeThemePrivate::readKdeSystemPalette(const QSettings &kdeSettings, QPalet return; } - kdeColor(pal, QPalette::Button, kdeSettings, QStringLiteral("Colors:Button/BackgroundNormal")); - kdeColor(pal, QPalette::Window, kdeSettings, QStringLiteral("Colors:Window/BackgroundNormal")); - kdeColor(pal, QPalette::Text, kdeSettings, QStringLiteral("Colors:View/ForegroundNormal")); - kdeColor(pal, QPalette::WindowText, kdeSettings, QStringLiteral("Colors:Window/ForegroundNormal")); - kdeColor(pal, QPalette::Base, kdeSettings, QStringLiteral("Colors:View/BackgroundNormal")); - kdeColor(pal, QPalette::Highlight, kdeSettings, QStringLiteral("Colors:Selection/BackgroundNormal")); - kdeColor(pal, QPalette::HighlightedText, kdeSettings, QStringLiteral("Colors:Selection/ForegroundNormal")); - kdeColor(pal, QPalette::AlternateBase, kdeSettings, QStringLiteral("Colors:View/BackgroundAlternate")); - kdeColor(pal, QPalette::ButtonText, kdeSettings, QStringLiteral("Colors:Button/ForegroundNormal")); - kdeColor(pal, QPalette::Link, kdeSettings, QStringLiteral("Colors:View/ForegroundLink")); - kdeColor(pal, QPalette::LinkVisited, kdeSettings, QStringLiteral("Colors:View/ForegroundVisited")); - kdeColor(pal, QPalette::ToolTipBase, kdeSettings, QStringLiteral("Colors:Tooltip/BackgroundNormal")); - kdeColor(pal, QPalette::ToolTipText, kdeSettings, QStringLiteral("Colors:Tooltip/ForegroundNormal")); + kdeColor(pal, QPalette::Window, readKdeSetting(QStringLiteral("Colors:Window/BackgroundNormal"), kdeDirs, kdeSettings)); + kdeColor(pal, QPalette::Text, readKdeSetting(QStringLiteral("Colors:View/ForegroundNormal"), kdeDirs, kdeSettings)); + kdeColor(pal, QPalette::WindowText, readKdeSetting(QStringLiteral("Colors:Window/ForegroundNormal"), kdeDirs, kdeSettings)); + kdeColor(pal, QPalette::Base, readKdeSetting(QStringLiteral("Colors:View/BackgroundNormal"), kdeDirs, kdeSettings)); + kdeColor(pal, QPalette::Highlight, readKdeSetting(QStringLiteral("Colors:Selection/BackgroundNormal"), kdeDirs, kdeSettings)); + kdeColor(pal, QPalette::HighlightedText, readKdeSetting(QStringLiteral("Colors:Selection/ForegroundNormal"), kdeDirs, kdeSettings)); + kdeColor(pal, QPalette::AlternateBase, readKdeSetting(QStringLiteral("Colors:View/BackgroundAlternate"), kdeDirs, kdeSettings)); + kdeColor(pal, QPalette::ButtonText, readKdeSetting(QStringLiteral("Colors:Button/ForegroundNormal"), kdeDirs, kdeSettings)); + kdeColor(pal, QPalette::Link, readKdeSetting(QStringLiteral("Colors:View/ForegroundLink"), kdeDirs, kdeSettings)); + kdeColor(pal, QPalette::LinkVisited, readKdeSetting(QStringLiteral("Colors:View/ForegroundVisited"), kdeDirs, kdeSettings)); + kdeColor(pal, QPalette::ToolTipBase, readKdeSetting(QStringLiteral("Colors:Tooltip/BackgroundNormal"), kdeDirs, kdeSettings)); + kdeColor(pal, QPalette::ToolTipText, readKdeSetting(QStringLiteral("Colors:Tooltip/ForegroundNormal"), kdeDirs, kdeSettings)); // The above code sets _all_ color roles to "normal" colors. In KDE, the disabled // color roles are calculated by applying various effects described in kdeglobals. @@ -347,15 +364,14 @@ void QKdeThemePrivate::readKdeSystemPalette(const QSettings &kdeSettings, QPalet const char *QKdeTheme::name = "kde"; -QKdeTheme::QKdeTheme(const QString &kdeHome, int kdeVersion) - : QPlatformTheme(new QKdeThemePrivate(kdeHome,kdeVersion)) +QKdeTheme::QKdeTheme(const QStringList& kdeDirs, int kdeVersion) + : QPlatformTheme(new QKdeThemePrivate(kdeDirs,kdeVersion)) { d_func()->refresh(); } -QFont *QKdeThemePrivate::readKdeFontSetting(const QSettings &settings, const QString &key) +QFont *QKdeThemePrivate::kdeFont(const QVariant &fontValue) { - const QVariant fontValue = settings.value(key); if (fontValue.isValid()) { // Read font value: Might be a QStringList as KDE stores fonts without quotes. // Also retrieve the family for the constructor since we cannot use the @@ -382,16 +398,11 @@ QFont *QKdeThemePrivate::readKdeFontSetting(const QSettings &settings, const QSt } -QStringList QKdeThemePrivate::kdeIconThemeSearchPaths(const QString &kdeHome) +QStringList QKdeThemePrivate::kdeIconThemeSearchPaths(const QStringList &kdeDirs) { - QStringList candidates = QStringList(kdeHome); - const QString kdeDirs = QFile::decodeName(qgetenv("KDEDIRS")); - if (!kdeDirs.isEmpty()) - candidates.append(kdeDirs.split(QLatin1Char(':'))); - QStringList paths = QGenericUnixTheme::xdgIconThemePaths(); const QString iconPath = QStringLiteral("/share/icons"); - foreach (const QString &candidate, candidates) { + foreach (const QString &candidate, kdeDirs) { const QFileInfo fi(candidate + iconPath); if (fi.isDir()) paths.append(fi.absoluteFilePath()); @@ -418,7 +429,7 @@ QVariant QKdeTheme::themeHint(QPlatformTheme::ThemeHint hint) const case QPlatformTheme::SystemIconFallbackThemeName: return QVariant(d->iconFallbackThemeName); case QPlatformTheme::IconThemeSearchPaths: - return QVariant(d->kdeIconThemeSearchPaths(d->kdeHome)); + return QVariant(d->kdeIconThemeSearchPaths(d->kdeDirs)); case QPlatformTheme::StyleNames: return QVariant(d->styleNames); case QPlatformTheme::KeyboardScheme: @@ -445,26 +456,52 @@ const QFont *QKdeTheme::font(Font type) const QPlatformTheme *QKdeTheme::createKdeTheme() { - // Check for version >= 4 and determine home folder from environment, - // defaulting to ~/.kde<version>, ~/.kde const QByteArray kdeVersionBA = qgetenv("KDE_SESSION_VERSION"); const int kdeVersion = kdeVersionBA.toInt(); if (kdeVersion < 4) return 0; - const QString kdeHomePathVar = QString::fromLocal8Bit(qgetenv("KDEHOME")); + + // Determine KDE prefixes in the following priority order: + // - KDEHOME and KDEDIRS environment variables + // - ~/.kde(<version>) + // - read prefixes from /etc/kde<version>rc + // - fallback to /etc/kde<version> + + QStringList kdeDirs; + const QString kdeHomePathVar = QFile::decodeName(qgetenv("KDEHOME")); if (!kdeHomePathVar.isEmpty()) - return new QKdeTheme(kdeHomePathVar, kdeVersion); + kdeDirs += kdeHomePathVar; + + const QString kdeDirsVar = QFile::decodeName(qgetenv("KDEDIRS")); + if (!kdeDirsVar.isEmpty()) + kdeDirs += kdeDirsVar.split(QLatin1Char(':'), QString::SkipEmptyParts); + + const QString kdeVersionHomePath = QDir::homePath() + QStringLiteral("/.kde") + QLatin1String(kdeVersionBA); + if (QFileInfo(kdeVersionHomePath).isDir()) + kdeDirs += kdeVersionHomePath; - const QString kdeVersionHomePath = QDir::homePath() + QStringLiteral("/.kde") + QLatin1String(kdeVersionBA); - if (QFileInfo(kdeVersionHomePath).isDir()) - return new QKdeTheme(kdeVersionHomePath, kdeVersion); + const QString kdeHomePath = QDir::homePath() + QStringLiteral("/.kde"); + if (QFileInfo(kdeHomePath).isDir()) + kdeDirs += kdeHomePath; - const QString kdeHomePath = QDir::homePath() + QStringLiteral("/.kde"); - if (QFileInfo(kdeHomePath).isDir()) - return new QKdeTheme(kdeHomePath, kdeVersion); + const QString kdeRcPath = QStringLiteral("/etc/kde") + QLatin1String(kdeVersionBA) + QStringLiteral("rc"); + if (QFileInfo(kdeRcPath).isReadable()) { + QSettings kdeSettings(kdeRcPath, QSettings::IniFormat); + kdeSettings.beginGroup(QStringLiteral("Directories-default")); + kdeDirs += kdeSettings.value(QStringLiteral("prefixes")).toStringList(); + } + + const QString kdeVersionPrefix = QStringLiteral("/etc/kde") + QLatin1String(kdeVersionBA); + if (QFileInfo(kdeVersionPrefix).isDir()) + kdeDirs += kdeVersionPrefix; + + kdeDirs.removeDuplicates(); + if (kdeDirs.isEmpty()) { + qWarning("%s: Unable to determine KDE dirs", Q_FUNC_INFO); + return 0; + } - qWarning("%s: Unable to determine KDEHOME", Q_FUNC_INFO); - return 0; + return new QKdeTheme(kdeDirs, kdeVersion); } #endif // QT_NO_SETTINGS diff --git a/src/platformsupport/themes/genericunix/qgenericunixthemes_p.h b/src/platformsupport/themes/genericunix/qgenericunixthemes_p.h index fd65402..509a26d 100644 --- a/src/platformsupport/themes/genericunix/qgenericunixthemes_p.h +++ b/src/platformsupport/themes/genericunix/qgenericunixthemes_p.h @@ -87,7 +87,7 @@ class QKdeTheme : public QPlatformTheme { Q_DECLARE_PRIVATE(QKdeTheme) public: - QKdeTheme(const QString &kdeHome, int kdeVersion); + QKdeTheme(const QStringList& kdeDirs, int kdeVersion); static QPlatformTheme *createKdeTheme(); virtual QVariant themeHint(ThemeHint hint) const; -- 2.1.1 ++++++ 0002-Move-SubpixelAntialiasingType-from-QFontEngineFT-to-.patch ++++++ >From 6528af73e7e3fda1c3abdebac1d9dc13aba8af10 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen <[email protected]> Date: Wed, 13 Aug 2014 12:19:30 +0200 Subject: [PATCH 2/4] Move SubpixelAntialiasingType from QFontEngineFT to QFontEngine To be able to use the SubpixelAntialiasingType enum without depending on QFontEngineFT we need to move it to QFontEngine. The patch also cleans up the left-overs of other enums moved the same way. Change-Id: I025bc8a5b429d376cfab0a643121ed6f99204988 Reviewed-by: Konstantin Ritt <[email protected]> (cherry picked from commit 9e1d6eec8eb7e393d1d0cc7efd24629e80b59289) --- src/gui/text/qfontengine_ft.cpp | 12 ++--- src/gui/text/qfontengine_ft_p.h | 8 --- src/gui/text/qfontengine_p.h | 8 +++ .../fontconfig/qfontconfigdatabase.cpp | 60 +++++++++++----------- 4 files changed, 44 insertions(+), 44 deletions(-) diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp index f5ca559..ad4276b 100644 --- a/src/gui/text/qfontengine_ft.cpp +++ b/src/gui/text/qfontengine_ft.cpp @@ -813,11 +813,11 @@ int QFontEngineFT::loadFlags(QGlyphSet *set, GlyphFormat format, int flags, if (format == Format_Mono) { load_target = FT_LOAD_TARGET_MONO; } else if (format == Format_A32) { - if (subpixelType == QFontEngineFT::Subpixel_RGB || subpixelType == QFontEngineFT::Subpixel_BGR) { + if (subpixelType == Subpixel_RGB || subpixelType == Subpixel_BGR) { if (default_hint_style == HintFull) load_target = FT_LOAD_TARGET_LCD; hsubpixel = true; - } else if (subpixelType == QFontEngineFT::Subpixel_VRGB || subpixelType == QFontEngineFT::Subpixel_VBGR) { + } else if (subpixelType == Subpixel_VRGB || subpixelType == Subpixel_VBGR) { if (default_hint_style == HintFull) load_target = FT_LOAD_TARGET_LCD_V; vfactor = 3; @@ -977,9 +977,9 @@ QFontEngineFT::Glyph *QFontEngineFT::loadGlyph(QGlyphSet *set, uint glyph, glyph_buffer = new uchar[glyph_buffer_size]; if (hsubpixel) - convertRGBToARGB(slot->bitmap.buffer, (uint *)glyph_buffer, info.width, info.height, slot->bitmap.pitch, subpixelType != QFontEngineFT::Subpixel_RGB, false); + convertRGBToARGB(slot->bitmap.buffer, (uint *)glyph_buffer, info.width, info.height, slot->bitmap.pitch, subpixelType != Subpixel_RGB, false); else if (vfactor != 1) - convertRGBToARGB_V(slot->bitmap.buffer, (uint *)glyph_buffer, info.width, info.height, slot->bitmap.pitch, subpixelType != QFontEngineFT::Subpixel_VRGB, false); + convertRGBToARGB_V(slot->bitmap.buffer, (uint *)glyph_buffer, info.width, info.height, slot->bitmap.pitch, subpixelType != Subpixel_VRGB, false); } else #endif { @@ -1091,10 +1091,10 @@ QFontEngineFT::Glyph *QFontEngineFT::loadGlyph(QGlyphSet *set, uint glyph, convoluteBitmap(bitmap.buffer, convoluted, bitmap.width, info.height, bitmap.pitch); buffer = convoluted; } - convertRGBToARGB(buffer + 1, (uint *)glyph_buffer, info.width, info.height, bitmap.pitch, subpixelType != QFontEngineFT::Subpixel_RGB, useLegacyLcdFilter); + convertRGBToARGB(buffer + 1, (uint *)glyph_buffer, info.width, info.height, bitmap.pitch, subpixelType != Subpixel_RGB, useLegacyLcdFilter); delete [] convoluted; } else if (vfactor != 1) { - convertRGBToARGB_V(bitmap.buffer, (uint *)glyph_buffer, info.width, info.height, bitmap.pitch, subpixelType != QFontEngineFT::Subpixel_VRGB, true); + convertRGBToARGB_V(bitmap.buffer, (uint *)glyph_buffer, info.width, info.height, bitmap.pitch, subpixelType != Subpixel_VRGB, true); } else if (format == Format_A32 && bitmap.pixel_mode == FT_PIXEL_MODE_GRAY) { convertGRAYToARGB(bitmap.buffer, (uint *)glyph_buffer, info.width, info.height, bitmap.pitch); } diff --git a/src/gui/text/qfontengine_ft_p.h b/src/gui/text/qfontengine_ft_p.h index 8bdf991..ba603b9 100644 --- a/src/gui/text/qfontengine_ft_p.h +++ b/src/gui/text/qfontengine_ft_p.h @@ -150,14 +150,6 @@ public: uchar *data; }; - enum SubpixelAntialiasingType { - Subpixel_None, - Subpixel_RGB, - Subpixel_BGR, - Subpixel_VRGB, - Subpixel_VBGR - }; - struct GlyphInfo { unsigned short width; unsigned short height; diff --git a/src/gui/text/qfontengine_p.h b/src/gui/text/qfontengine_p.h index fc849d7..fdd4785 100644 --- a/src/gui/text/qfontengine_p.h +++ b/src/gui/text/qfontengine_p.h @@ -261,6 +261,14 @@ public: }; virtual void setDefaultHintStyle(HintStyle) { } + enum SubpixelAntialiasingType { + Subpixel_None, + Subpixel_RGB, + Subpixel_BGR, + Subpixel_VRGB, + Subpixel_VBGR + }; + private: const Type m_type; diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp index e10e10b..d95bcb9 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp +++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp @@ -517,15 +517,15 @@ QFontEngineMulti *QFontconfigDatabase::fontEngineMulti(QFontEngine *fontEngine, } namespace { -QFontEngineFT::HintStyle defaultHintStyleFromMatch(QFont::HintingPreference hintingPreference, FcPattern *match) +QFontEngine::HintStyle defaultHintStyleFromMatch(QFont::HintingPreference hintingPreference, FcPattern *match) { switch (hintingPreference) { case QFont::PreferNoHinting: - return QFontEngineFT::HintNone; + return QFontEngine::HintNone; case QFont::PreferVerticalHinting: - return QFontEngineFT::HintLight; + return QFontEngine::HintLight; case QFont::PreferFullHinting: - return QFontEngineFT::HintFull; + return QFontEngine::HintFull; case QFont::PreferDefaultHinting: break; } @@ -545,21 +545,21 @@ QFontEngineFT::HintStyle defaultHintStyleFromMatch(QFont::HintingPreference hint hint_style = FC_HINT_FULL; switch (hint_style) { case FC_HINT_NONE: - return QFontEngineFT::HintNone; + return QFontEngine::HintNone; case FC_HINT_SLIGHT: - return QFontEngineFT::HintLight; + return QFontEngine::HintLight; case FC_HINT_MEDIUM: - return QFontEngineFT::HintMedium; + return QFontEngine::HintMedium; case FC_HINT_FULL: - return QFontEngineFT::HintFull; + return QFontEngine::HintFull; default: Q_UNREACHABLE(); break; } - return QFontEngineFT::HintFull; + return QFontEngine::HintFull; } -QFontEngineFT::SubpixelAntialiasingType subpixelTypeFromMatch(FcPattern *match) +QFontEngine::SubpixelAntialiasingType subpixelTypeFromMatch(FcPattern *match) { int subpixel = FC_RGBA_UNKNOWN; FcPatternGetInteger(match, FC_RGBA, 0, &subpixel); @@ -567,20 +567,20 @@ QFontEngineFT::SubpixelAntialiasingType subpixelTypeFromMatch(FcPattern *match) switch (subpixel) { case FC_RGBA_UNKNOWN: case FC_RGBA_NONE: - return QFontEngineFT::Subpixel_None; + return QFontEngine::Subpixel_None; case FC_RGBA_RGB: - return QFontEngineFT::Subpixel_RGB; + return QFontEngine::Subpixel_RGB; case FC_RGBA_BGR: - return QFontEngineFT::Subpixel_BGR; + return QFontEngine::Subpixel_BGR; case FC_RGBA_VRGB: - return QFontEngineFT::Subpixel_VRGB; + return QFontEngine::Subpixel_VRGB; case FC_RGBA_VBGR: - return QFontEngineFT::Subpixel_VBGR; + return QFontEngine::Subpixel_VBGR; default: Q_UNREACHABLE(); break; } - return QFontEngineFT::Subpixel_None; + return QFontEngine::Subpixel_None; } } // namespace @@ -599,7 +599,7 @@ QFontEngine *QFontconfigDatabase::fontEngine(const QFontDef &f, void *usrPtr) bool antialias = !(fontDef.styleStrategy & QFont::NoAntialias); engine = new QFontEngineFT(fontDef); - QFontEngineFT::GlyphFormat format; + QFontEngine::GlyphFormat format; // try and get the pattern FcPattern *pattern = FcPatternCreate(); @@ -634,20 +634,20 @@ QFontEngine *QFontconfigDatabase::fontEngine(const QFontDef &f, void *usrPtr) } if (antialias) { - QFontEngineFT::SubpixelAntialiasingType subpixelType = QFontEngineFT::Subpixel_None; + QFontEngine::SubpixelAntialiasingType subpixelType = QFontEngine::Subpixel_None; if (!(f.styleStrategy & QFont::NoSubpixelAntialias)) subpixelType = subpixelTypeFromMatch(match); engine->subpixelType = subpixelType; - format = (subpixelType == QFontEngineFT::Subpixel_None) - ? QFontEngineFT::Format_A8 - : QFontEngineFT::Format_A32; + format = (subpixelType == QFontEngine::Subpixel_None) + ? QFontEngine::Format_A8 + : QFontEngine::Format_A32; } else - format = QFontEngineFT::Format_Mono; + format = QFontEngine::Format_Mono; FcPatternDestroy(match); } else - format = antialias ? QFontEngineFT::Format_A8 : QFontEngineFT::Format_Mono; + format = antialias ? QFontEngine::Format_A8 : QFontEngine::Format_Mono; FcPatternDestroy(pattern); @@ -667,7 +667,7 @@ QFontEngine *QFontconfigDatabase::fontEngine(const QByteArray &fontData, qreal p QFontDef fontDef = engine->fontDef; - QFontEngineFT::GlyphFormat format; + QFontEngine::GlyphFormat format; // try and get the pattern FcPattern *pattern = FcPatternCreate(); @@ -692,17 +692,17 @@ QFontEngine *QFontconfigDatabase::fontEngine(const QByteArray &fontData, qreal p engine->antialias = fc_antialias; if (engine->antialias) { - QFontEngineFT::SubpixelAntialiasingType subpixelType = subpixelTypeFromMatch(match); + QFontEngine::SubpixelAntialiasingType subpixelType = subpixelTypeFromMatch(match); engine->subpixelType = subpixelType; - format = subpixelType == QFontEngineFT::Subpixel_None - ? QFontEngineFT::Format_A8 - : QFontEngineFT::Format_A32; + format = subpixelType == QFontEngine::Subpixel_None + ? QFontEngine::Format_A8 + : QFontEngine::Format_A32; } else - format = QFontEngineFT::Format_Mono; + format = QFontEngine::Format_Mono; FcPatternDestroy(match); } else - format = QFontEngineFT::Format_A8; + format = QFontEngine::Format_A8; FcPatternDestroy(pattern); -- 2.1.1 ++++++ 0002-QUrl-fromLocalFile-QString-should-lead-to-an-empty-U.patch ++++++ >From 18bb76b3b27edf8d980e414bc2b91c44ad80aab2 Mon Sep 17 00:00:00 2001 From: David Faure <[email protected]> Date: Wed, 9 Jul 2014 15:03:35 +0200 Subject: [PATCH 2/4] QUrl: fromLocalFile(QString()) should lead to an empty URL. This is much more useful than the URL "file:", it allows to use "empty path" and "empty URL" for the same meaning (e.g. not set). QFileDialog actually uses "file:" though, as the URL for the "My Computer" item in the sidebar. This patch preserves that. [ChangeLog][QtCore][QUrl] QUrl::fromLocalFile now returns an empty URL if the input string is empty. Change-Id: Ib5ce1a3cdf5f229368e5bcd83c62c1d1ac9f8a17 Reviewed-by: Thiago Macieira <[email protected]> (cherry picked from commit fd331a5b3a122393cd697a8b856dd52cfd31d698) --- src/corelib/io/qurl.cpp | 4 ++++ src/widgets/dialogs/qfiledialog.cpp | 4 ++-- src/widgets/dialogs/qsidebar.cpp | 3 ++- tests/auto/corelib/io/qurl/tst_qurl.cpp | 5 +++++ 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp index c109fc4..00ffc4f 100644 --- a/src/corelib/io/qurl.cpp +++ b/src/corelib/io/qurl.cpp @@ -3714,11 +3714,15 @@ bool QUrl::isDetached() const "//servername/path/to/file.txt". Note that only certain platforms can actually open this file using QFile::open(). + An empty \a localFile leads to an empty URL (since Qt 5.4). + \sa toLocalFile(), isLocalFile(), QDir::toNativeSeparators() */ QUrl QUrl::fromLocalFile(const QString &localFile) { QUrl url; + if (localFile.isEmpty()) + return url; url.setScheme(fileScheme()); QString deslashified = QDir::fromNativeSeparators(localFile); diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp index 037964b..82a4a4c 100644 --- a/src/widgets/dialogs/qfiledialog.cpp +++ b/src/widgets/dialogs/qfiledialog.cpp @@ -2783,7 +2783,7 @@ void QFileDialogPrivate::createWidgets() qFileDialogUi->setupUi(q); QList<QUrl> initialBookmarks; - initialBookmarks << QUrl::fromLocalFile(QLatin1String("")) + initialBookmarks << QUrl(QLatin1String("file:")) << QUrl::fromLocalFile(QDir::homePath()); qFileDialogUi->sidebar->setModelAndUrls(model, initialBookmarks); QFileDialog::connect(qFileDialogUi->sidebar, SIGNAL(goToUrl(QUrl)), @@ -3760,7 +3760,7 @@ void QFileDialogComboBox::showPopup() idx = idx.parent(); } // add "my computer" - list.append(QUrl::fromLocalFile(QLatin1String(""))); + list.append(QUrl(QLatin1String("file:"))); urlModel->addUrls(list, 0); idx = model()->index(model()->rowCount() - 1, 0); diff --git a/src/widgets/dialogs/qsidebar.cpp b/src/widgets/dialogs/qsidebar.cpp index 3d22992..7b691dc 100644 --- a/src/widgets/dialogs/qsidebar.cpp +++ b/src/widgets/dialogs/qsidebar.cpp @@ -249,7 +249,8 @@ void QUrlModel::addUrls(const QList<QUrl> &list, int row, bool move) continue; //this makes sure the url is clean const QString cleanUrl = QDir::cleanPath(url.toLocalFile()); - url = QUrl::fromLocalFile(cleanUrl); + if (!cleanUrl.isEmpty()) + url = QUrl::fromLocalFile(cleanUrl); for (int j = 0; move && j < rowCount(); ++j) { QString local = index(j, 0).data(UrlRole).toUrl().toLocalFile(); diff --git a/tests/auto/corelib/io/qurl/tst_qurl.cpp b/tests/auto/corelib/io/qurl/tst_qurl.cpp index d5eab54..b8bab87 100644 --- a/tests/auto/corelib/io/qurl/tst_qurl.cpp +++ b/tests/auto/corelib/io/qurl/tst_qurl.cpp @@ -235,6 +235,11 @@ void tst_QUrl::constructing() QVERIFY(url == url); QVERIFY(!(url < url)); + QUrl fromLocal = QUrl::fromLocalFile(QString()); + QVERIFY(!fromLocal.isValid()); + QVERIFY(fromLocal.isEmpty()); + QCOMPARE(fromLocal.toString(), QString()); + QUrl justHost("qt-project.org"); QVERIFY(!justHost.isEmpty()); QVERIFY(justHost.host().isEmpty()); -- 2.1.1 ++++++ 0003-QFileDialog-turn-workingDirectory-into-a-QUrl.patch ++++++ >From c738b6f8a3d4b76fcd19be9d046e903eabc3301c Mon Sep 17 00:00:00 2001 From: David Faure <[email protected]> Date: Wed, 9 Jul 2014 11:54:36 +0200 Subject: [PATCH 3/4] QFileDialog: turn workingDirectory into a QUrl In order to make this work better with remote URLs. Change-Id: Ic440735142441150838b05e88940adcc12a90d09 Reviewed-by: Friedemann Kleint <[email protected]> (cherry picked from commit cd3331802516c012aed1be329e2e889478cbdd3e) --- src/widgets/dialogs/qfiledialog.cpp | 106 +++++++++++++++++++++--------------- src/widgets/dialogs/qfiledialog_p.h | 10 ++-- 2 files changed, 68 insertions(+), 48 deletions(-) diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp index 82a4a4c..ab0361a 100644 --- a/src/widgets/dialogs/qfiledialog.cpp +++ b/src/widgets/dialogs/qfiledialog.cpp @@ -78,7 +78,7 @@ extern bool qt_priv_ptr_valid; QT_BEGIN_NAMESPACE -Q_GLOBAL_STATIC(QString, lastVisitedDir) +Q_GLOBAL_STATIC(QUrl, lastVisitedDir) /*! \class QFileDialog @@ -373,7 +373,7 @@ QFileDialog::QFileDialog(QWidget *parent, : QDialog(*new QFileDialogPrivate, parent, 0) { Q_D(QFileDialog); - d->init(directory, filter, caption); + d->init(QUrl::fromLocalFile(directory), filter, caption); } /*! @@ -444,7 +444,7 @@ static const qint32 QFileDialogMagic = 0xbe; QByteArray QFileDialog::saveState() const { Q_D(const QFileDialog); - int version = 3; + int version = 4; QByteArray data; QDataStream stream(&data, QIODevice::WriteOnly); @@ -479,7 +479,6 @@ QByteArray QFileDialog::saveState() const bool QFileDialog::restoreState(const QByteArray &state) { Q_D(QFileDialog); - int version = 3; QByteArray sd = state; QDataStream stream(&sd, QIODevice::ReadOnly); if (stream.atEnd()) @@ -488,23 +487,30 @@ bool QFileDialog::restoreState(const QByteArray &state) QByteArray headerData; QList<QUrl> bookmarks; QStringList history; - QString currentDirectory; + QUrl currentDirectory; qint32 marker; qint32 v; qint32 viewMode; stream >> marker; stream >> v; - if (marker != QFileDialogMagic || v != version) + // the code below only supports versions 3 and 4 + if (marker != QFileDialogMagic || (v != 3 && v != 4)) return false; stream >> splitterState >> bookmarks - >> history - >> currentDirectory - >> headerData + >> history; + if (v == 3) { + QString currentDirectoryString; + stream >> currentDirectoryString; + currentDirectory = QUrl::fromLocalFile(currentDirectoryString); + } else { + stream >> currentDirectory; + } + stream >> headerData >> viewMode; - setDirectory(lastVisitedDir()->isEmpty() ? currentDirectory : *lastVisitedDir()); + setDirectoryUrl(lastVisitedDir()->isEmpty() ? currentDirectory : *lastVisitedDir()); setViewMode(static_cast<QFileDialog::ViewMode>(viewMode)); if (!d->usingWidgets()) @@ -630,7 +636,7 @@ void QFileDialogPrivate::retranslateWindowTitle() setWindowTitle = q->windowTitle(); } -void QFileDialogPrivate::setLastVisitedDirectory(const QString &dir) +void QFileDialogPrivate::setLastVisitedDirectory(const QUrl &dir) { *lastVisitedDir() = dir; } @@ -944,11 +950,12 @@ void QFileDialog::setDirectory(const QString &directory) if (!directory.isEmpty() && newDirectory.isEmpty()) return; - d->setLastVisitedDirectory(newDirectory); + QUrl newDirUrl = QUrl::fromLocalFile(newDirectory); + d->setLastVisitedDirectory(newDirUrl); d->options->setInitialDirectory(QUrl::fromLocalFile(directory)); if (!d->usingWidgets()) { - d->setDirectory_sys(QUrl::fromLocalFile(newDirectory)); + d->setDirectory_sys(newDirUrl); return; } if (d->rootPath() == newDirectory) @@ -995,6 +1002,9 @@ void QFileDialog::setDirectoryUrl(const QUrl &directory) if (!directory.isValid()) return; + d->setLastVisitedDirectory(directory); + d->options->setInitialDirectory(directory); + if (d->nativeDialogInUse) d->setDirectory_sys(directory); else if (directory.isLocalFile()) @@ -2103,8 +2113,8 @@ QString QFileDialog::getOpenFileName(QWidget *parent, QFileDialogArgs args; args.parent = parent; args.caption = caption; - args.directory = QFileDialogPrivate::workingDirectory(dir); - args.selection = QFileDialogPrivate::initialSelection(dir); + args.directory = QFileDialogPrivate::workingDirectory(QUrl::fromLocalFile(dir)); + args.selection = QFileDialogPrivate::initialSelection(QUrl::fromLocalFile(dir)); args.filter = filter; args.mode = ExistingFile; args.options = options; @@ -2231,8 +2241,8 @@ QStringList QFileDialog::getOpenFileNames(QWidget *parent, QFileDialogArgs args; args.parent = parent; args.caption = caption; - args.directory = QFileDialogPrivate::workingDirectory(dir); - args.selection = QFileDialogPrivate::initialSelection(dir); + args.directory = QFileDialogPrivate::workingDirectory(QUrl::fromLocalFile(dir)); + args.selection = QFileDialogPrivate::initialSelection(QUrl::fromLocalFile(dir)); args.filter = filter; args.mode = ExistingFiles; args.options = options; @@ -2363,8 +2373,8 @@ QString QFileDialog::getSaveFileName(QWidget *parent, QFileDialogArgs args; args.parent = parent; args.caption = caption; - args.directory = QFileDialogPrivate::workingDirectory(dir); - args.selection = QFileDialogPrivate::initialSelection(dir); + args.directory = QFileDialogPrivate::workingDirectory(QUrl::fromLocalFile(dir)); + args.selection = QFileDialogPrivate::initialSelection(QUrl::fromLocalFile(dir)); args.filter = filter; args.mode = AnyFile; args.options = options; @@ -2477,7 +2487,7 @@ QString QFileDialog::getExistingDirectory(QWidget *parent, QFileDialogArgs args; args.parent = parent; args.caption = caption; - args.directory = QFileDialogPrivate::workingDirectory(dir); + args.directory = QFileDialogPrivate::workingDirectory(QUrl::fromLocalFile(dir)); args.mode = (options & ShowDirsOnly ? DirectoryOnly : Directory); args.options = options; @@ -2538,32 +2548,36 @@ QUrl QFileDialog::getExistingDirectoryUrl(QWidget *parent, return dialogResultToUrl(getExistingDirectory(parent, caption, dir.toLocalFile(), options)); } -inline static QString _qt_get_directory(const QString &path) +inline static QUrl _qt_get_directory(const QUrl &url) { - QFileInfo info = QFileInfo(QDir::current(), path); - if (info.exists() && info.isDir()) - return QDir::cleanPath(info.absoluteFilePath()); - info.setFile(info.absolutePath()); - if (info.exists() && info.isDir()) - return info.absoluteFilePath(); - return QString(); + if (url.isLocalFile()) { + QFileInfo info = QFileInfo(QDir::current(), url.toLocalFile()); + if (info.exists() && info.isDir()) + return QUrl::fromLocalFile(QDir::cleanPath(info.absoluteFilePath())); + info.setFile(info.absolutePath()); + if (info.exists() && info.isDir()) + return QUrl::fromLocalFile(info.absoluteFilePath()); + return QUrl(); + } else { + return url; + } } /* - Get the initial directory path + Get the initial directory URL \sa initialSelection() */ -QString QFileDialogPrivate::workingDirectory(const QString &path) +QUrl QFileDialogPrivate::workingDirectory(const QUrl &url) { - if (!path.isEmpty()) { - QString directory = _qt_get_directory(path); + if (!url.isEmpty()) { + QUrl directory = _qt_get_directory(url); if (!directory.isEmpty()) return directory; } - QString directory = _qt_get_directory(*lastVisitedDir()); + QUrl directory = _qt_get_directory(*lastVisitedDir()); if (!directory.isEmpty()) return directory; - return QDir::currentPath(); + return QUrl::fromLocalFile(QDir::currentPath()); } /* @@ -2573,14 +2587,19 @@ QString QFileDialogPrivate::workingDirectory(const QString &path) \sa workingDirectory() */ -QString QFileDialogPrivate::initialSelection(const QString &path) +QString QFileDialogPrivate::initialSelection(const QUrl &url) { - if (!path.isEmpty()) { - QFileInfo info(path); + if (url.isEmpty()) + return QString(); + if (url.isLocalFile()) { + QFileInfo info(url.toLocalFile()); if (!info.isDir()) return info.fileName(); + else + return QString(); } - return QString(); + // With remote URLs we can only assume. + return url.fileName(); } /*! @@ -2717,7 +2736,7 @@ void QFileDialog::accept() Create widgets, layout and set default values */ -void QFileDialogPrivate::init(const QString &directory, const QString &nameFilter, +void QFileDialogPrivate::init(const QUrl &directory, const QString &nameFilter, const QString &caption) { Q_Q(QFileDialog); @@ -2734,7 +2753,7 @@ void QFileDialogPrivate::init(const QString &directory, const QString &nameFilte q->setFileMode(QFileDialog::AnyFile); if (!nameFilter.isEmpty()) q->setNameFilter(nameFilter); - q->setDirectory(workingDirectory(directory)); + q->setDirectoryUrl(workingDirectory(directory)); q->selectFile(initialSelection(directory)); #ifndef QT_NO_SETTINGS @@ -3683,9 +3702,10 @@ void QFileDialogPrivate::_q_nativeEnterDirectory(const QUrl &directory) { Q_Q(QFileDialog); emit q->directoryUrlEntered(directory); - if (!directory.isEmpty() && directory.isLocalFile()) { // Windows native dialogs occasionally emit signals with empty strings. - *lastVisitedDir() = directory.toLocalFile(); - emit q->directoryEntered(directory.toLocalFile()); + if (!directory.isEmpty()) { // Windows native dialogs occasionally emit signals with empty strings. + *lastVisitedDir() = directory; + if (directory.isLocalFile()) + emit q->directoryEntered(directory.toLocalFile()); } } diff --git a/src/widgets/dialogs/qfiledialog_p.h b/src/widgets/dialogs/qfiledialog_p.h index 9e1c23b..175760c 100644 --- a/src/widgets/dialogs/qfiledialog_p.h +++ b/src/widgets/dialogs/qfiledialog_p.h @@ -100,7 +100,7 @@ struct QFileDialogArgs QWidget *parent; QString caption; - QString directory; + QUrl directory; QString selection; QString filter; QFileDialog::FileMode mode; @@ -123,12 +123,12 @@ public: void createMenuActions(); void createWidgets(); - void init(const QString &directory = QString(), const QString &nameFilter = QString(), + void init(const QUrl &directory = QUrl(), const QString &nameFilter = QString(), const QString &caption = QString()); bool itemViewKeyboardEvent(QKeyEvent *event); QString getEnvironmentVariable(const QString &string); - static QString workingDirectory(const QString &path); - static QString initialSelection(const QString &path); + static QUrl workingDirectory(const QUrl &path); + static QString initialSelection(const QUrl &path); QStringList typedFiles() const; QList<QUrl> userSelectedFiles() const; QStringList addDefaultSuffixToFiles(const QStringList filesToFix) const; @@ -189,7 +189,7 @@ public: #endif } - void setLastVisitedDirectory(const QString &dir); + void setLastVisitedDirectory(const QUrl &dir); void retranslateWindowTitle(); void retranslateStrings(); void emitFilesSelected(const QStringList &files); -- 2.1.1 ++++++ 0003-Support-autohint-and-lcdfilter-fontconfig-configurat.patch ++++++ >From e5d61b2531ce2000e7e230d4cfdb793fa2b686e8 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen <[email protected]> Date: Mon, 11 Aug 2014 14:03:35 +0200 Subject: [PATCH 3/4] Support autohint and lcdfilter fontconfig configuration This patch adds support for reading autohint and lcdfilter settings from fontconfig and pass them on to freetype. Task-number: QTBUG-32254 Change-Id: Iaa69b70f7005ee7f21126a8d984c07b3a46a3e7f Reviewed-by: Eskil Abrahamsen Blomfeldt <[email protected]> (cherry picked from commit b35176f43a953d56380414f05834c7918762cb83) --- src/gui/text/qfontengine_ft.cpp | 4 ++++ src/gui/text/qfontengine_ft_p.h | 1 + .../fontdatabases/fontconfig/qfontconfigdatabase.cpp | 20 ++++++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp index ad4276b..eef316b 100644 --- a/src/gui/text/qfontengine_ft.cpp +++ b/src/gui/text/qfontengine_ft.cpp @@ -678,6 +678,7 @@ QFontEngineFT::QFontEngineFT(const QFontDef &fd) const QByteArray env = qgetenv("QT_NO_FT_CACHE"); cacheEnabled = env.isEmpty() || env.toInt() == 0; m_subPixelPositionCount = 4; + forceAutoHint = false; } QFontEngineFT::~QFontEngineFT() @@ -832,6 +833,9 @@ int QFontEngineFT::loadFlags(QGlyphSet *set, GlyphFormat format, int flags, else load_flags |= load_target; + if (forceAutoHint) + load_flags |= FT_LOAD_FORCE_AUTOHINT; + return load_flags; } diff --git a/src/gui/text/qfontengine_ft_p.h b/src/gui/text/qfontengine_ft_p.h index ba603b9..09c70c5 100644 --- a/src/gui/text/qfontengine_ft_p.h +++ b/src/gui/text/qfontengine_ft_p.h @@ -307,6 +307,7 @@ protected: int lcdFilterType; bool embeddedbitmap; bool cacheEnabled; + bool forceAutoHint; private: friend class QFontEngineFTRawFont; diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp index d95bcb9..0bf119c 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp +++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp @@ -625,6 +625,16 @@ QFontEngine *QFontconfigDatabase::fontEngine(const QFontDef &f, void *usrPtr) if (match) { engine->setDefaultHintStyle(defaultHintStyleFromMatch((QFont::HintingPreference)f.hintingPreference, match)); + FcBool fc_autohint; + if (FcPatternGetBool(match, FC_AUTOHINT,0, &fc_autohint) == FcResultMatch) + engine->forceAutoHint = fc_autohint; + +#if defined(FT_LCD_FILTER_H) + int lcdFilter; + if (FcPatternGetInteger(match, FC_LCD_FILTER, 0, &lcdFilter) == FcResultMatch) + engine->lcdFilterType = lcdFilter; +#endif + if (antialias) { // If antialiasing is not fully disabled, fontconfig may still disable it on a font match basis. FcBool fc_antialias; @@ -686,6 +696,16 @@ QFontEngine *QFontconfigDatabase::fontEngine(const QByteArray &fontData, qreal p if (match) { engine->setDefaultHintStyle(defaultHintStyleFromMatch(hintingPreference, match)); + FcBool fc_autohint; + if (FcPatternGetBool(match, FC_AUTOHINT,0, &fc_autohint) == FcResultMatch) + engine->forceAutoHint = fc_autohint; + +#if defined(FT_LCD_FILTER_H) + int lcdFilter; + if (FcPatternGetInteger(match, FC_LCD_FILTER, 0, &lcdFilter) == FcResultMatch) + engine->lcdFilterType = lcdFilter; +#endif + FcBool fc_antialias; if (FcPatternGetBool(match, FC_ANTIALIAS,0, &fc_antialias) != FcResultMatch) fc_antialias = true; -- 2.1.1 ++++++ 0004-GTK2-theme-should-use-GTK-configured-font-variant.patch ++++++ >From d7afdc53b28d107bbf8cdfd52777cb7cb9f2c10d Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen <[email protected]> Date: Tue, 12 Aug 2014 16:59:18 +0200 Subject: [PATCH 4/4] GTK2 theme should use GTK configured font variant This patch makes the GTK2 theme read the font configuration and use that as the default system font. Task-number: QTBUG-39643 Change-Id: Ieacf8968e54f34c6d44669350d349c9a96ed6cc5 Reviewed-by: Shawn Rutledge <[email protected]> (cherry picked from commit 2a33bfcfd174d503e2f98c66d8de0a68783015da) --- .../themes/genericunix/qgenericunixthemes.cpp | 27 +++++++++++++++++----- .../themes/genericunix/qgenericunixthemes_p.h | 2 ++ src/plugins/platformthemes/gtk2/qgtk2theme.cpp | 8 +++++++ src/plugins/platformthemes/gtk2/qgtk2theme.h | 3 ++- 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp index 4a1d67f..b68aa85 100644 --- a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp +++ b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp @@ -482,15 +482,23 @@ const char *QGnomeTheme::name = "gnome"; class QGnomeThemePrivate : public QPlatformThemePrivate { public: - QGnomeThemePrivate() - : systemFont(QLatin1Literal(defaultSystemFontNameC), defaultSystemFontSize) - , fixedFont(QStringLiteral("monospace"), systemFont.pointSize()) + QGnomeThemePrivate() : fontsConfigured(false) { } + void configureFonts(QString gtkFontName) const { + Q_ASSERT(!fontsConfigured); + const int split = gtkFontName.lastIndexOf(QChar::Space); + float size = gtkFontName.mid(split+1).toFloat(); + QString fontName = gtkFontName.left(split); + + systemFont = QFont(fontName, size); + fixedFont = QFont(QLatin1String("monospace"), systemFont.pointSize()); fixedFont.setStyleHint(QFont::TypeWriter); + fontsConfigured = true; } - const QFont systemFont; - QFont fixedFont; + mutable QFont systemFont; + mutable QFont fixedFont; + mutable bool fontsConfigured; }; QGnomeTheme::QGnomeTheme() @@ -528,9 +536,11 @@ QVariant QGnomeTheme::themeHint(QPlatformTheme::ThemeHint hint) const const QFont *QGnomeTheme::font(Font type) const { Q_D(const QGnomeTheme); + if (!d->fontsConfigured) + d->configureFonts(gtkFontName()); switch (type) { case QPlatformTheme::SystemFont: - return &d->systemFont; + return &d->systemFont; case QPlatformTheme::FixedFont: return &d->fixedFont; default: @@ -538,6 +548,11 @@ const QFont *QGnomeTheme::font(Font type) const } } +QString QGnomeTheme::gtkFontName() const +{ + return QStringLiteral("%1 %2").arg(QLatin1String(defaultSystemFontNameC)).arg(defaultSystemFontSize); +} + QString QGnomeTheme::standardButtonText(int button) const { switch (button) { diff --git a/src/platformsupport/themes/genericunix/qgenericunixthemes_p.h b/src/platformsupport/themes/genericunix/qgenericunixthemes_p.h index 36fcdd8..fd65402 100644 --- a/src/platformsupport/themes/genericunix/qgenericunixthemes_p.h +++ b/src/platformsupport/themes/genericunix/qgenericunixthemes_p.h @@ -111,6 +111,8 @@ public: virtual const QFont *font(Font type) const; QString standardButtonText(int button) const Q_DECL_OVERRIDE; + virtual QString gtkFontName() const; + static const char *name; }; diff --git a/src/plugins/platformthemes/gtk2/qgtk2theme.cpp b/src/plugins/platformthemes/gtk2/qgtk2theme.cpp index 812f4bc..4df3a30 100644 --- a/src/plugins/platformthemes/gtk2/qgtk2theme.cpp +++ b/src/plugins/platformthemes/gtk2/qgtk2theme.cpp @@ -85,6 +85,14 @@ QVariant QGtk2Theme::themeHint(QPlatformTheme::ThemeHint hint) const } } +QString QGtk2Theme::gtkFontName() const +{ + QString cfgFontName = gtkSetting("gtk-font-name"); + if (!cfgFontName.isEmpty()) + return cfgFontName; + return QGnomeTheme::gtkFontName(); +} + bool QGtk2Theme::usePlatformNativeDialog(DialogType type) const { switch (type) { diff --git a/src/plugins/platformthemes/gtk2/qgtk2theme.h b/src/plugins/platformthemes/gtk2/qgtk2theme.h index a0bd34e..c74e58e 100644 --- a/src/plugins/platformthemes/gtk2/qgtk2theme.h +++ b/src/plugins/platformthemes/gtk2/qgtk2theme.h @@ -51,7 +51,8 @@ class QGtk2Theme : public QGnomeTheme public: QGtk2Theme(); - QVariant themeHint(ThemeHint hint) const; + virtual QVariant themeHint(ThemeHint hint) const Q_DECL_OVERRIDE; + virtual QString gtkFontName() const Q_DECL_OVERRIDE; bool usePlatformNativeDialog(DialogType type) const; QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const; -- 2.1.1 ++++++ 0004-QFileDialog-implement-getOpenFileUrl-and-friends-for.patch ++++++ >From 2dcade09fca04dc45848a5a653b160e96aaab1e8 Mon Sep 17 00:00:00 2001 From: David Faure <[email protected]> Date: Wed, 9 Jul 2014 12:01:05 +0200 Subject: [PATCH 4/4] QFileDialog: implement getOpenFileUrl and friends for real i.e. make them support remote URLs. To avoid code duplication, getOpenFileName/getSaveFileName/getExistingDirectory are now implemented in terms of getOpenFileUrl/getSaveFileUrl/getExistingDirectoryUrl. Change-Id: If409ac9ab72c2a65f04e2ef1dc28e7d47bbcd73c Reviewed-by: Friedemann Kleint <[email protected]> (cherry picked from commit 1a9701fe81c39450822c0d4b51c11444380a2fe4) Conflicts: src/widgets/dialogs/qfiledialog.cpp --- src/widgets/dialogs/qfiledialog.cpp | 199 +++++++++++++++--------------------- 1 file changed, 81 insertions(+), 118 deletions(-) diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp index ab0361a..bc4a0a3 100644 --- a/src/widgets/dialogs/qfiledialog.cpp +++ b/src/widgets/dialogs/qfiledialog.cpp @@ -2110,35 +2110,9 @@ QString QFileDialog::getOpenFileName(QWidget *parent, QString *selectedFilter, Options options) { - QFileDialogArgs args; - args.parent = parent; - args.caption = caption; - args.directory = QFileDialogPrivate::workingDirectory(QUrl::fromLocalFile(dir)); - args.selection = QFileDialogPrivate::initialSelection(QUrl::fromLocalFile(dir)); - args.filter = filter; - args.mode = ExistingFile; - args.options = options; -#if defined(Q_WS_WIN) - if (QGuiApplicationPrivate::platformIntegration()->usePlatformNativeDialog() && !(args.options & DontUseNativeDialog)) { - return qt_win_get_open_file_name(args, &(args.directory), selectedFilter); - } -#endif - - // create a qt dialog - QFileDialog dialog(args); - if (selectedFilter && !selectedFilter->isEmpty()) - dialog.selectNameFilter(*selectedFilter); - if (dialog.exec() == QDialog::Accepted) { - if (selectedFilter) - *selectedFilter = dialog.selectedNameFilter(); - return dialog.selectedFiles().value(0); - } - return QString(); -} - -static inline QUrl dialogResultToUrl(const QString &file) -{ - return file.isEmpty() ? QUrl() : QUrl::fromLocalFile(file); + const QStringList schemes = QStringList(QStringLiteral("file")); + const QUrl selectedUrl = getOpenFileUrl(parent, caption, QUrl::fromLocalFile(dir), filter, selectedFilter, options, schemes); + return selectedUrl.toLocalFile(); } /*! @@ -2176,10 +2150,26 @@ QUrl QFileDialog::getOpenFileUrl(QWidget *parent, Options options, const QStringList &supportedSchemes) { - Q_UNUSED(supportedSchemes); + Q_UNUSED(supportedSchemes); // TODO + + QFileDialogArgs args; + args.parent = parent; + args.caption = caption; + args.directory = QFileDialogPrivate::workingDirectory(dir); + args.selection = QFileDialogPrivate::initialSelection(dir); + args.filter = filter; + args.mode = ExistingFile; + args.options = options; - // Falls back to local file - return dialogResultToUrl(getOpenFileName(parent, caption, dir.toLocalFile(), filter, selectedFilter, options)); + QFileDialog dialog(args); + if (selectedFilter && !selectedFilter->isEmpty()) + dialog.selectNameFilter(*selectedFilter); + if (dialog.exec() == QDialog::Accepted) { + if (selectedFilter) + *selectedFilter = dialog.selectedNameFilter(); + return dialog.selectedUrls().value(0); + } + return QUrl(); } /*! @@ -2238,31 +2228,12 @@ QStringList QFileDialog::getOpenFileNames(QWidget *parent, QString *selectedFilter, Options options) { - QFileDialogArgs args; - args.parent = parent; - args.caption = caption; - args.directory = QFileDialogPrivate::workingDirectory(QUrl::fromLocalFile(dir)); - args.selection = QFileDialogPrivate::initialSelection(QUrl::fromLocalFile(dir)); - args.filter = filter; - args.mode = ExistingFiles; - args.options = options; - -#if defined(Q_WS_WIN) - if (QGuiApplicationPrivate::platformIntegration()->usePlatformNativeDialog() && !(args.options & DontUseNativeDialog)) { - return qt_win_get_open_file_names(args, &(args.directory), selectedFilter); - } -#endif - - // create a qt dialog - QFileDialog dialog(args); - if (selectedFilter && !selectedFilter->isEmpty()) - dialog.selectNameFilter(*selectedFilter); - if (dialog.exec() == QDialog::Accepted) { - if (selectedFilter) - *selectedFilter = dialog.selectedNameFilter(); - return dialog.selectedFiles(); - } - return QStringList(); + const QStringList schemes = QStringList(QStringLiteral("file")); + const QList<QUrl> selectedUrls = getOpenFileUrls(parent, caption, QUrl::fromLocalFile(dir), filter, selectedFilter, options, schemes); + QStringList fileNames; + foreach (const QUrl &url, selectedUrls) + fileNames << url.toLocalFile(); + return fileNames; } /*! @@ -2303,14 +2274,24 @@ QList<QUrl> QFileDialog::getOpenFileUrls(QWidget *parent, { Q_UNUSED(supportedSchemes); - // Falls back to local files - QList<QUrl> urls; - - const QStringList fileNames = getOpenFileNames(parent, caption, dir.toLocalFile(), filter, selectedFilter, options); - foreach (const QString &fileName, fileNames) - urls << QUrl::fromLocalFile(fileName); + QFileDialogArgs args; + args.parent = parent; + args.caption = caption; + args.directory = QFileDialogPrivate::workingDirectory(dir); + args.selection = QFileDialogPrivate::initialSelection(dir); + args.filter = filter; + args.mode = ExistingFiles; + args.options = options; - return urls; + QFileDialog dialog(args); + if (selectedFilter && !selectedFilter->isEmpty()) + dialog.selectNameFilter(*selectedFilter); + if (dialog.exec() == QDialog::Accepted) { + if (selectedFilter) + *selectedFilter = dialog.selectedNameFilter(); + return dialog.selectedUrls(); + } + return QList<QUrl>(); } /*! @@ -2370,33 +2351,9 @@ QString QFileDialog::getSaveFileName(QWidget *parent, QString *selectedFilter, Options options) { - QFileDialogArgs args; - args.parent = parent; - args.caption = caption; - args.directory = QFileDialogPrivate::workingDirectory(QUrl::fromLocalFile(dir)); - args.selection = QFileDialogPrivate::initialSelection(QUrl::fromLocalFile(dir)); - args.filter = filter; - args.mode = AnyFile; - args.options = options; - -#if defined(Q_WS_WIN) - if (QGuiApplicationPrivate::platformIntegration()->usePlatformNativeDialog() && !(args.options & DontUseNativeDialog)) { - return qt_win_get_save_file_name(args, &(args.directory), selectedFilter); - } -#endif - - // create a qt dialog - QFileDialog dialog(args); - dialog.setAcceptMode(AcceptSave); - if (selectedFilter && !selectedFilter->isEmpty()) - dialog.selectNameFilter(*selectedFilter); - if (dialog.exec() == QDialog::Accepted) { - if (selectedFilter) - *selectedFilter = dialog.selectedNameFilter(); - return dialog.selectedFiles().value(0); - } - - return QString(); + const QStringList schemes = QStringList(QStringLiteral("file")); + const QUrl selectedUrl = getSaveFileUrl(parent, caption, QUrl::fromLocalFile(dir), filter, selectedFilter, options, schemes); + return selectedUrl.toLocalFile(); } /*! @@ -2436,8 +2393,25 @@ QUrl QFileDialog::getSaveFileUrl(QWidget *parent, { Q_UNUSED(supportedSchemes); - // Falls back to local file - return dialogResultToUrl(getSaveFileName(parent, caption, dir.toLocalFile(), filter, selectedFilter, options)); + QFileDialogArgs args; + args.parent = parent; + args.caption = caption; + args.directory = QFileDialogPrivate::workingDirectory(dir); + args.selection = QFileDialogPrivate::initialSelection(dir); + args.filter = filter; + args.mode = AnyFile; + args.options = options; + + QFileDialog dialog(args); + dialog.setAcceptMode(AcceptSave); + if (selectedFilter && !selectedFilter->isEmpty()) + dialog.selectNameFilter(*selectedFilter); + if (dialog.exec() == QDialog::Accepted) { + if (selectedFilter) + *selectedFilter = dialog.selectedNameFilter(); + return dialog.selectedUrls().value(0); + } + return QUrl(); } /*! @@ -2484,29 +2458,9 @@ QString QFileDialog::getExistingDirectory(QWidget *parent, const QString &dir, Options options) { - QFileDialogArgs args; - args.parent = parent; - args.caption = caption; - args.directory = QFileDialogPrivate::workingDirectory(QUrl::fromLocalFile(dir)); - args.mode = (options & ShowDirsOnly ? DirectoryOnly : Directory); - args.options = options; - -#if defined(Q_WS_WIN) - if (QGuiApplicationPrivate::platformIntegration()->usePlatformNativeDialog() && !(args.options & DontUseNativeDialog) && (options & ShowDirsOnly) -#if defined(Q_OS_WINCE) - && qt_priv_ptr_valid -#endif - ) { - return qt_win_get_existing_directory(args); - } -#endif - - // create a qt dialog - QFileDialog dialog(args); - if (dialog.exec() == QDialog::Accepted) { - return dialog.selectedFiles().value(0); - } - return QString(); + const QStringList schemes = QStringList(QStringLiteral("file")); + const QUrl selectedUrl = getExistingDirectoryUrl(parent, caption, QUrl::fromLocalFile(dir), options, schemes); + return selectedUrl.toLocalFile(); } /*! @@ -2544,8 +2498,17 @@ QUrl QFileDialog::getExistingDirectoryUrl(QWidget *parent, { Q_UNUSED(supportedSchemes); - // Falls back to local file - return dialogResultToUrl(getExistingDirectory(parent, caption, dir.toLocalFile(), options)); + QFileDialogArgs args; + args.parent = parent; + args.caption = caption; + args.directory = QFileDialogPrivate::workingDirectory(dir); + args.mode = (options & ShowDirsOnly ? DirectoryOnly : Directory); + args.options = options; + + QFileDialog dialog(args); + if (dialog.exec() == QDialog::Accepted) + return dialog.selectedUrls().value(0); + return QUrl(); } inline static QUrl _qt_get_directory(const QUrl &url) -- 2.1.1 -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
