summaryrefslogtreecommitdiffstats
path: root/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/platformsupport/themes/genericunix/qgenericunixthemes.cpp')
-rw-r--r--src/platformsupport/themes/genericunix/qgenericunixthemes.cpp884
1 files changed, 0 insertions, 884 deletions
diff --git a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp
deleted file mode 100644
index 70d5616075..0000000000
--- a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp
+++ /dev/null
@@ -1,884 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qgenericunixthemes_p.h"
-
-#include "qpa/qplatformtheme_p.h"
-
-#include <QtGui/QPalette>
-#include <QtGui/QFont>
-#include <QtGui/QGuiApplication>
-#include <QtCore/QDir>
-#include <QtCore/QFileInfo>
-#include <QtCore/QFile>
-#include <QtCore/QDebug>
-#include <QtCore/QHash>
-#if QT_CONFIG(mimetype)
-#include <QtCore/QMimeDatabase>
-#endif
-#include <QtCore/QLoggingCategory>
-#if QT_CONFIG(settings)
-#include <QtCore/QSettings>
-#endif
-#include <QtCore/QVariant>
-#include <QtCore/QStandardPaths>
-#include <QtCore/QStringList>
-#include <private/qguiapplication_p.h>
-#include <qpa/qplatformintegration.h>
-#include <qpa/qplatformservices.h>
-#include <qpa/qplatformdialoghelper.h>
-#ifndef QT_NO_DBUS
-#include "qdbusplatformmenu_p.h"
-#include "qdbusmenubar_p.h"
-#endif
-#if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
-#include "qdbustrayicon_p.h"
-#endif
-
-#include <algorithm>
-
-QT_BEGIN_NAMESPACE
-
-Q_DECLARE_LOGGING_CATEGORY(qLcTray)
-Q_LOGGING_CATEGORY(lcQpaFonts, "qt.qpa.fonts")
-
-ResourceHelper::ResourceHelper()
-{
- std::fill(palettes, palettes + QPlatformTheme::NPalettes, static_cast<QPalette *>(0));
- std::fill(fonts, fonts + QPlatformTheme::NFonts, static_cast<QFont *>(0));
-}
-
-void ResourceHelper::clear()
-{
- qDeleteAll(palettes, palettes + QPlatformTheme::NPalettes);
- qDeleteAll(fonts, fonts + QPlatformTheme::NFonts);
- std::fill(palettes, palettes + QPlatformTheme::NPalettes, static_cast<QPalette *>(0));
- std::fill(fonts, fonts + QPlatformTheme::NFonts, static_cast<QFont *>(0));
-}
-
-const char *QGenericUnixTheme::name = "generic";
-
-// Default system font, corresponding to the value returned by 4.8 for
-// XRender/FontConfig which we can now assume as default.
-static const char defaultSystemFontNameC[] = "Sans Serif";
-static const char defaultFixedFontNameC[] = "monospace";
-enum { defaultSystemFontSize = 9 };
-
-#if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
-static bool isDBusTrayAvailable() {
- static bool dbusTrayAvailable = false;
- static bool dbusTrayAvailableKnown = false;
- if (!dbusTrayAvailableKnown) {
- QDBusMenuConnection conn;
- if (conn.isStatusNotifierHostRegistered())
- dbusTrayAvailable = true;
- dbusTrayAvailableKnown = true;
- qCDebug(qLcTray) << "D-Bus tray available:" << dbusTrayAvailable;
- }
- return dbusTrayAvailable;
-}
-#endif
-
-#ifndef QT_NO_DBUS
-static bool checkDBusGlobalMenuAvailable()
-{
- const QDBusConnection connection = QDBusConnection::sessionBus();
- static const QString registrarService = QStringLiteral("com.canonical.AppMenu.Registrar");
- if (const auto iface = connection.interface())
- return iface->isServiceRegistered(registrarService);
- return false;
-}
-
-static bool isDBusGlobalMenuAvailable()
-{
- static bool dbusGlobalMenuAvailable = checkDBusGlobalMenuAvailable();
- return dbusGlobalMenuAvailable;
-}
-#endif
-
-class QGenericUnixThemePrivate : public QPlatformThemePrivate
-{
-public:
- QGenericUnixThemePrivate()
- : QPlatformThemePrivate()
- , systemFont(QLatin1String(defaultSystemFontNameC), defaultSystemFontSize)
- , fixedFont(QLatin1String(defaultFixedFontNameC), systemFont.pointSize())
- {
- fixedFont.setStyleHint(QFont::TypeWriter);
- qCDebug(lcQpaFonts) << "default fonts: system" << systemFont << "fixed" << fixedFont;
- }
-
- const QFont systemFont;
- QFont fixedFont;
-};
-
-QGenericUnixTheme::QGenericUnixTheme()
- : QPlatformTheme(new QGenericUnixThemePrivate())
-{
-}
-
-const QFont *QGenericUnixTheme::font(Font type) const
-{
- Q_D(const QGenericUnixTheme);
- switch (type) {
- case QPlatformTheme::SystemFont:
- return &d->systemFont;
- case QPlatformTheme::FixedFont:
- return &d->fixedFont;
- default:
- return 0;
- }
-}
-
-// Helper to return the icon theme paths from XDG.
-QStringList QGenericUnixTheme::xdgIconThemePaths()
-{
- QStringList paths;
- // Add home directory first in search path
- const QFileInfo homeIconDir(QDir::homePath() + QLatin1String("/.icons"));
- if (homeIconDir.isDir())
- paths.prepend(homeIconDir.absoluteFilePath());
-
- paths.append(QStandardPaths::locateAll(QStandardPaths::GenericDataLocation,
- QStringLiteral("icons"),
- QStandardPaths::LocateDirectory));
-
- return paths;
-}
-
-QStringList QGenericUnixTheme::iconFallbackPaths()
-{
- QStringList paths;
- const QFileInfo pixmapsIconsDir(QStringLiteral("/usr/share/pixmaps"));
- if (pixmapsIconsDir.isDir())
- paths.append(pixmapsIconsDir.absoluteFilePath());
-
- return paths;
-}
-
-#ifndef QT_NO_DBUS
-QPlatformMenuBar *QGenericUnixTheme::createPlatformMenuBar() const
-{
- if (isDBusGlobalMenuAvailable())
- return new QDBusMenuBar();
- return nullptr;
-}
-#endif
-
-#if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
-QPlatformSystemTrayIcon *QGenericUnixTheme::createPlatformSystemTrayIcon() const
-{
- if (isDBusTrayAvailable())
- return new QDBusTrayIcon();
- return nullptr;
-}
-#endif
-
-QVariant QGenericUnixTheme::themeHint(ThemeHint hint) const
-{
- switch (hint) {
- case QPlatformTheme::SystemIconFallbackThemeName:
- return QVariant(QString(QStringLiteral("hicolor")));
- case QPlatformTheme::IconThemeSearchPaths:
- return xdgIconThemePaths();
- case QPlatformTheme::IconFallbackSearchPaths:
- return iconFallbackPaths();
- case QPlatformTheme::DialogButtonBoxButtonsHaveIcons:
- return QVariant(true);
- case QPlatformTheme::StyleNames: {
- QStringList styleNames;
- styleNames << QStringLiteral("Fusion") << QStringLiteral("Windows");
- return QVariant(styleNames);
- }
- case QPlatformTheme::KeyboardScheme:
- return QVariant(int(X11KeyboardScheme));
- case QPlatformTheme::UiEffects:
- return QVariant(int(HoverEffect));
- default:
- break;
- }
- return QPlatformTheme::themeHint(hint);
-}
-
-// Helper functions for implementing QPlatformTheme::fileIcon() for XDG icon themes.
-static QList<QSize> availableXdgFileIconSizes()
-{
- return QIcon::fromTheme(QStringLiteral("inode-directory")).availableSizes();
-}
-
-#if QT_CONFIG(mimetype)
-static QIcon xdgFileIcon(const QFileInfo &fileInfo)
-{
- QMimeDatabase mimeDatabase;
- QMimeType mimeType = mimeDatabase.mimeTypeForFile(fileInfo);
- if (!mimeType.isValid())
- return QIcon();
- const QString &iconName = mimeType.iconName();
- if (!iconName.isEmpty()) {
- const QIcon icon = QIcon::fromTheme(iconName);
- if (!icon.isNull())
- return icon;
- }
- const QString &genericIconName = mimeType.genericIconName();
- return genericIconName.isEmpty() ? QIcon() : QIcon::fromTheme(genericIconName);
-}
-#endif
-
-#if QT_CONFIG(settings)
-class QKdeThemePrivate : public QPlatformThemePrivate
-{
-public:
- QKdeThemePrivate(const QStringList &kdeDirs, int kdeVersion)
- : kdeDirs(kdeDirs)
- , kdeVersion(kdeVersion)
- { }
-
- static QString kdeGlobals(const QString &kdeDir, int kdeVersion)
- {
- if (kdeVersion > 4)
- return kdeDir + QLatin1String("/kdeglobals");
- return kdeDir + QLatin1String("/share/config/kdeglobals");
- }
-
- void refresh();
- static QVariant readKdeSetting(const QString &key, const QStringList &kdeDirs, int kdeVersion, QHash<QString, QSettings*> &kdeSettings);
- static void readKdeSystemPalette(const QStringList &kdeDirs, int kdeVersion, QHash<QString, QSettings*> &kdeSettings, QPalette *pal);
- static QFont *kdeFont(const QVariant &fontValue);
- static QStringList kdeIconThemeSearchPaths(const QStringList &kdeDirs);
-
- const QStringList kdeDirs;
- const int kdeVersion;
-
- ResourceHelper resources;
- QString iconThemeName;
- QString iconFallbackThemeName;
- QStringList styleNames;
- int toolButtonStyle = Qt::ToolButtonTextBesideIcon;
- int toolBarIconSize = 0;
- bool singleClick = true;
- bool showIconsOnPushButtons = true;
- int wheelScrollLines = 3;
- int doubleClickInterval = 400;
- int startDragDist = 10;
- int startDragTime = 500;
- int cursorBlinkRate = 1000;
-};
-
-void QKdeThemePrivate::refresh()
-{
- resources.clear();
-
- toolButtonStyle = Qt::ToolButtonTextBesideIcon;
- toolBarIconSize = 0;
- styleNames.clear();
- if (kdeVersion >= 5)
- styleNames << QStringLiteral("breeze");
- styleNames << QStringLiteral("Oxygen") << QStringLiteral("fusion") << QStringLiteral("windows");
- if (kdeVersion >= 5)
- iconFallbackThemeName = iconThemeName = QStringLiteral("breeze");
- else
- iconFallbackThemeName = iconThemeName = QStringLiteral("oxygen");
-
- QHash<QString, QSettings*> kdeSettings;
-
- QPalette systemPalette = QPalette();
- readKdeSystemPalette(kdeDirs, kdeVersion, kdeSettings, &systemPalette);
- resources.palettes[QPlatformTheme::SystemPalette] = new QPalette(systemPalette);
- //## TODO tooltip color
-
- const QVariant styleValue = readKdeSetting(QStringLiteral("widgetStyle"), kdeDirs, kdeVersion, kdeSettings);
- if (styleValue.isValid()) {
- const QString style = styleValue.toString();
- if (style != styleNames.front())
- styleNames.push_front(style);
- }
-
- const QVariant singleClickValue = readKdeSetting(QStringLiteral("KDE/SingleClick"), kdeDirs, kdeVersion, kdeSettings);
- if (singleClickValue.isValid())
- singleClick = singleClickValue.toBool();
-
- const QVariant showIconsOnPushButtonsValue = readKdeSetting(QStringLiteral("KDE/ShowIconsOnPushButtons"), kdeDirs, kdeVersion, kdeSettings);
- if (showIconsOnPushButtonsValue.isValid())
- showIconsOnPushButtons = showIconsOnPushButtonsValue.toBool();
-
- const QVariant themeValue = readKdeSetting(QStringLiteral("Icons/Theme"), kdeDirs, kdeVersion, kdeSettings);
- if (themeValue.isValid())
- iconThemeName = themeValue.toString();
-
- const QVariant toolBarIconSizeValue = readKdeSetting(QStringLiteral("ToolbarIcons/Size"), kdeDirs, kdeVersion, kdeSettings);
- if (toolBarIconSizeValue.isValid())
- toolBarIconSize = toolBarIconSizeValue.toInt();
-
- const QVariant toolbarStyleValue = readKdeSetting(QStringLiteral("Toolbar style/ToolButtonStyle"), kdeDirs, kdeVersion, kdeSettings);
- if (toolbarStyleValue.isValid()) {
- const QString toolBarStyle = toolbarStyleValue.toString();
- if (toolBarStyle == QLatin1String("TextBesideIcon"))
- toolButtonStyle = Qt::ToolButtonTextBesideIcon;
- else if (toolBarStyle == QLatin1String("TextOnly"))
- toolButtonStyle = Qt::ToolButtonTextOnly;
- else if (toolBarStyle == QLatin1String("TextUnderIcon"))
- toolButtonStyle = Qt::ToolButtonTextUnderIcon;
- }
-
- const QVariant wheelScrollLinesValue = readKdeSetting(QStringLiteral("KDE/WheelScrollLines"), kdeDirs, kdeVersion, kdeSettings);
- if (wheelScrollLinesValue.isValid())
- wheelScrollLines = wheelScrollLinesValue.toInt();
-
- const QVariant doubleClickIntervalValue = readKdeSetting(QStringLiteral("KDE/DoubleClickInterval"), kdeDirs, kdeVersion, kdeSettings);
- if (doubleClickIntervalValue.isValid())
- doubleClickInterval = doubleClickIntervalValue.toInt();
-
- const QVariant startDragDistValue = readKdeSetting(QStringLiteral("KDE/StartDragDist"), kdeDirs, kdeVersion, kdeSettings);
- if (startDragDistValue.isValid())
- startDragDist = startDragDistValue.toInt();
-
- const QVariant startDragTimeValue = readKdeSetting(QStringLiteral("KDE/StartDragTime"), kdeDirs, kdeVersion, kdeSettings);
- if (startDragTimeValue.isValid())
- startDragTime = startDragTimeValue.toInt();
-
- const QVariant cursorBlinkRateValue = readKdeSetting(QStringLiteral("KDE/CursorBlinkRate"), kdeDirs, kdeVersion, kdeSettings);
- if (cursorBlinkRateValue.isValid()) {
- cursorBlinkRate = cursorBlinkRateValue.toInt();
- cursorBlinkRate = cursorBlinkRate > 0 ? qBound(200, cursorBlinkRate, 2000) : 0;
- }
-
- // Read system font, ignore 'smallestReadableFont'
- if (QFont *systemFont = kdeFont(readKdeSetting(QStringLiteral("font"), kdeDirs, kdeVersion, kdeSettings)))
- resources.fonts[QPlatformTheme::SystemFont] = systemFont;
- else
- resources.fonts[QPlatformTheme::SystemFont] = new QFont(QLatin1String(defaultSystemFontNameC), defaultSystemFontSize);
-
- if (QFont *fixedFont = kdeFont(readKdeSetting(QStringLiteral("fixed"), kdeDirs, kdeVersion, kdeSettings))) {
- resources.fonts[QPlatformTheme::FixedFont] = fixedFont;
- } else {
- fixedFont = new QFont(QLatin1String(defaultFixedFontNameC), defaultSystemFontSize);
- fixedFont->setStyleHint(QFont::TypeWriter);
- resources.fonts[QPlatformTheme::FixedFont] = fixedFont;
- }
-
- if (QFont *menuFont = kdeFont(readKdeSetting(QStringLiteral("menuFont"), kdeDirs, kdeVersion, kdeSettings))) {
- resources.fonts[QPlatformTheme::MenuFont] = menuFont;
- resources.fonts[QPlatformTheme::MenuBarFont] = new QFont(*menuFont);
- }
-
- if (QFont *toolBarFont = kdeFont(readKdeSetting(QStringLiteral("toolBarFont"), kdeDirs, kdeVersion, kdeSettings)))
- resources.fonts[QPlatformTheme::ToolButtonFont] = toolBarFont;
-
- qCDebug(lcQpaFonts) << "default fonts: system" << resources.fonts[QPlatformTheme::SystemFont]
- << "fixed" << resources.fonts[QPlatformTheme::FixedFont];
- qDeleteAll(kdeSettings);
-}
-
-QVariant QKdeThemePrivate::readKdeSetting(const QString &key, const QStringList &kdeDirs, int kdeVersion, QHash<QString, QSettings*> &kdeSettings)
-{
- for (const QString &kdeDir : kdeDirs) {
- QSettings *settings = kdeSettings.value(kdeDir);
- if (!settings) {
- const QString kdeGlobalsPath = kdeGlobals(kdeDir, kdeVersion);
- 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 QVariant &value)
-{
- if (!value.isValid())
- return false;
- const QStringList values = value.toStringList();
- if (values.size() != 3)
- return false;
- pal->setBrush(role, QColor(values.at(0).toInt(), values.at(1).toInt(), values.at(2).toInt()));
- return true;
-}
-
-void QKdeThemePrivate::readKdeSystemPalette(const QStringList &kdeDirs, int kdeVersion, QHash<QString, QSettings*> &kdeSettings, QPalette *pal)
-{
- if (!kdeColor(pal, QPalette::Button, readKdeSetting(QStringLiteral("Colors:Button/BackgroundNormal"), kdeDirs, kdeVersion, kdeSettings))) {
- // kcolorscheme.cpp: SetDefaultColors
- const QColor defaultWindowBackground(214, 210, 208);
- const QColor defaultButtonBackground(223, 220, 217);
- *pal = QPalette(defaultButtonBackground, defaultWindowBackground);
- return;
- }
-
- kdeColor(pal, QPalette::Window, readKdeSetting(QStringLiteral("Colors:Window/BackgroundNormal"), kdeDirs, kdeVersion, kdeSettings));
- kdeColor(pal, QPalette::Text, readKdeSetting(QStringLiteral("Colors:View/ForegroundNormal"), kdeDirs, kdeVersion, kdeSettings));
- kdeColor(pal, QPalette::WindowText, readKdeSetting(QStringLiteral("Colors:Window/ForegroundNormal"), kdeDirs, kdeVersion, kdeSettings));
- kdeColor(pal, QPalette::Base, readKdeSetting(QStringLiteral("Colors:View/BackgroundNormal"), kdeDirs, kdeVersion, kdeSettings));
- kdeColor(pal, QPalette::Highlight, readKdeSetting(QStringLiteral("Colors:Selection/BackgroundNormal"), kdeDirs, kdeVersion, kdeSettings));
- kdeColor(pal, QPalette::HighlightedText, readKdeSetting(QStringLiteral("Colors:Selection/ForegroundNormal"), kdeDirs, kdeVersion, kdeSettings));
- kdeColor(pal, QPalette::AlternateBase, readKdeSetting(QStringLiteral("Colors:View/BackgroundAlternate"), kdeDirs, kdeVersion, kdeSettings));
- kdeColor(pal, QPalette::ButtonText, readKdeSetting(QStringLiteral("Colors:Button/ForegroundNormal"), kdeDirs, kdeVersion, kdeSettings));
- kdeColor(pal, QPalette::Link, readKdeSetting(QStringLiteral("Colors:View/ForegroundLink"), kdeDirs, kdeVersion, kdeSettings));
- kdeColor(pal, QPalette::LinkVisited, readKdeSetting(QStringLiteral("Colors:View/ForegroundVisited"), kdeDirs, kdeVersion, kdeSettings));
- kdeColor(pal, QPalette::ToolTipBase, readKdeSetting(QStringLiteral("Colors:Tooltip/BackgroundNormal"), kdeDirs, kdeVersion, kdeSettings));
- kdeColor(pal, QPalette::ToolTipText, readKdeSetting(QStringLiteral("Colors:Tooltip/ForegroundNormal"), kdeDirs, kdeVersion, 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.
- // We use a bit simpler approach here, similar logic than in qt_palette_from_color().
- const QColor button = pal->color(QPalette::Button);
- int h, s, v;
- button.getHsv(&h, &s, &v);
-
- const QBrush whiteBrush = QBrush(Qt::white);
- const QBrush buttonBrush = QBrush(button);
- const QBrush buttonBrushDark = QBrush(button.darker(v > 128 ? 200 : 50));
- const QBrush buttonBrushDark150 = QBrush(button.darker(v > 128 ? 150 : 75));
- const QBrush buttonBrushLight150 = QBrush(button.lighter(v > 128 ? 150 : 75));
- const QBrush buttonBrushLight = QBrush(button.lighter(v > 128 ? 200 : 50));
-
- pal->setBrush(QPalette::Disabled, QPalette::WindowText, buttonBrushDark);
- pal->setBrush(QPalette::Disabled, QPalette::ButtonText, buttonBrushDark);
- pal->setBrush(QPalette::Disabled, QPalette::Button, buttonBrush);
- pal->setBrush(QPalette::Disabled, QPalette::Text, buttonBrushDark);
- pal->setBrush(QPalette::Disabled, QPalette::BrightText, whiteBrush);
- pal->setBrush(QPalette::Disabled, QPalette::Base, buttonBrush);
- pal->setBrush(QPalette::Disabled, QPalette::Window, buttonBrush);
- pal->setBrush(QPalette::Disabled, QPalette::Highlight, buttonBrushDark150);
- pal->setBrush(QPalette::Disabled, QPalette::HighlightedText, buttonBrushLight150);
-
- // set calculated colors for all groups
- pal->setBrush(QPalette::Light, buttonBrushLight);
- pal->setBrush(QPalette::Midlight, buttonBrushLight150);
- pal->setBrush(QPalette::Mid, buttonBrushDark150);
- pal->setBrush(QPalette::Dark, buttonBrushDark);
-}
-
-/*!
- \class QKdeTheme
- \brief QKdeTheme is a theme implementation for the KDE desktop (version 4 or higher).
- \since 5.0
- \internal
- \ingroup qpa
-*/
-
-const char *QKdeTheme::name = "kde";
-
-QKdeTheme::QKdeTheme(const QStringList& kdeDirs, int kdeVersion)
- : QPlatformTheme(new QKdeThemePrivate(kdeDirs,kdeVersion))
-{
- d_func()->refresh();
-}
-
-QFont *QKdeThemePrivate::kdeFont(const QVariant &fontValue)
-{
- 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
- // default constructor of QFont, which accesses QGuiApplication::systemFont()
- // causing recursion.
- QString fontDescription;
- QString fontFamily;
- if (fontValue.type() == QVariant::StringList) {
- const QStringList list = fontValue.toStringList();
- if (!list.isEmpty()) {
- fontFamily = list.first();
- fontDescription = list.join(QLatin1Char(','));
- }
- } else {
- fontDescription = fontFamily = fontValue.toString();
- }
- if (!fontDescription.isEmpty()) {
- QFont font(fontFamily);
- if (font.fromString(fontDescription))
- return new QFont(font);
- }
- }
- return 0;
-}
-
-
-QStringList QKdeThemePrivate::kdeIconThemeSearchPaths(const QStringList &kdeDirs)
-{
- QStringList paths = QGenericUnixTheme::xdgIconThemePaths();
- const QString iconPath = QStringLiteral("/share/icons");
- for (const QString &candidate : kdeDirs) {
- const QFileInfo fi(candidate + iconPath);
- if (fi.isDir())
- paths.append(fi.absoluteFilePath());
- }
- return paths;
-}
-
-QVariant QKdeTheme::themeHint(QPlatformTheme::ThemeHint hint) const
-{
- Q_D(const QKdeTheme);
- switch (hint) {
- case QPlatformTheme::UseFullScreenForPopupMenu:
- return QVariant(true);
- case QPlatformTheme::DialogButtonBoxButtonsHaveIcons:
- return QVariant(d->showIconsOnPushButtons);
- case QPlatformTheme::DialogButtonBoxLayout:
- return QVariant(QPlatformDialogHelper::KdeLayout);
- case QPlatformTheme::ToolButtonStyle:
- return QVariant(d->toolButtonStyle);
- case QPlatformTheme::ToolBarIconSize:
- return QVariant(d->toolBarIconSize);
- case QPlatformTheme::SystemIconThemeName:
- return QVariant(d->iconThemeName);
- case QPlatformTheme::SystemIconFallbackThemeName:
- return QVariant(d->iconFallbackThemeName);
- case QPlatformTheme::IconThemeSearchPaths:
- return QVariant(d->kdeIconThemeSearchPaths(d->kdeDirs));
- case QPlatformTheme::IconPixmapSizes:
- return QVariant::fromValue(availableXdgFileIconSizes());
- case QPlatformTheme::StyleNames:
- return QVariant(d->styleNames);
- case QPlatformTheme::KeyboardScheme:
- return QVariant(int(KdeKeyboardScheme));
- case QPlatformTheme::ItemViewActivateItemOnSingleClick:
- return QVariant(d->singleClick);
- case QPlatformTheme::WheelScrollLines:
- return QVariant(d->wheelScrollLines);
- case QPlatformTheme::MouseDoubleClickInterval:
- return QVariant(d->doubleClickInterval);
- case QPlatformTheme::StartDragTime:
- return QVariant(d->startDragTime);
- case QPlatformTheme::StartDragDistance:
- return QVariant(d->startDragDist);
- case QPlatformTheme::CursorFlashTime:
- return QVariant(d->cursorBlinkRate);
- case QPlatformTheme::UiEffects:
- return QVariant(int(HoverEffect));
- default:
- break;
- }
- return QPlatformTheme::themeHint(hint);
-}
-
-QIcon QKdeTheme::fileIcon(const QFileInfo &fileInfo, QPlatformTheme::IconOptions) const
-{
-#if QT_CONFIG(mimetype)
- return xdgFileIcon(fileInfo);
-#else
- Q_UNUSED(fileInfo);
- return QIcon();
-#endif
-}
-
-const QPalette *QKdeTheme::palette(Palette type) const
-{
- Q_D(const QKdeTheme);
- return d->resources.palettes[type];
-}
-
-const QFont *QKdeTheme::font(Font type) const
-{
- Q_D(const QKdeTheme);
- return d->resources.fonts[type];
-}
-
-QPlatformTheme *QKdeTheme::createKdeTheme()
-{
- const QByteArray kdeVersionBA = qgetenv("KDE_SESSION_VERSION");
- const int kdeVersion = kdeVersionBA.toInt();
- if (kdeVersion < 4)
- return 0;
-
- if (kdeVersion > 4)
- // Plasma 5 follows XDG spec
- // but uses the same config file format:
- return new QKdeTheme(QStandardPaths::standardLocations(QStandardPaths::GenericConfigLocation), kdeVersion);
-
- // 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())
- kdeDirs += kdeHomePathVar;
-
- const QString kdeDirsVar = QFile::decodeName(qgetenv("KDEDIRS"));
- if (!kdeDirsVar.isEmpty())
- kdeDirs += kdeDirsVar.split(QLatin1Char(':'), QString::SkipEmptyParts);
-
- const QString kdeVersionHomePath = QDir::homePath() + QLatin1String("/.kde") + QLatin1String(kdeVersionBA);
- if (QFileInfo(kdeVersionHomePath).isDir())
- kdeDirs += kdeVersionHomePath;
-
- const QString kdeHomePath = QDir::homePath() + QLatin1String("/.kde");
- if (QFileInfo(kdeHomePath).isDir())
- kdeDirs += kdeHomePath;
-
- const QString kdeRcPath = QLatin1String("/etc/kde") + QLatin1String(kdeVersionBA) + QLatin1String("rc");
- if (QFileInfo(kdeRcPath).isReadable()) {
- QSettings kdeSettings(kdeRcPath, QSettings::IniFormat);
- kdeSettings.beginGroup(QStringLiteral("Directories-default"));
- kdeDirs += kdeSettings.value(QStringLiteral("prefixes")).toStringList();
- }
-
- const QString kdeVersionPrefix = QLatin1String("/etc/kde") + QLatin1String(kdeVersionBA);
- if (QFileInfo(kdeVersionPrefix).isDir())
- kdeDirs += kdeVersionPrefix;
-
- kdeDirs.removeDuplicates();
- if (kdeDirs.isEmpty()) {
- qWarning("Unable to determine KDE dirs");
- return 0;
- }
-
- return new QKdeTheme(kdeDirs, kdeVersion);
-}
-
-#ifndef QT_NO_DBUS
-QPlatformMenuBar *QKdeTheme::createPlatformMenuBar() const
-{
- if (isDBusGlobalMenuAvailable())
- return new QDBusMenuBar();
- return nullptr;
-}
-#endif
-
-#if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
-QPlatformSystemTrayIcon *QKdeTheme::createPlatformSystemTrayIcon() const
-{
- if (isDBusTrayAvailable())
- return new QDBusTrayIcon();
- return nullptr;
-}
-#endif
-
-#endif // settings
-
-/*!
- \class QGnomeTheme
- \brief QGnomeTheme is a theme implementation for the Gnome desktop.
- \since 5.0
- \internal
- \ingroup qpa
-*/
-
-const char *QGnomeTheme::name = "gnome";
-
-class QGnomeThemePrivate : public QPlatformThemePrivate
-{
-public:
- QGnomeThemePrivate() : systemFont(nullptr), fixedFont(nullptr) {}
- ~QGnomeThemePrivate() { delete systemFont; delete fixedFont; }
-
- void configureFonts(const QString &gtkFontName) const
- {
- Q_ASSERT(!systemFont);
- const int split = gtkFontName.lastIndexOf(QChar::Space);
- float size = gtkFontName.midRef(split + 1).toFloat();
- QString fontName = gtkFontName.left(split);
-
- systemFont = new QFont(fontName, size);
- fixedFont = new QFont(QLatin1String(defaultFixedFontNameC), systemFont->pointSize());
- fixedFont->setStyleHint(QFont::TypeWriter);
- qCDebug(lcQpaFonts) << "default fonts: system" << systemFont << "fixed" << fixedFont;
- }
-
- mutable QFont *systemFont;
- mutable QFont *fixedFont;
-};
-
-QGnomeTheme::QGnomeTheme()
- : QPlatformTheme(new QGnomeThemePrivate())
-{
-}
-
-QVariant QGnomeTheme::themeHint(QPlatformTheme::ThemeHint hint) const
-{
- switch (hint) {
- case QPlatformTheme::DialogButtonBoxButtonsHaveIcons:
- return QVariant(true);
- case QPlatformTheme::DialogButtonBoxLayout:
- return QVariant(QPlatformDialogHelper::GnomeLayout);
- case QPlatformTheme::SystemIconThemeName:
- return QVariant(QStringLiteral("Adwaita"));
- case QPlatformTheme::SystemIconFallbackThemeName:
- return QVariant(QStringLiteral("gnome"));
- case QPlatformTheme::IconThemeSearchPaths:
- return QVariant(QGenericUnixTheme::xdgIconThemePaths());
- case QPlatformTheme::IconPixmapSizes:
- return QVariant::fromValue(availableXdgFileIconSizes());
- case QPlatformTheme::StyleNames: {
- QStringList styleNames;
- styleNames << QStringLiteral("fusion") << QStringLiteral("windows");
- return QVariant(styleNames);
- }
- case QPlatformTheme::KeyboardScheme:
- return QVariant(int(GnomeKeyboardScheme));
- case QPlatformTheme::PasswordMaskCharacter:
- return QVariant(QChar(0x2022));
- case QPlatformTheme::UiEffects:
- return QVariant(int(HoverEffect));
- default:
- break;
- }
- return QPlatformTheme::themeHint(hint);
-}
-
-QIcon QGnomeTheme::fileIcon(const QFileInfo &fileInfo, QPlatformTheme::IconOptions) const
-{
-#if QT_CONFIG(mimetype)
- return xdgFileIcon(fileInfo);
-#else
- Q_UNUSED(fileInfo);
- return QIcon();
-#endif
-}
-
-const QFont *QGnomeTheme::font(Font type) const
-{
- Q_D(const QGnomeTheme);
- if (!d->systemFont)
- d->configureFonts(gtkFontName());
- switch (type) {
- case QPlatformTheme::SystemFont:
- return d->systemFont;
- case QPlatformTheme::FixedFont:
- return d->fixedFont;
- default:
- return 0;
- }
-}
-
-QString QGnomeTheme::gtkFontName() const
-{
- return QStringLiteral("%1 %2").arg(QLatin1String(defaultSystemFontNameC)).arg(defaultSystemFontSize);
-}
-
-#ifndef QT_NO_DBUS
-QPlatformMenuBar *QGnomeTheme::createPlatformMenuBar() const
-{
- if (isDBusGlobalMenuAvailable())
- return new QDBusMenuBar();
- return nullptr;
-}
-#endif
-
-#if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
-QPlatformSystemTrayIcon *QGnomeTheme::createPlatformSystemTrayIcon() const
-{
- if (isDBusTrayAvailable())
- return new QDBusTrayIcon();
- return nullptr;
-}
-#endif
-
-QString QGnomeTheme::standardButtonText(int button) const
-{
- switch (button) {
- case QPlatformDialogHelper::Ok:
- return QCoreApplication::translate("QGnomeTheme", "&OK");
- case QPlatformDialogHelper::Save:
- return QCoreApplication::translate("QGnomeTheme", "&Save");
- case QPlatformDialogHelper::Cancel:
- return QCoreApplication::translate("QGnomeTheme", "&Cancel");
- case QPlatformDialogHelper::Close:
- return QCoreApplication::translate("QGnomeTheme", "&Close");
- case QPlatformDialogHelper::Discard:
- return QCoreApplication::translate("QGnomeTheme", "Close without Saving");
- default:
- break;
- }
- return QPlatformTheme::standardButtonText(button);
-}
-
-/*!
- \brief Creates a UNIX theme according to the detected desktop environment.
-*/
-
-QPlatformTheme *QGenericUnixTheme::createUnixTheme(const QString &name)
-{
- if (name == QLatin1String(QGenericUnixTheme::name))
- return new QGenericUnixTheme;
-#if QT_CONFIG(settings)
- if (name == QLatin1String(QKdeTheme::name))
- if (QPlatformTheme *kdeTheme = QKdeTheme::createKdeTheme())
- return kdeTheme;
-#endif
- if (name == QLatin1String(QGnomeTheme::name))
- return new QGnomeTheme;
- return nullptr;
-}
-
-QStringList QGenericUnixTheme::themeNames()
-{
- QStringList result;
- if (QGuiApplication::desktopSettingsAware()) {
- const QByteArray desktopEnvironment = QGuiApplicationPrivate::platformIntegration()->services()->desktopEnvironment();
- QList<QByteArray> gtkBasedEnvironments;
- gtkBasedEnvironments << "GNOME"
- << "X-CINNAMON"
- << "UNITY"
- << "MATE"
- << "XFCE"
- << "LXDE";
- const QList<QByteArray> desktopNames = desktopEnvironment.split(':');
- for (const QByteArray &desktopName : desktopNames) {
- if (desktopEnvironment == "KDE") {
-#if QT_CONFIG(settings)
- result.push_back(QLatin1String(QKdeTheme::name));
-#endif
- } else if (gtkBasedEnvironments.contains(desktopName)) {
- // prefer the GTK3 theme implementation with native dialogs etc.
- result.push_back(QStringLiteral("gtk3"));
- // fallback to the generic Gnome theme if loading the GTK3 theme fails
- result.push_back(QLatin1String(QGnomeTheme::name));
- } else {
- // unknown, but lowercase the name (our standard practice) and
- // remove any "x-" prefix
- QString s = QString::fromLatin1(desktopName.toLower());
- result.push_back(s.startsWith(QLatin1String("x-")) ? s.mid(2) : s);
- }
- }
- } // desktopSettingsAware
- result.append(QLatin1String(QGenericUnixTheme::name));
- return result;
-}
-
-QT_END_NAMESPACE