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