KWin
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
main.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2013 Antonis Tsiapaliokas <kok3rs@gmail.com>
6 SPDX-FileCopyrightText: 2013 Martin Gräßlin <mgraesslin@kde.org>
7
8 SPDX-License-Identifier: GPL-2.0-or-later
9*/
10
11#include "ui_compositing.h"
12#include <kwin_compositing_interface.h>
13
14#include <QAction>
15#include <QApplication>
16#include <QLayout>
17
18#include <KCModule>
19#include <KPluginFactory>
20#include <KWindowSystem>
21
22#include <algorithm>
23#include <functional>
24
25#include "kwincompositing_setting.h"
26#include "kwincompositingdata.h"
27
28static bool isRunningPlasma()
29{
30 return qgetenv("XDG_CURRENT_DESKTOP") == "KDE";
31}
32
33class KWinCompositingKCM : public KCModule
34{
35 Q_OBJECT
36public:
37 explicit KWinCompositingKCM(QObject *parent, const KPluginMetaData &data);
38
39public Q_SLOTS:
40 void load() override;
41 void save() override;
42 void defaults() override;
43
44private Q_SLOTS:
45 void reenableGl();
46
47private:
48 void init();
49 void updateUnmanagedItemStatus();
50 bool compositingRequired() const;
51
52 Ui_CompositingForm m_form;
53
54 OrgKdeKwinCompositingInterface *m_compositingInterface;
55 KWinCompositingSetting *m_settings;
56};
57
58static const QList<qreal> s_animationMultipliers = {8, 4, 2, 1, 0.5, 0.25, 0.125, 0};
59
60bool KWinCompositingKCM::compositingRequired() const
61{
62 return m_compositingInterface->platformRequiresCompositing();
63}
64
65KWinCompositingKCM::KWinCompositingKCM(QObject *parent, const KPluginMetaData &data)
66 : KCModule(parent, data)
67 , m_compositingInterface(new OrgKdeKwinCompositingInterface(QStringLiteral("org.kde.KWin"), QStringLiteral("/Compositor"), QDBusConnection::sessionBus(), this))
68 , m_settings(new KWinCompositingSetting(this))
69{
70 m_form.setupUi(widget());
71
72 // AnimationDurationFactor should be written to the same place as the lnf to avoid conflicts
73 m_settings->findItem("AnimationDurationFactor")->setWriteFlags(KConfigBase::Global | KConfigBase::Notify);
74
75 addConfig(m_settings, widget());
76
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")));
83
84 m_form.kcfg_Enabled->setVisible(!compositingRequired());
85 m_form.kcfg_WindowsBlockCompositing->setVisible(!compositingRequired());
86 m_form.compositingLabel->setVisible(!compositingRequired());
87
88 connect(this, &KWinCompositingKCM::defaultsIndicatorsVisibleChanged, this, &KWinCompositingKCM::updateUnmanagedItemStatus);
89
90 if (KWindowSystem::isPlatformWayland()) {
91 m_form.kcfg_HiddenPreviews->setVisible(false);
92 m_form.label_HiddenPreviews->setVisible(false);
93 }
94 init();
95}
96
97void KWinCompositingKCM::reenableGl()
98{
99 m_settings->setLastFailureTimestamp(0);
100 m_settings->save();
101}
102
103void KWinCompositingKCM::init()
104{
105 auto currentIndexChangedSignal = static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged);
106
107 // animation speed
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()]);
112 });
113
114 if (isRunningPlasma()) {
115 m_form.animationSpeedLabel->hide();
116 m_form.animationSpeedControls->hide();
117 }
118
119 // windowThumbnail
120 connect(m_form.kcfg_HiddenPreviews, currentIndexChangedSignal, this, [this](int index) {
121 if (index == 2) {
122 m_form.windowThumbnailWarning->animatedShow();
123 } else {
124 m_form.windowThumbnailWarning->animatedHide();
125 }
126 });
127
128 if (m_settings->lastFailureTimestamp() > 0) {
129 m_form.glCrashedWarning->animatedShow();
130 }
131}
132
133void KWinCompositingKCM::updateUnmanagedItemStatus()
134{
135 const auto animationDuration = s_animationMultipliers[m_form.animationDurationFactor->value()];
136
137 const bool inPlasma = isRunningPlasma();
138
139 bool changed = false;
140 if (!inPlasma) {
141 changed |= (animationDuration != m_settings->animationDurationFactor());
142 }
143 unmanagedWidgetChangeState(changed);
144
145 bool defaulted = true;
146 if (!inPlasma) {
147 defaulted &= animationDuration == m_settings->defaultAnimationDurationFactorValue();
148 }
149
150 unmanagedWidgetDefaultState(defaulted);
151}
152
154{
155 KCModule::load();
156
157 // unmanaged items
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());
164}
165
167{
168 KCModule::defaults();
169
170 // unmanaged widgets
171 if (!isRunningPlasma()) {
172 // corresponds to 1.0 seconds in s_animationMultipliers
173 m_form.animationDurationFactor->setValue(3);
174 }
175}
176
178{
179 if (!isRunningPlasma()) {
180 const auto animationDuration = s_animationMultipliers[m_form.animationDurationFactor->value()];
181 m_settings->setAnimationDurationFactor(animationDuration);
182 }
183 m_settings->save();
184
185 KCModule::save();
186
187 // This clears up old entries that are now migrated to kdeglobals
188 KConfig("kwinrc", KConfig::NoGlobals).group(QStringLiteral("KDE")).revertToDefault("AnimationDurationFactor");
189
190 // Send signal to all kwin instances
191 QDBusMessage message = QDBusMessage::createSignal(QStringLiteral("/Compositor"),
192 QStringLiteral("org.kde.kwin.Compositing"),
193 QStringLiteral("reinit"));
194 QDBusConnection::sessionBus().send(message);
195}
196
197K_PLUGIN_FACTORY_WITH_JSON(KWinCompositingConfigFactory, "kwincompositing.json",
198 registerPlugin<KWinCompositingKCM>();
199 registerPlugin<KWinCompositingData>();)
200
201#include "main.moc"
void load() override
Definition main.cpp:153
void save() override
Definition main.cpp:177
KWinCompositingKCM(QObject *parent, const KPluginMetaData &data)
Definition main.cpp:65
void defaults() override
Definition main.cpp:166
K_PLUGIN_FACTORY_WITH_JSON(KCMKWinDecorationFactory, "kcm_kwindecoration.json", registerPlugin< KCMKWinDecoration >();registerPlugin< KWinDecorationData >();) namespace
Definition kcm.cpp:29