329 toolButtonStyle = Qt::ToolButtonTextBesideIcon;
333 styleNames << QStringLiteral(
"breeze");
334 styleNames << QStringLiteral(
"Oxygen") << QStringLiteral(
"Fusion") << QStringLiteral(
"windows");
336 iconFallbackThemeName = iconThemeName = QStringLiteral(
"breeze");
338 iconFallbackThemeName = iconThemeName = QStringLiteral(
"oxygen");
340 systemPalette.reset(
new QPalette(QPalette()));
341 readKdeSystemPalette(kdeDirs, kdeVersion, kdeSettings, systemPalette.get());
343 const QVariant styleValue = readKdeSetting(KdeSetting::WidgetStyle);
344 if (styleValue.isValid()) {
345 const QString style = styleValue.toString();
346 if (style != styleNames.front())
347 styleNames.push_front(style);
350 const QVariant colorScheme = readKdeSetting(KdeSetting::ColorScheme);
352 updateColorScheme(colorScheme.toString());
354 const QVariant singleClickValue = readKdeSetting(KdeSetting::SingleClick);
355 if (singleClickValue.isValid())
362 const QVariant showIconsOnPushButtonsValue = readKdeSetting(KdeSetting::ShowIconsOnPushButtons);
363 if (showIconsOnPushButtonsValue.isValid())
366 const QVariant themeValue = readKdeSetting(KdeSetting::IconTheme);
367 if (themeValue.isValid())
368 iconThemeName = themeValue.toString();
370 const QVariant toolBarIconSizeValue = readKdeSetting(KdeSetting::ToolBarIconSize);
371 if (toolBarIconSizeValue.isValid())
374 const QVariant toolbarStyleValue = readKdeSetting(KdeSetting::ToolButtonStyle);
375 if (toolbarStyleValue.isValid()) {
376 const QString toolBarStyle = toolbarStyleValue.toString();
377 if (toolBarStyle ==
"TextBesideIcon"_L1)
378 toolButtonStyle = Qt::ToolButtonTextBesideIcon;
379 else if (toolBarStyle ==
"TextOnly"_L1)
380 toolButtonStyle = Qt::ToolButtonTextOnly;
381 else if (toolBarStyle ==
"TextUnderIcon"_L1)
382 toolButtonStyle = Qt::ToolButtonTextUnderIcon;
385 const QVariant wheelScrollLinesValue = readKdeSetting(KdeSetting::WheelScrollLines);
386 if (wheelScrollLinesValue.isValid())
389 const QVariant doubleClickIntervalValue = readKdeSetting(KdeSetting::DoubleClickInterval);
390 if (doubleClickIntervalValue.isValid())
393 const QVariant startDragDistValue = readKdeSetting(KdeSetting::StartDragDistance);
394 if (startDragDistValue.isValid())
397 const QVariant startDragTimeValue = readKdeSetting(KdeSetting::StartDragTime);
398 if (startDragTimeValue.isValid())
401 const QVariant cursorBlinkRateValue = readKdeSetting(KdeSetting::CursorBlinkRate);
402 if (cursorBlinkRateValue.isValid()) {
408 if (QFont *systemFont = kdeFont(readKdeSetting(KdeSetting::Font)))
409 fonts[QPlatformTheme::SystemFont] = systemFont;
411 fonts[QPlatformTheme::SystemFont] =
new QFont(QLatin1StringView(QGenericUnixTheme::defaultSystemFontNameC),
412 QGenericUnixTheme::defaultSystemFontSize);
414 if (QFont *fixedFont = kdeFont(readKdeSetting(KdeSetting::Fixed))) {
415 fonts[QPlatformTheme::FixedFont] = fixedFont;
417 fixedFont =
new QFont(QLatin1StringView(QGenericUnixTheme::defaultFixedFontNameC),
418 QGenericUnixTheme::defaultSystemFontSize);
419 fixedFont->setStyleHint(QFont::TypeWriter);
420 fonts[QPlatformTheme::FixedFont] = fixedFont;
423 if (QFont *menuFont = kdeFont(readKdeSetting(KdeSetting::MenuFont))) {
424 fonts[QPlatformTheme::MenuFont] = menuFont;
425 fonts[QPlatformTheme::MenuBarFont] =
new QFont(*menuFont);
428 if (QFont *toolBarFont = kdeFont(readKdeSetting(KdeSetting::ToolBarFont)))
429 fonts[QPlatformTheme::ToolButtonFont] = toolBarFont;
431 QWindowSystemInterface::handleThemeChange();
433 qCDebug(lcQpaFonts) <<
"default fonts: system" << fonts[QPlatformTheme::SystemFont]
434 <<
"fixed" << fonts[QPlatformTheme::FixedFont];
435 qDeleteAll(kdeSettings);
482void QKdeThemePrivate::readKdeSystemPalette(
const QStringList &kdeDirs,
int kdeVersion, QHash<QString, QSettings*> &kdeSettings, QPalette *pal)
484 if (!kdeColor(pal, QPalette::Button, readKdeSetting(KdeSetting::ButtonBackground, kdeDirs, kdeVersion, kdeSettings))) {
486 const QColor defaultWindowBackground(214, 210, 208);
487 const QColor defaultButtonBackground(223, 220, 217);
488 *pal = QPalette(defaultButtonBackground, defaultWindowBackground);
492 kdeColor(pal, QPalette::Window, readKdeSetting(KdeSetting::WindowBackground, kdeDirs, kdeVersion, kdeSettings));
493 kdeColor(pal, QPalette::Text, readKdeSetting(KdeSetting::ViewForeground, kdeDirs, kdeVersion, kdeSettings));
494 kdeColor(pal, QPalette::WindowText, readKdeSetting(KdeSetting::WindowForeground, kdeDirs, kdeVersion, kdeSettings));
495 kdeColor(pal, QPalette::Base, readKdeSetting(KdeSetting::ViewBackground, kdeDirs, kdeVersion, kdeSettings));
496 kdeColor(pal, QPalette::Highlight, readKdeSetting(KdeSetting::SelectionBackground, kdeDirs, kdeVersion, kdeSettings));
497 kdeColor(pal, QPalette::HighlightedText, readKdeSetting(KdeSetting::SelectionForeground, kdeDirs, kdeVersion, kdeSettings));
498 kdeColor(pal, QPalette::AlternateBase, readKdeSetting(KdeSetting::ViewBackgroundAlternate, kdeDirs, kdeVersion, kdeSettings));
499 kdeColor(pal, QPalette::ButtonText, readKdeSetting(KdeSetting::ButtonForeground, kdeDirs, kdeVersion, kdeSettings));
500 kdeColor(pal, QPalette::Link, readKdeSetting(KdeSetting::ViewForegroundLink, kdeDirs, kdeVersion, kdeSettings));
501 kdeColor(pal, QPalette::LinkVisited, readKdeSetting(KdeSetting::ViewForegroundVisited, kdeDirs, kdeVersion, kdeSettings));
502 kdeColor(pal, QPalette::ToolTipBase, readKdeSetting(KdeSetting::TooltipBackground, kdeDirs, kdeVersion, kdeSettings));
503 kdeColor(pal, QPalette::ToolTipText, readKdeSetting(KdeSetting::TooltipForeground, kdeDirs, kdeVersion, kdeSettings));
508 const QColor button = pal->color(QPalette::Button);
510 button.getHsv(&h, &s, &v);
512 const QBrush whiteBrush = QBrush(Qt::white);
513 const QBrush buttonBrush = QBrush(button);
514 const QBrush buttonBrushDark = QBrush(button.darker(v > 128 ? 200 : 50));
515 const QBrush buttonBrushDark150 = QBrush(button.darker(v > 128 ? 150 : 75));
516 const QBrush buttonBrushLight150 = QBrush(button.lighter(v > 128 ? 150 : 75));
517 const QBrush buttonBrushLight = QBrush(button.lighter(v > 128 ? 200 : 50));
519 pal->setBrush(QPalette::Disabled, QPalette::WindowText, buttonBrushDark);
520 pal->setBrush(QPalette::Disabled, QPalette::ButtonText, buttonBrushDark);
521 pal->setBrush(QPalette::Disabled, QPalette::Button, buttonBrush);
522 pal->setBrush(QPalette::Disabled, QPalette::Text, buttonBrushDark);
523 pal->setBrush(QPalette::Disabled, QPalette::BrightText, whiteBrush);
524 pal->setBrush(QPalette::Disabled, QPalette::Base, buttonBrush);
525 pal->setBrush(QPalette::Disabled, QPalette::Window, buttonBrush);
526 pal->setBrush(QPalette::Disabled, QPalette::Highlight, buttonBrushDark150);
527 pal->setBrush(QPalette::Disabled, QPalette::HighlightedText, buttonBrushLight150);
530 pal->setBrush(QPalette::Light, buttonBrushLight);
531 pal->setBrush(QPalette::Midlight, buttonBrushLight150);
532 pal->setBrush(QPalette::Mid, buttonBrushDark150);
533 pal->setBrush(QPalette::Dark, buttonBrushDark);
595QVariant QKdeTheme::themeHint(QPlatformTheme::ThemeHint hint)
const
597 Q_D(
const QKdeTheme);
599 case QPlatformTheme::UseFullScreenForPopupMenu:
600 return QVariant(
true);
601 case QPlatformTheme::DialogButtonBoxButtonsHaveIcons:
602 return QVariant(d->showIconsOnPushButtons);
603 case QPlatformTheme::DialogButtonBoxLayout:
604 return QVariant(QPlatformDialogHelper::KdeLayout);
605 case QPlatformTheme::ToolButtonStyle:
606 return QVariant(d->toolButtonStyle);
607 case QPlatformTheme::ToolBarIconSize:
608 return QVariant(d->toolBarIconSize);
609 case QPlatformTheme::SystemIconThemeName:
610 return QVariant(d->iconThemeName);
611 case QPlatformTheme::SystemIconFallbackThemeName:
612 return QVariant(d->iconFallbackThemeName);
613 case QPlatformTheme::IconThemeSearchPaths:
614 return QVariant(d->kdeIconThemeSearchPaths(d->kdeDirs));
615 case QPlatformTheme::IconPixmapSizes:
616 return QVariant::fromValue(availableXdgFileIconSizes());
617 case QPlatformTheme::StyleNames:
618 return QVariant(d->styleNames);
619 case QPlatformTheme::KeyboardScheme:
620 return QVariant(
int(KdeKeyboardScheme));
621 case QPlatformTheme::ItemViewActivateItemOnSingleClick:
622 return QVariant(d->singleClick);
623 case QPlatformTheme::WheelScrollLines:
624 return QVariant(d->wheelScrollLines);
625 case QPlatformTheme::MouseDoubleClickInterval:
626 return QVariant(d->doubleClickInterval);
627 case QPlatformTheme::StartDragTime:
628 return QVariant(d->startDragTime);
629 case QPlatformTheme::StartDragDistance:
630 return QVariant(d->startDragDist);
631 case QPlatformTheme::CursorFlashTime:
632 return QVariant(d->cursorBlinkRate);
633 case QPlatformTheme::UiEffects:
634 return QVariant(
int(HoverEffect));
635 case QPlatformTheme::MouseCursorTheme:
636 return QVariant(mouseCursorTheme());
637 case QPlatformTheme::MouseCursorSize:
638 return QVariant(mouseCursorSize());
639 case QPlatformTheme::PreferFileIconFromTheme:
644 return QPlatformTheme::themeHint(hint);
763QPlatformTheme *QKdeTheme::createKdeTheme()
765 const QByteArray kdeVersionBA = qgetenv(
"KDE_SESSION_VERSION");
766 const int kdeVersion = kdeVersionBA.toInt();
773 return new QKdeTheme(QStandardPaths::standardLocations(QStandardPaths::GenericConfigLocation), kdeVersion);
782 const QString kdeHomePathVar = qEnvironmentVariable(
"KDEHOME");
783 if (!kdeHomePathVar.isEmpty())
784 kdeDirs += kdeHomePathVar;
786 const QString kdeDirsVar = qEnvironmentVariable(
"KDEDIRS");
787 if (!kdeDirsVar.isEmpty())
788 kdeDirs += kdeDirsVar.split(u':', Qt::SkipEmptyParts);
790 const QString kdeVersionHomePath = QDir::homePath() +
"/.kde"_L1 + QLatin1StringView(kdeVersionBA);
791 if (QFileInfo(kdeVersionHomePath).isDir())
792 kdeDirs += kdeVersionHomePath;
794 const QString kdeHomePath = QDir::homePath() +
"/.kde"_L1;
795 if (QFileInfo(kdeHomePath).isDir())
796 kdeDirs += kdeHomePath;
798 const QString kdeRcPath =
"/etc/kde"_L1 + QLatin1StringView(kdeVersionBA) +
"rc"_L1;
799 if (QFileInfo(kdeRcPath).isReadable()) {
800 QSettings kdeSettings(kdeRcPath, QSettings::IniFormat);
801 kdeSettings.beginGroup(QStringLiteral(
"Directories-default"));
802 kdeDirs += kdeSettings.value(QStringLiteral(
"prefixes")).toStringList();
805 const QString kdeVersionPrefix =
"/etc/kde"_L1 + QLatin1StringView(kdeVersionBA);
806 if (QFileInfo(kdeVersionPrefix).isDir())
807 kdeDirs += kdeVersionPrefix;
809 kdeDirs.removeDuplicates();
810 if (kdeDirs.isEmpty()) {
811 qWarning(
"Unable to determine KDE dirs");
815 return new QKdeTheme(kdeDirs, kdeVersion);