KWin
Loading...
Searching...
No Matches
dbusinterface.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: 2012 Martin Gräßlin <mgraesslin@kde.org>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9
10// own
11#include "dbusinterface.h"
12#include "compositingadaptor.h"
13#include "pluginsadaptor.h"
14#include "virtualdesktopmanageradaptor.h"
15
16// kwin
17#include "compositor.h"
18#include "core/output.h"
19#include "core/renderbackend.h"
20#include "debug_console.h"
21#include "kwinadaptor.h"
22#include "main.h"
23#include "placement.h"
24#include "pluginmanager.h"
25#include "virtualdesktops.h"
26#include "window.h"
27#include "workspace.h"
28#if KWIN_BUILD_ACTIVITIES
29#include "activities.h"
30#endif
31
32// Qt
33#include <QDBusConnection>
34#include <QOpenGLContext>
35
36namespace KWin
37{
38
40 : QObject(parent)
41 , m_serviceName(QStringLiteral("org.kde.KWin"))
42{
43 (void)new KWinAdaptor(this);
44
45 QDBusConnection dbus = QDBusConnection::sessionBus();
46 dbus.registerObject(QStringLiteral("/KWin"), this);
47 dbus.registerService(m_serviceName);
48 dbus.connect(QString(), QStringLiteral("/KWin"), QStringLiteral("org.kde.KWin"), QStringLiteral("reloadConfig"),
49 Workspace::self(), SLOT(slotReloadConfig()));
50
51 connect(Workspace::self(), &Workspace::showingDesktopChanged, this, &DBusInterface::onShowingDesktopChanged);
52}
53
55{
56 QDBusConnection::sessionBus().unregisterService(m_serviceName);
57}
58
60{
61 return workspace()->showingDesktop();
62}
63
68
73
78
83
88
93
94bool DBusInterface::startActivity(const QString &in0)
95{
96#if KWIN_BUILD_ACTIVITIES
97 if (!Workspace::self()->activities()) {
98 return false;
99 }
100 return Workspace::self()->activities()->start(in0);
101#else
102 return false;
103#endif
104}
105
106bool DBusInterface::stopActivity(const QString &in0)
107{
108#if KWIN_BUILD_ACTIVITIES
109 if (!Workspace::self()->activities()) {
110 return false;
111 }
112 return Workspace::self()->activities()->stop(in0);
113#else
114 return false;
115#endif
116}
117
119{
120 return VirtualDesktopManager::self()->current();
121}
122
124{
125 return VirtualDesktopManager::self()->setCurrent(desktop);
126}
127
129{
130 VirtualDesktopManager::self()->moveTo(VirtualDesktopManager::Direction::Next);
131}
132
134{
135 VirtualDesktopManager::self()->moveTo(VirtualDesktopManager::Direction::Previous);
136}
137
139{
140 DebugConsole *console = new DebugConsole;
141 console->show();
142}
143
145{
146 QCoreApplication::exit(133);
147}
148
149namespace
150{
151QVariantMap clientToVariantMap(const Window *c)
152{
153 return
154 {
155 {QStringLiteral("resourceClass"), c->resourceClass()},
156 {QStringLiteral("resourceName"), c->resourceName()},
157 {QStringLiteral("desktopFile"), c->desktopFileName()},
158 {QStringLiteral("role"), c->windowRole()},
159 {QStringLiteral("caption"), c->captionNormal()},
160 {QStringLiteral("clientMachine"), c->wmClientMachine(true)},
161 {QStringLiteral("localhost"), c->isLocalhost()},
162 {QStringLiteral("type"), c->windowType()},
163 {QStringLiteral("x"), c->x()},
164 {QStringLiteral("y"), c->y()},
165 {QStringLiteral("width"), c->width()},
166 {QStringLiteral("height"), c->height()},
167 {QStringLiteral("desktops"), c->desktopIds()},
168 {QStringLiteral("minimized"), c->isMinimized()},
169 {QStringLiteral("shaded"), c->isShade()},
170 {QStringLiteral("fullscreen"), c->isFullScreen()},
171 {QStringLiteral("keepAbove"), c->keepAbove()},
172 {QStringLiteral("keepBelow"), c->keepBelow()},
173 {QStringLiteral("noBorder"), c->noBorder()},
174 {QStringLiteral("skipTaskbar"), c->skipTaskbar()},
175 {QStringLiteral("skipPager"), c->skipPager()},
176 {QStringLiteral("skipSwitcher"), c->skipSwitcher()},
177 {QStringLiteral("maximizeHorizontal"), c->maximizeMode() & MaximizeHorizontal},
178 {QStringLiteral("maximizeVertical"), c->maximizeMode() & MaximizeVertical},
179 {QStringLiteral("uuid"), c->internalId().toString()},
180#if KWIN_BUILD_ACTIVITIES
181 {QStringLiteral("activities"), c->activities()},
182#endif
183 {QStringLiteral("layer"), c->layer()},
184 };
185}
186}
187
189{
190 m_replyQueryWindowInfo = message();
191 setDelayedReply(true);
192 kwinApp()->startInteractiveWindowSelection(
193 [this](Window *t) {
194 if (!t) {
195 QDBusConnection::sessionBus().send(m_replyQueryWindowInfo.createErrorReply(
196 QStringLiteral("org.kde.KWin.Error.UserCancel"),
197 QStringLiteral("User cancelled the query")));
198 return;
199 }
200 if (t->isClient()) {
201 QDBusConnection::sessionBus().send(m_replyQueryWindowInfo.createReply(clientToVariantMap(t)));
202 } else {
203 QDBusConnection::sessionBus().send(m_replyQueryWindowInfo.createErrorReply(
204 QStringLiteral("org.kde.KWin.Error.InvalidWindow"),
205 QStringLiteral("Tried to query information about an unmanaged window")));
206 }
207 });
208 return QVariantMap{};
209}
210
211QVariantMap DBusInterface::getWindowInfo(const QString &uuid)
212{
213 const auto window = workspace()->findWindow(QUuid::fromString(uuid));
214 if (window) {
215 return clientToVariantMap(window);
216 } else {
217 return {};
218 }
219}
220
222{
223 workspace()->setShowingDesktop(show, true);
224
225 auto m = message();
226 if (m.service().isEmpty()) {
227 return;
228 }
229
230 // Keep track of whatever D-Bus client asked to show the desktop. If
231 // they disappear from the bus, cancel the show desktop state so we do
232 // not end up in a state where we are stuck showing the desktop.
233 static QPointer<QDBusServiceWatcher> watcher;
234
235 if (show) {
236 if (watcher) {
237 // If we get a second call to `showDesktop(true)`, drop the previous
238 // watcher and watch the new client. That way, we simply always
239 // track the last state.
240 watcher->deleteLater();
241 }
242
243 watcher = new QDBusServiceWatcher(m.service(), QDBusConnection::sessionBus(), QDBusServiceWatcher::WatchForUnregistration, this);
244 connect(watcher, &QDBusServiceWatcher::serviceUnregistered, []() {
245 workspace()->setShowingDesktop(false, true);
246 watcher->deleteLater();
247 });
248 } else if (watcher) {
249 // Someone cancelled showing the desktop, so there's no more need to
250 // watch to cancel the show desktop state.
251 watcher->deleteLater();
252 }
253}
254
255void DBusInterface::onShowingDesktopChanged(bool show, bool /*animated*/)
256{
257 Q_EMIT showingDesktopChanged(show);
258}
259
261 : QObject(parent)
262 , m_compositor(parent)
263{
265 new CompositingAdaptor(this);
266 QDBusConnection dbus = QDBusConnection::sessionBus();
267 dbus.registerObject(QStringLiteral("/Compositor"), this);
268 dbus.connect(QString(), QStringLiteral("/Compositor"), QStringLiteral("org.kde.kwin.Compositing"),
269 QStringLiteral("reinit"), this, SLOT(reinitialize()));
270}
271
273{
274 if (!m_compositor->compositing()) {
275 return QStringLiteral("none");
276 }
277 switch (m_compositor->backend()->compositingType()) {
279 if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGLES) {
280 return QStringLiteral("gles");
281 } else {
282 return QStringLiteral("gl2");
283 }
285 return QStringLiteral("qpainter");
286 case NoCompositing:
287 default:
288 return QStringLiteral("none");
289 }
290}
291
293{
294 return m_compositor->isActive();
295}
296
298{
299 return m_compositor->compositingPossible();
300}
301
306
308{
309 return m_compositor->openGLCompositingIsBroken();
310}
311
313{
314 return kwinApp()->operationMode() != Application::OperationModeX11; // TODO: Remove this property?
315}
316
318{
319 m_compositor->reinitialize();
320}
321
323{
324 QStringList interfaces;
325 bool supportsGlx = false;
326#if HAVE_GLX
327 supportsGlx = (kwinApp()->operationMode() == Application::OperationModeX11);
328#endif
329 if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGLES) {
330 supportsGlx = false;
331 }
332 if (supportsGlx) {
333 interfaces << QStringLiteral("glx");
334 }
335 interfaces << QStringLiteral("egl");
336 return interfaces;
337}
338
340 : QObject(parent)
341 , m_manager(parent)
342{
343 qDBusRegisterMetaType<KWin::DBusDesktopDataStruct>();
344 qDBusRegisterMetaType<KWin::DBusDesktopDataVector>();
345
346 new VirtualDesktopManagerAdaptor(this);
347 QDBusConnection::sessionBus().registerObject(QStringLiteral("/VirtualDesktopManager"),
348 QStringLiteral("org.kde.KWin.VirtualDesktopManager"),
349 this);
350
351 connect(m_manager, &VirtualDesktopManager::currentChanged, this, [this]() {
352 Q_EMIT currentChanged(m_manager->currentDesktop()->id());
353 });
354
355 connect(m_manager, &VirtualDesktopManager::countChanged, this, [this](uint previousCount, uint newCount) {
356 Q_EMIT countChanged(newCount);
357 Q_EMIT desktopsChanged(desktops());
358 });
359
360 connect(m_manager, &VirtualDesktopManager::navigationWrappingAroundChanged, this, [this]() {
362 });
363
365
366 const QList<VirtualDesktop *> allDesks = m_manager->desktops();
367 for (auto *vd : allDesks) {
368 connect(vd, &VirtualDesktop::x11DesktopNumberChanged, this, [this, vd]() {
369 DBusDesktopDataStruct data{.position = vd->x11DesktopNumber() - 1, .id = vd->id(), .name = vd->name()};
370 Q_EMIT desktopDataChanged(vd->id(), data);
371 Q_EMIT desktopsChanged(desktops());
372 });
373 connect(vd, &VirtualDesktop::nameChanged, this, [this, vd]() {
374 DBusDesktopDataStruct data{.position = vd->x11DesktopNumber() - 1, .id = vd->id(), .name = vd->name()};
375 Q_EMIT desktopDataChanged(vd->id(), data);
376 Q_EMIT desktopsChanged(desktops());
377 });
378 }
379 connect(m_manager, &VirtualDesktopManager::desktopAdded, this, [this](VirtualDesktop *vd) {
380 connect(vd, &VirtualDesktop::x11DesktopNumberChanged, this, [this, vd]() {
381 DBusDesktopDataStruct data{.position = vd->x11DesktopNumber() - 1, .id = vd->id(), .name = vd->name()};
382 Q_EMIT desktopDataChanged(vd->id(), data);
383 Q_EMIT desktopsChanged(desktops());
384 });
385 connect(vd, &VirtualDesktop::nameChanged, this, [this, vd]() {
386 DBusDesktopDataStruct data{.position = vd->x11DesktopNumber() - 1, .id = vd->id(), .name = vd->name()};
387 Q_EMIT desktopDataChanged(vd->id(), data);
388 Q_EMIT desktopsChanged(desktops());
389 });
390 DBusDesktopDataStruct data{.position = vd->x11DesktopNumber() - 1, .id = vd->id(), .name = vd->name()};
391 Q_EMIT desktopCreated(vd->id(), data);
392 Q_EMIT desktopsChanged(desktops());
393 });
394 connect(m_manager, &VirtualDesktopManager::desktopRemoved, this, [this](VirtualDesktop *vd) {
395 Q_EMIT desktopRemoved(vd->id());
396 Q_EMIT desktopsChanged(desktops());
397 });
398}
399
401{
402 return m_manager->count();
403}
404
406{
407 if (static_cast<uint>(m_manager->grid().height()) == rows) {
408 return;
409 }
410
411 m_manager->setRows(rows);
412 m_manager->save();
413}
414
416{
417 return m_manager->rows();
418}
419
421{
422 if (m_manager->currentDesktop()->id() == id) {
423 return;
424 }
425
426 auto *vd = m_manager->desktopForId(id);
427 if (vd) {
428 m_manager->setCurrent(vd);
429 }
430}
431
433{
434 return m_manager->currentDesktop()->id();
435}
436
438{
439 if (m_manager->isNavigationWrappingAround() == wraps) {
440 return;
441 }
442
443 m_manager->setNavigationWrappingAround(wraps);
444}
445
450
452{
453 const auto desks = m_manager->desktops();
454 DBusDesktopDataVector desktopVect;
455 desktopVect.reserve(m_manager->count());
456
457 std::transform(desks.constBegin(), desks.constEnd(),
458 std::back_inserter(desktopVect),
459 [](const VirtualDesktop *vd) {
460 return DBusDesktopDataStruct{.position = vd->x11DesktopNumber() - 1, .id = vd->id(), .name = vd->name()};
461 });
462
463 return desktopVect;
464}
465
466void VirtualDesktopManagerDBusInterface::createDesktop(uint position, const QString &name)
467{
468 m_manager->createVirtualDesktop(position, name);
469}
470
471void VirtualDesktopManagerDBusInterface::setDesktopName(const QString &id, const QString &name)
472{
473 VirtualDesktop *vd = m_manager->desktopForId(id);
474 if (!vd) {
475 return;
476 }
477 if (vd->name() == name) {
478 return;
479 }
480
481 vd->setName(name);
482 m_manager->save();
483}
484
485void VirtualDesktopManagerDBusInterface::removeDesktop(const QString &id)
486{
487 m_manager->removeVirtualDesktop(id);
488}
489
490PluginManagerDBusInterface::PluginManagerDBusInterface(PluginManager *manager)
491 : QObject(manager)
492 , m_manager(manager)
493{
494 new PluginsAdaptor(this);
495
496 QDBusConnection::sessionBus().registerObject(QStringLiteral("/Plugins"),
497 QStringLiteral("org.kde.KWin.Plugins"),
498 this);
499}
500
502{
503 return m_manager->loadedPlugins();
504}
505
507{
508 return m_manager->availablePlugins();
509}
510
512{
513 return m_manager->loadPlugin(name);
514}
515
517{
518 m_manager->unloadPlugin(name);
519}
520
521} // namespace
522
523#include "moc_dbusinterface.cpp"
@ OperationModeX11
KWin uses only X11 for managing windows and compositing.
Definition main.h:87
QString compositingNotPossibleReason
The reason why compositing is not possible. Empty String if compositing is possible.
QStringList supportedOpenGLPlatformInterfaces
All currently supported OpenGLPlatformInterfaces.
void compositingToggled(bool active)
void reinitialize()
Used by Compositing KCM after settings change.
CompositorDBusInterface(Compositor *parent)
void compositingToggled(bool active)
virtual bool openGLCompositingIsBroken() const
static bool compositing()
Static check to test whether the Compositor is available and active.
Definition compositor.h:78
virtual void reinitialize()
virtual bool compositingPossible() const
RenderBackend * backend() const
Definition compositor.h:68
virtual QString compositingNotPossibleReason() const
bool stopActivity(const QString &in0)
Q_NOREPLY void unclutterDesktop()
bool setCurrentDesktop(int desktop)
Q_NOREPLY void showDebugConsole()
bool startActivity(const QString &in0)
DBusInterface(QObject *parent)
Q_NOREPLY void replace()
QVariantMap queryWindowInfo()
Q_NOREPLY void showDesktop(bool show)
Q_NOREPLY void cascadeDesktop()
Q_NOREPLY void reconfigure()
void showingDesktopChanged(bool showing)
Q_NOREPLY void killWindow()
QVariantMap getWindowInfo(const QString &uuid)
QString name
Definition output.h:136
void cascadeDesktop()
void unclutterDesktop()
void UnloadPlugin(const QString &name)
bool LoadPlugin(const QString &name)
QStringList loadedPlugins() const
QStringList availablePlugins() const
bool loadPlugin(const QString &pluginId)
void unloadPlugin(const QString &pluginId)
virtual CompositingType compositingType() const =0
void x11DesktopNumberChanged()
void setName(const QString &name)
void desktopRemoved(const QString &id)
VirtualDesktopManagerDBusInterface(VirtualDesktopManager *parent)
KWin::DBusDesktopDataVector desktops
void desktopDataChanged(const QString &id, KWin::DBusDesktopDataStruct)
void desktopCreated(const QString &id, KWin::DBusDesktopDataStruct)
void currentChanged(const QString &id)
void desktopsChanged(KWin::DBusDesktopDataVector)
Manages the number of available virtual desktops, the layout of those and which virtual desktop is th...
const VirtualDesktopGrid & grid() const
VirtualDesktop * desktopForId(const QString &id) const
void desktopAdded(KWin::VirtualDesktop *desktop)
void countChanged(uint previousCount, uint newCount)
QList< VirtualDesktop * > desktops() const
VirtualDesktop * currentDesktop() const
void currentChanged(KWin::VirtualDesktop *previousDesktop, KWin::VirtualDesktop *newDesktop)
void rowsChanged(uint rows)
void setNavigationWrappingAround(bool enabled)
void desktopRemoved(KWin::VirtualDesktop *desktop)
virtual bool isLocalhost() const
Definition window.cpp:409
bool skipSwitcher
Definition window.h:320
virtual bool isClient() const
Definition window.cpp:302
QString wmClientMachine(bool use_localhost) const
Definition window.cpp:171
qreal width
Definition window.h:99
bool isShade() const
Definition window.h:1034
QString desktopFileName
Definition window.h:501
bool keepBelow
Definition window.h:337
bool noBorder
Definition window.h:456
virtual bool isFullScreen() const
Definition window.cpp:3935
QUuid internalId
Definition window.h:259
bool isMinimized() const
Definition window.h:988
QString resourceClass
Definition window.h:115
qreal y
Definition window.h:94
qreal x
Definition window.h:89
virtual QString captionNormal() const =0
QString resourceName
Definition window.h:114
QStringList activities
Definition window.h:305
qreal height
Definition window.h:104
int windowType
Definition window.h:224
QStringList desktopIds() const
Definition window.cpp:830
bool skipPager
Definition window.h:315
KWin::Layer layer
Definition window.h:529
bool keepAbove
Definition window.h:332
virtual MaximizeMode maximizeMode() const
Definition window.cpp:3987
QString windowRole
Definition window.h:116
bool skipTaskbar
Definition window.h:310
Window * findWindow(const QUuid &internalId) const
Output * activeOutput() const
void showingDesktopChanged(bool showing, bool animated)
Placement * placement() const
static Workspace * self()
Definition workspace.h:91
bool showingDesktop() const
Definition workspace.h:804
void setShowingDesktop(bool showing, bool animated=true)
QString supportInformation() const
QList< DBusDesktopDataStruct > DBusDesktopDataVector
@ MaximizeVertical
The window is maximized vertically.
Definition common.h:76
@ MaximizeHorizontal
Definition common.h:77
Workspace * workspace()
Definition workspace.h:830
@ QPainterCompositing
Definition globals.h:39
@ NoCompositing
Definition globals.h:29
@ OpenGLCompositing
Definition globals.h:37