339 toolButtonStyle = Qt::ToolButtonTextBesideIcon;
343 styleNames << QStringLiteral(
"breeze");
344 styleNames << QStringLiteral(
"Oxygen") << QStringLiteral(
"Fusion") << QStringLiteral(
"windows");
346 iconFallbackThemeName = iconThemeName = QStringLiteral(
"breeze");
348 iconFallbackThemeName = iconThemeName = QStringLiteral(
"oxygen");
350 systemPalette.reset(
new QPalette(QPalette()));
351 readKdeSystemPalette(kdeDirs,
kdeVersion, kdeSettings, systemPalette.get());
353 const QVariant styleValue = readKdeSetting(KdeSetting::WidgetStyle);
354 if (styleValue.isValid()) {
355 const QString style = styleValue.toString();
356 if (style != styleNames.front())
357 styleNames.push_front(style);
360 const QVariant colorScheme = readKdeSetting(KdeSetting::ColorScheme);
362 updateColorScheme(colorScheme.toString());
364 const QVariant singleClickValue = readKdeSetting(KdeSetting::SingleClick);
365 if (singleClickValue.isValid())
372 const QVariant showIconsOnPushButtonsValue = readKdeSetting(KdeSetting::ShowIconsOnPushButtons);
373 if (showIconsOnPushButtonsValue.isValid())
376 const QVariant themeValue = readKdeSetting(KdeSetting::IconTheme);
377 if (themeValue.isValid())
378 iconThemeName = themeValue.toString();
380 const QVariant toolBarIconSizeValue = readKdeSetting(KdeSetting::ToolBarIconSize);
381 if (toolBarIconSizeValue.isValid())
384 const QVariant toolbarStyleValue = readKdeSetting(KdeSetting::ToolButtonStyle);
385 if (toolbarStyleValue.isValid()) {
386 const QString toolBarStyle = toolbarStyleValue.toString();
387 if (toolBarStyle ==
"TextBesideIcon"_L1)
388 toolButtonStyle = Qt::ToolButtonTextBesideIcon;
389 else if (toolBarStyle ==
"TextOnly"_L1)
390 toolButtonStyle = Qt::ToolButtonTextOnly;
391 else if (toolBarStyle ==
"TextUnderIcon"_L1)
392 toolButtonStyle = Qt::ToolButtonTextUnderIcon;
395 const QVariant wheelScrollLinesValue = readKdeSetting(KdeSetting::WheelScrollLines);
396 if (wheelScrollLinesValue.isValid())
399 const QVariant doubleClickIntervalValue = readKdeSetting(KdeSetting::DoubleClickInterval);
400 if (doubleClickIntervalValue.isValid())
403 const QVariant startDragDistValue = readKdeSetting(KdeSetting::StartDragDistance);
404 if (startDragDistValue.isValid())
407 const QVariant startDragTimeValue = readKdeSetting(KdeSetting::StartDragTime);
408 if (startDragTimeValue.isValid())
411 const QVariant cursorBlinkRateValue = readKdeSetting(KdeSetting::CursorBlinkRate);
412 if (cursorBlinkRateValue.isValid()) {
418 if (QFont *systemFont = kdeFont(readKdeSetting(KdeSetting::Font)))
419 fonts[QPlatformTheme::SystemFont] = systemFont;
421 fonts[QPlatformTheme::SystemFont] =
new QFont(QLatin1StringView(QGenericUnixTheme::defaultSystemFontNameC),
422 QGenericUnixTheme::defaultSystemFontSize);
424 if (QFont *fixedFont = kdeFont(readKdeSetting(KdeSetting::Fixed))) {
425 fonts[QPlatformTheme::FixedFont] = fixedFont;
427 fixedFont =
new QFont(QLatin1StringView(QGenericUnixTheme::defaultFixedFontNameC),
428 QGenericUnixTheme::defaultSystemFontSize);
429 fixedFont->setStyleHint(QFont::TypeWriter);
430 fonts[QPlatformTheme::FixedFont] = fixedFont;
433 if (QFont *menuFont = kdeFont(readKdeSetting(KdeSetting::MenuFont))) {
434 fonts[QPlatformTheme::MenuFont] = menuFont;
435 fonts[QPlatformTheme::MenuBarFont] =
new QFont(*menuFont);
438 if (QFont *toolBarFont = kdeFont(readKdeSetting(KdeSetting::ToolBarFont)))
439 fonts[QPlatformTheme::ToolButtonFont] = toolBarFont;
441 QWindowSystemInterface::handleThemeChange();
443 qCDebug(lcQpaFonts) <<
"default fonts: system" << fonts[QPlatformTheme::SystemFont]
444 <<
"fixed" << fonts[QPlatformTheme::FixedFont];
445 qDeleteAll(kdeSettings);
492void QKdeThemePrivate::readKdeSystemPalette(
const QStringList &kdeDirs,
int kdeVersion, QHash<QString, QSettings*> &kdeSettings, QPalette *pal)
494 if (!kdeColor(pal, QPalette::Button, readKdeSetting(KdeSetting::ButtonBackground, kdeDirs, kdeVersion, kdeSettings))) {
496 const QColor defaultWindowBackground(214, 210, 208);
497 const QColor defaultButtonBackground(223, 220, 217);
498 *pal = QPalette(defaultButtonBackground, defaultWindowBackground);
502 kdeColor(pal, QPalette::Window, readKdeSetting(KdeSetting::WindowBackground, kdeDirs, kdeVersion, kdeSettings));
503 kdeColor(pal, QPalette::Text, readKdeSetting(KdeSetting::ViewForeground, kdeDirs, kdeVersion, kdeSettings));
504 kdeColor(pal, QPalette::WindowText, readKdeSetting(KdeSetting::WindowForeground, kdeDirs, kdeVersion, kdeSettings));
505 kdeColor(pal, QPalette::Base, readKdeSetting(KdeSetting::ViewBackground, kdeDirs, kdeVersion, kdeSettings));
506 kdeColor(pal, QPalette::Highlight, readKdeSetting(KdeSetting::SelectionBackground, kdeDirs, kdeVersion, kdeSettings));
507 kdeColor(pal, QPalette::HighlightedText, readKdeSetting(KdeSetting::SelectionForeground, kdeDirs, kdeVersion, kdeSettings));
508 kdeColor(pal, QPalette::AlternateBase, readKdeSetting(KdeSetting::ViewBackgroundAlternate, kdeDirs, kdeVersion, kdeSettings));
509 kdeColor(pal, QPalette::ButtonText, readKdeSetting(KdeSetting::ButtonForeground, kdeDirs, kdeVersion, kdeSettings));
510 kdeColor(pal, QPalette::Link, readKdeSetting(KdeSetting::ViewForegroundLink, kdeDirs, kdeVersion, kdeSettings));
511 kdeColor(pal, QPalette::LinkVisited, readKdeSetting(KdeSetting::ViewForegroundVisited, kdeDirs, kdeVersion, kdeSettings));
512 kdeColor(pal, QPalette::ToolTipBase, readKdeSetting(KdeSetting::TooltipBackground, kdeDirs, kdeVersion, kdeSettings));
513 kdeColor(pal, QPalette::ToolTipText, readKdeSetting(KdeSetting::TooltipForeground, kdeDirs, kdeVersion, kdeSettings));
514 kdeColor(pal, QPalette::PlaceholderText, readKdeSetting(KdeSetting::ViewForegroundInactive, kdeDirs, kdeVersion, kdeSettings));
519 const QColor button = pal->color(QPalette::Button);
521 button.getHsv(&h, &s, &v);
523 const QBrush whiteBrush = QBrush(Qt::white);
524 const QBrush buttonBrush = QBrush(button);
525 const QBrush buttonBrushDark = QBrush(button.darker(v > 128 ? 200 : 50));
526 const QBrush buttonBrushDark150 = QBrush(button.darker(v > 128 ? 150 : 75));
527 const QBrush buttonBrushLight150 = QBrush(button.lighter(v > 128 ? 150 : 75));
528 const QBrush buttonBrushLight = QBrush(button.lighter(v > 128 ? 200 : 50));
530 pal->setBrush(QPalette::Disabled, QPalette::WindowText, buttonBrushDark);
531 pal->setBrush(QPalette::Disabled, QPalette::ButtonText, buttonBrushDark);
532 pal->setBrush(QPalette::Disabled, QPalette::Button, buttonBrush);
533 pal->setBrush(QPalette::Disabled, QPalette::Text, buttonBrushDark);
534 pal->setBrush(QPalette::Disabled, QPalette::BrightText, whiteBrush);
535 pal->setBrush(QPalette::Disabled, QPalette::Base, buttonBrush);
536 pal->setBrush(QPalette::Disabled, QPalette::Window, buttonBrush);
537 pal->setBrush(QPalette::Disabled, QPalette::Highlight, buttonBrushDark150);
538 pal->setBrush(QPalette::Disabled, QPalette::HighlightedText, buttonBrushLight150);
541 pal->setBrush(QPalette::Light, buttonBrushLight);
542 pal->setBrush(QPalette::Midlight, buttonBrushLight150);
543 pal->setBrush(QPalette::Mid, buttonBrushDark150);
544 pal->setBrush(QPalette::Dark, buttonBrushDark);
606QVariant QKdeTheme::themeHint(QPlatformTheme::ThemeHint hint)
const
608 Q_D(
const QKdeTheme);
610 case QPlatformTheme::UseFullScreenForPopupMenu:
611 return QVariant(
true);
612 case QPlatformTheme::DialogButtonBoxButtonsHaveIcons:
613 return QVariant(d->showIconsOnPushButtons);
614 case QPlatformTheme::DialogButtonBoxLayout:
615 return QVariant(QPlatformDialogHelper::KdeLayout);
616 case QPlatformTheme::ToolButtonStyle:
617 return QVariant(d->toolButtonStyle);
618 case QPlatformTheme::ToolBarIconSize:
619 return QVariant(d->toolBarIconSize);
620 case QPlatformTheme::SystemIconThemeName:
621 return QVariant(d->iconThemeName);
622 case QPlatformTheme::SystemIconFallbackThemeName:
623 return QVariant(d->iconFallbackThemeName);
624 case QPlatformTheme::IconThemeSearchPaths:
625 return QVariant(d->kdeIconThemeSearchPaths(d->kdeDirs));
626 case QPlatformTheme::IconPixmapSizes:
627 return QVariant::fromValue(availableXdgFileIconSizes());
628 case QPlatformTheme::StyleNames:
629 return QVariant(d->styleNames);
630 case QPlatformTheme::KeyboardScheme:
631 return QVariant(
int(KdeKeyboardScheme));
632 case QPlatformTheme::ItemViewActivateItemOnSingleClick:
633 return QVariant(d->singleClick);
634 case QPlatformTheme::WheelScrollLines:
635 return QVariant(d->wheelScrollLines);
636 case QPlatformTheme::MouseDoubleClickInterval:
637 return QVariant(d->doubleClickInterval);
638 case QPlatformTheme::StartDragTime:
639 return QVariant(d->startDragTime);
640 case QPlatformTheme::StartDragDistance:
641 return QVariant(d->startDragDist);
642 case QPlatformTheme::CursorFlashTime:
643 return QVariant(d->cursorBlinkRate);
644 case QPlatformTheme::UiEffects:
645 return QVariant(
int(HoverEffect));
646 case QPlatformTheme::MouseCursorTheme:
647 return QVariant(mouseCursorTheme());
648 case QPlatformTheme::MouseCursorSize:
649 return QVariant(mouseCursorSize());
650 case QPlatformTheme::PreferFileIconFromTheme:
655 return QPlatformTheme::themeHint(hint);
774QPlatformTheme *QKdeTheme::createKdeTheme()
776 const QByteArray kdeVersionBA = qgetenv(
"KDE_SESSION_VERSION");
777 const int kdeVersion = kdeVersionBA.toInt();
784 return new QKdeTheme(QStandardPaths::standardLocations(QStandardPaths::GenericConfigLocation), kdeVersion);
793 const QString kdeHomePathVar = qEnvironmentVariable(
"KDEHOME");
794 if (!kdeHomePathVar.isEmpty())
795 kdeDirs += kdeHomePathVar;
797 const QString kdeDirsVar = qEnvironmentVariable(
"KDEDIRS");
798 if (!kdeDirsVar.isEmpty())
799 kdeDirs += kdeDirsVar.split(u':', Qt::SkipEmptyParts);
801 const QString kdeVersionHomePath = QDir::homePath() +
"/.kde"_L1 + QLatin1StringView(kdeVersionBA);
802 if (QFileInfo(kdeVersionHomePath).isDir())
803 kdeDirs += kdeVersionHomePath;
805 const QString kdeHomePath = QDir::homePath() +
"/.kde"_L1;
806 if (QFileInfo(kdeHomePath).isDir())
807 kdeDirs += kdeHomePath;
809 const QString kdeRcPath =
"/etc/kde"_L1 + QLatin1StringView(kdeVersionBA) +
"rc"_L1;
810 if (QFileInfo(kdeRcPath).isReadable()) {
811 QSettings kdeSettings(kdeRcPath, QSettings::IniFormat);
812 kdeSettings.beginGroup(QStringLiteral(
"Directories-default"));
813 kdeDirs += kdeSettings.value(QStringLiteral(
"prefixes")).toStringList();
816 const QString kdeVersionPrefix =
"/etc/kde"_L1 + QLatin1StringView(kdeVersionBA);
817 if (QFileInfo(kdeVersionPrefix).isDir())
818 kdeDirs += kdeVersionPrefix;
820 kdeDirs.removeDuplicates();
821 if (kdeDirs.isEmpty()) {
822 qWarning(
"Unable to determine KDE dirs");
826 return new QKdeTheme(kdeDirs, kdeVersion);