11#include "ui_compositing.h"
12#include <kwin_compositing_interface.h>
15#include <QApplication>
19#include <KPluginFactory>
20#include <KWindowSystem>
25#include "kwincompositing_setting.h"
28static bool isRunningPlasma()
30 return qgetenv(
"XDG_CURRENT_DESKTOP") ==
"KDE";
49 void updateUnmanagedItemStatus();
50 bool compositingRequired()
const;
52 Ui_CompositingForm m_form;
54 OrgKdeKwinCompositingInterface *m_compositingInterface;
55 KWinCompositingSetting *m_settings;
58static const QList<qreal> s_animationMultipliers = {8, 4, 2, 1, 0.5, 0.25, 0.125, 0};
60bool KWinCompositingKCM::compositingRequired()
const
62 return m_compositingInterface->platformRequiresCompositing();
66 : KCModule(parent, data)
67 , m_compositingInterface(new OrgKdeKwinCompositingInterface(QStringLiteral(
"org.kde.KWin"), QStringLiteral(
"/Compositor"), QDBusConnection::sessionBus(), this))
68 , m_settings(new KWinCompositingSetting(this))
70 m_form.setupUi(widget());
73 m_settings->findItem(
"AnimationDurationFactor")->setWriteFlags(KConfigBase::Global | KConfigBase::Notify);
75 addConfig(m_settings, widget());
77 m_form.glCrashedWarning->setIcon(QIcon::fromTheme(QStringLiteral(
"dialog-warning")));
78 QAction *reenableGlAction =
new QAction(i18n(
"Re-enable OpenGL detection"),
this);
79 connect(reenableGlAction, &QAction::triggered,
this, &KWinCompositingKCM::reenableGl);
80 connect(reenableGlAction, &QAction::triggered, m_form.glCrashedWarning, &KMessageWidget::animatedHide);
81 m_form.glCrashedWarning->addAction(reenableGlAction);
82 m_form.windowThumbnailWarning->setIcon(QIcon::fromTheme(QStringLiteral(
"dialog-warning")));
84 m_form.kcfg_Enabled->setVisible(!compositingRequired());
85 m_form.kcfg_WindowsBlockCompositing->setVisible(!compositingRequired());
86 m_form.compositingLabel->setVisible(!compositingRequired());
88 connect(
this, &KWinCompositingKCM::defaultsIndicatorsVisibleChanged,
this, &KWinCompositingKCM::updateUnmanagedItemStatus);
90 if (KWindowSystem::isPlatformWayland()) {
91 m_form.kcfg_HiddenPreviews->setVisible(
false);
92 m_form.label_HiddenPreviews->setVisible(
false);
97void KWinCompositingKCM::reenableGl()
99 m_settings->setLastFailureTimestamp(0);
103void KWinCompositingKCM::init()
105 auto currentIndexChangedSignal =
static_cast<void (QComboBox::*)(
int)
>(&QComboBox::currentIndexChanged);
108 m_form.animationDurationFactor->setMaximum(s_animationMultipliers.size() - 1);
109 connect(m_form.animationDurationFactor, &QSlider::valueChanged,
this, [
this]() {
110 updateUnmanagedItemStatus();
111 m_settings->setAnimationDurationFactor(s_animationMultipliers[m_form.animationDurationFactor->value()]);
114 if (isRunningPlasma()) {
115 m_form.animationSpeedLabel->hide();
116 m_form.animationSpeedControls->hide();
120 connect(m_form.kcfg_HiddenPreviews, currentIndexChangedSignal,
this, [
this](
int index) {
122 m_form.windowThumbnailWarning->animatedShow();
124 m_form.windowThumbnailWarning->animatedHide();
128 if (m_settings->lastFailureTimestamp() > 0) {
129 m_form.glCrashedWarning->animatedShow();
133void KWinCompositingKCM::updateUnmanagedItemStatus()
135 const auto animationDuration = s_animationMultipliers[m_form.animationDurationFactor->value()];
137 const bool inPlasma = isRunningPlasma();
139 bool changed =
false;
141 changed |= (animationDuration != m_settings->animationDurationFactor());
143 unmanagedWidgetChangeState(changed);
145 bool defaulted =
true;
147 defaulted &= animationDuration == m_settings->defaultAnimationDurationFactorValue();
150 unmanagedWidgetDefaultState(defaulted);
158 m_settings->findItem(
"AnimationDurationFactor")->readConfig(m_settings->config());
159 const double multiplier = m_settings->animationDurationFactor();
160 auto const it = std::lower_bound(s_animationMultipliers.begin(), s_animationMultipliers.end(), multiplier, std::greater<qreal>());
161 const int index =
static_cast<int>(std::distance(s_animationMultipliers.begin(), it));
162 m_form.animationDurationFactor->setValue(index);
163 m_form.animationDurationFactor->setDisabled(m_settings->isAnimationDurationFactorImmutable());
168 KCModule::defaults();
171 if (!isRunningPlasma()) {
173 m_form.animationDurationFactor->setValue(3);
179 if (!isRunningPlasma()) {
180 const auto animationDuration = s_animationMultipliers[m_form.animationDurationFactor->value()];
181 m_settings->setAnimationDurationFactor(animationDuration);
188 KConfig(
"kwinrc", KConfig::NoGlobals).group(QStringLiteral(
"KDE")).revertToDefault(
"AnimationDurationFactor");
191 QDBusMessage message = QDBusMessage::createSignal(QStringLiteral(
"/Compositor"),
192 QStringLiteral(
"org.kde.kwin.Compositing"),
193 QStringLiteral(
"reinit"));
194 QDBusConnection::sessionBus().send(message);
198 registerPlugin<KWinCompositingKCM>();
199 registerPlugin<KWinCompositingData>();)
KWinCompositingKCM(QObject *parent, const KPluginMetaData &data)
K_PLUGIN_FACTORY_WITH_JSON(KCMKWinDecorationFactory, "kcm_kwindecoration.json", registerPlugin< KCMKWinDecoration >();registerPlugin< KWinDecorationData >();) namespace