335 toolButtonStyle = Qt::ToolButtonTextBesideIcon;
339 styleNames << QStringLiteral(
"breeze");
340 styleNames << QStringLiteral(
"Oxygen") << QStringLiteral(
"Fusion") << QStringLiteral(
"windows");
342 iconFallbackThemeName = iconThemeName = QStringLiteral(
"breeze");
344 iconFallbackThemeName = iconThemeName = QStringLiteral(
"oxygen");
346 systemPalette.reset(
new QPalette(QPalette()));
347 readKdeSystemPalette(kdeDirs,
kdeVersion, kdeSettings, systemPalette.get());
349 const QVariant styleValue = readKdeSetting(KdeSetting::WidgetStyle);
350 if (styleValue.isValid()) {
351 const QString style = styleValue.toString();
352 if (style != styleNames.front())
353 styleNames.push_front(style);
356 const QVariant colorScheme = readKdeSetting(KdeSetting::ColorScheme);
358 updateColorScheme(colorScheme.toString());
360 const QVariant singleClickValue = readKdeSetting(KdeSetting::SingleClick);
361 if (singleClickValue.isValid())
368 const QVariant showIconsOnPushButtonsValue = readKdeSetting(KdeSetting::ShowIconsOnPushButtons);
369 if (showIconsOnPushButtonsValue.isValid())
372 const QVariant themeValue = readKdeSetting(KdeSetting::IconTheme);
373 if (themeValue.isValid())
374 iconThemeName = themeValue.toString();
376 const QVariant toolBarIconSizeValue = readKdeSetting(KdeSetting::ToolBarIconSize);
377 if (toolBarIconSizeValue.isValid())
380 const QVariant toolbarStyleValue = readKdeSetting(KdeSetting::ToolButtonStyle);
381 if (toolbarStyleValue.isValid()) {
382 const QString toolBarStyle = toolbarStyleValue.toString();
383 if (toolBarStyle ==
"TextBesideIcon"_L1)
384 toolButtonStyle = Qt::ToolButtonTextBesideIcon;
385 else if (toolBarStyle ==
"TextOnly"_L1)
386 toolButtonStyle = Qt::ToolButtonTextOnly;
387 else if (toolBarStyle ==
"TextUnderIcon"_L1)
388 toolButtonStyle = Qt::ToolButtonTextUnderIcon;
391 const QVariant wheelScrollLinesValue = readKdeSetting(KdeSetting::WheelScrollLines);
392 if (wheelScrollLinesValue.isValid())
395 const QVariant doubleClickIntervalValue = readKdeSetting(KdeSetting::DoubleClickInterval);
396 if (doubleClickIntervalValue.isValid())
399 const QVariant startDragDistValue = readKdeSetting(KdeSetting::StartDragDistance);
400 if (startDragDistValue.isValid())
403 const QVariant startDragTimeValue = readKdeSetting(KdeSetting::StartDragTime);
404 if (startDragTimeValue.isValid())
407 const QVariant cursorBlinkRateValue = readKdeSetting(KdeSetting::CursorBlinkRate);
408 if (cursorBlinkRateValue.isValid()) {
414 if (QFont *systemFont = kdeFont(readKdeSetting(KdeSetting::Font)))
415 fonts[QPlatformTheme::SystemFont] = systemFont;
417 fonts[QPlatformTheme::SystemFont] =
new QFont(QLatin1StringView(QGenericUnixTheme::defaultSystemFontNameC),
418 QGenericUnixTheme::defaultSystemFontSize);
420 if (QFont *fixedFont = kdeFont(readKdeSetting(KdeSetting::Fixed))) {
421 fonts[QPlatformTheme::FixedFont] = fixedFont;
423 fixedFont =
new QFont(QLatin1StringView(QGenericUnixTheme::defaultFixedFontNameC),
424 QGenericUnixTheme::defaultSystemFontSize);
425 fixedFont->setStyleHint(QFont::TypeWriter);
426 fonts[QPlatformTheme::FixedFont] = fixedFont;
429 if (QFont *menuFont = kdeFont(readKdeSetting(KdeSetting::MenuFont))) {
430 fonts[QPlatformTheme::MenuFont] = menuFont;
431 fonts[QPlatformTheme::MenuBarFont] =
new QFont(*menuFont);
434 if (QFont *toolBarFont = kdeFont(readKdeSetting(KdeSetting::ToolBarFont)))
435 fonts[QPlatformTheme::ToolButtonFont] = toolBarFont;
437 QWindowSystemInterface::handleThemeChange();
439 qCDebug(lcQpaFonts) <<
"default fonts: system" << fonts[QPlatformTheme::SystemFont]
440 <<
"fixed" << fonts[QPlatformTheme::FixedFont];
441 qDeleteAll(kdeSettings);
488void QKdeThemePrivate::readKdeSystemPalette(
const QStringList &kdeDirs,
int kdeVersion, QHash<QString, QSettings*> &kdeSettings, QPalette *pal)
490 if (!kdeColor(pal, QPalette::Button, readKdeSetting(KdeSetting::ButtonBackground, kdeDirs, kdeVersion, kdeSettings))) {
492 const QColor defaultWindowBackground(214, 210, 208);
493 const QColor defaultButtonBackground(223, 220, 217);
494 *pal = QPalette(defaultButtonBackground, defaultWindowBackground);
498 kdeColor(pal, QPalette::Window, readKdeSetting(KdeSetting::WindowBackground, kdeDirs, kdeVersion, kdeSettings));
499 kdeColor(pal, QPalette::Text, readKdeSetting(KdeSetting::ViewForeground, kdeDirs, kdeVersion, kdeSettings));
500 kdeColor(pal, QPalette::WindowText, readKdeSetting(KdeSetting::WindowForeground, kdeDirs, kdeVersion, kdeSettings));
501 kdeColor(pal, QPalette::Base, readKdeSetting(KdeSetting::ViewBackground, kdeDirs, kdeVersion, kdeSettings));
502 kdeColor(pal, QPalette::Highlight, readKdeSetting(KdeSetting::SelectionBackground, kdeDirs, kdeVersion, kdeSettings));
503 kdeColor(pal, QPalette::HighlightedText, readKdeSetting(KdeSetting::SelectionForeground, kdeDirs, kdeVersion, kdeSettings));
504 kdeColor(pal, QPalette::AlternateBase, readKdeSetting(KdeSetting::ViewBackgroundAlternate, kdeDirs, kdeVersion, kdeSettings));
505 kdeColor(pal, QPalette::ButtonText, readKdeSetting(KdeSetting::ButtonForeground, kdeDirs, kdeVersion, kdeSettings));
506 kdeColor(pal, QPalette::Link, readKdeSetting(KdeSetting::ViewForegroundLink, kdeDirs, kdeVersion, kdeSettings));
507 kdeColor(pal, QPalette::LinkVisited, readKdeSetting(KdeSetting::ViewForegroundVisited, kdeDirs, kdeVersion, kdeSettings));
508 kdeColor(pal, QPalette::ToolTipBase, readKdeSetting(KdeSetting::TooltipBackground, kdeDirs, kdeVersion, kdeSettings));
509 kdeColor(pal, QPalette::ToolTipText, readKdeSetting(KdeSetting::TooltipForeground, kdeDirs, kdeVersion, kdeSettings));
514 const QColor button = pal->color(QPalette::Button);
516 button.getHsv(&h, &s, &v);
518 const QBrush whiteBrush = QBrush(Qt::white);
519 const QBrush buttonBrush = QBrush(button);
520 const QBrush buttonBrushDark = QBrush(button.darker(v > 128 ? 200 : 50));
521 const QBrush buttonBrushDark150 = QBrush(button.darker(v > 128 ? 150 : 75));
522 const QBrush buttonBrushLight150 = QBrush(button.lighter(v > 128 ? 150 : 75));
523 const QBrush buttonBrushLight = QBrush(button.lighter(v > 128 ? 200 : 50));
525 pal->setBrush(QPalette::Disabled, QPalette::WindowText, buttonBrushDark);
526 pal->setBrush(QPalette::Disabled, QPalette::ButtonText, buttonBrushDark);
527 pal->setBrush(QPalette::Disabled, QPalette::Button, buttonBrush);
528 pal->setBrush(QPalette::Disabled, QPalette::Text, buttonBrushDark);
529 pal->setBrush(QPalette::Disabled, QPalette::BrightText, whiteBrush);
530 pal->setBrush(QPalette::Disabled, QPalette::Base, buttonBrush);
531 pal->setBrush(QPalette::Disabled, QPalette::Window, buttonBrush);
532 pal->setBrush(QPalette::Disabled, QPalette::Highlight, buttonBrushDark150);
533 pal->setBrush(QPalette::Disabled, QPalette::HighlightedText, buttonBrushLight150);
536 pal->setBrush(QPalette::Light, buttonBrushLight);
537 pal->setBrush(QPalette::Midlight, buttonBrushLight150);
538 pal->setBrush(QPalette::Mid, buttonBrushDark150);
539 pal->setBrush(QPalette::Dark, buttonBrushDark);
601QVariant QKdeTheme::themeHint(QPlatformTheme::ThemeHint hint)
const
603 Q_D(
const QKdeTheme);
605 case QPlatformTheme::UseFullScreenForPopupMenu:
606 return QVariant(
true);
607 case QPlatformTheme::DialogButtonBoxButtonsHaveIcons:
608 return QVariant(d->showIconsOnPushButtons);
609 case QPlatformTheme::DialogButtonBoxLayout:
610 return QVariant(QPlatformDialogHelper::KdeLayout);
611 case QPlatformTheme::ToolButtonStyle:
612 return QVariant(d->toolButtonStyle);
613 case QPlatformTheme::ToolBarIconSize:
614 return QVariant(d->toolBarIconSize);
615 case QPlatformTheme::SystemIconThemeName:
616 return QVariant(d->iconThemeName);
617 case QPlatformTheme::SystemIconFallbackThemeName:
618 return QVariant(d->iconFallbackThemeName);
619 case QPlatformTheme::IconThemeSearchPaths:
620 return QVariant(d->kdeIconThemeSearchPaths(d->kdeDirs));
621 case QPlatformTheme::IconPixmapSizes:
622 return QVariant::fromValue(availableXdgFileIconSizes());
623 case QPlatformTheme::StyleNames:
624 return QVariant(d->styleNames);
625 case QPlatformTheme::KeyboardScheme:
626 return QVariant(
int(KdeKeyboardScheme));
627 case QPlatformTheme::ItemViewActivateItemOnSingleClick:
628 return QVariant(d->singleClick);
629 case QPlatformTheme::WheelScrollLines:
630 return QVariant(d->wheelScrollLines);
631 case QPlatformTheme::MouseDoubleClickInterval:
632 return QVariant(d->doubleClickInterval);
633 case QPlatformTheme::StartDragTime:
634 return QVariant(d->startDragTime);
635 case QPlatformTheme::StartDragDistance:
636 return QVariant(d->startDragDist);
637 case QPlatformTheme::CursorFlashTime:
638 return QVariant(d->cursorBlinkRate);
639 case QPlatformTheme::UiEffects:
640 return QVariant(
int(HoverEffect));
641 case QPlatformTheme::MouseCursorTheme:
642 return QVariant(mouseCursorTheme());
643 case QPlatformTheme::MouseCursorSize:
644 return QVariant(mouseCursorSize());
645 case QPlatformTheme::PreferFileIconFromTheme:
650 return QPlatformTheme::themeHint(hint);
769QPlatformTheme *QKdeTheme::createKdeTheme()
771 const QByteArray kdeVersionBA = qgetenv(
"KDE_SESSION_VERSION");
772 const int kdeVersion = kdeVersionBA.toInt();
779 return new QKdeTheme(QStandardPaths::standardLocations(QStandardPaths::GenericConfigLocation), kdeVersion);
788 const QString kdeHomePathVar = qEnvironmentVariable(
"KDEHOME");
789 if (!kdeHomePathVar.isEmpty())
790 kdeDirs += kdeHomePathVar;
792 const QString kdeDirsVar = qEnvironmentVariable(
"KDEDIRS");
793 if (!kdeDirsVar.isEmpty())
794 kdeDirs += kdeDirsVar.split(u':', Qt::SkipEmptyParts);
796 const QString kdeVersionHomePath = QDir::homePath() +
"/.kde"_L1 + QLatin1StringView(kdeVersionBA);
797 if (QFileInfo(kdeVersionHomePath).isDir())
798 kdeDirs += kdeVersionHomePath;
800 const QString kdeHomePath = QDir::homePath() +
"/.kde"_L1;
801 if (QFileInfo(kdeHomePath).isDir())
802 kdeDirs += kdeHomePath;
804 const QString kdeRcPath =
"/etc/kde"_L1 + QLatin1StringView(kdeVersionBA) +
"rc"_L1;
805 if (QFileInfo(kdeRcPath).isReadable()) {
806 QSettings kdeSettings(kdeRcPath, QSettings::IniFormat);
807 kdeSettings.beginGroup(QStringLiteral(
"Directories-default"));
808 kdeDirs += kdeSettings.value(QStringLiteral(
"prefixes")).toStringList();
811 const QString kdeVersionPrefix =
"/etc/kde"_L1 + QLatin1StringView(kdeVersionBA);
812 if (QFileInfo(kdeVersionPrefix).isDir())
813 kdeDirs += kdeVersionPrefix;
815 kdeDirs.removeDuplicates();
816 if (kdeDirs.isEmpty()) {
817 qWarning(
"Unable to determine KDE dirs");
821 return new QKdeTheme(kdeDirs, kdeVersion);