File indexing completed on 2024-12-08 13:21:46

0001 /*
0002     KWin - the KDE window manager
0003     This file is part of the KDE project.
0004 
0005     SPDX-FileCopyrightText: 2012 Martin Gräßlin <mgraesslin@kde.org>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #pragma once
0011 
0012 #include <QObject>
0013 #include <QtDBus>
0014 
0015 #include "virtualdesktopsdbustypes.h"
0016 
0017 namespace KWin
0018 {
0019 
0020 class Compositor;
0021 class PluginManager;
0022 class VirtualDesktopManager;
0023 
0024 /**
0025  * @brief This class is a wrapper for the org.kde.KWin D-Bus interface.
0026  *
0027  * The main purpose of this class is to be exported on the D-Bus as object /KWin.
0028  * It is a pure wrapper to provide the deprecated D-Bus methods which have been
0029  * removed from Workspace which used to implement the complete D-Bus interface.
0030  *
0031  * Nowadays the D-Bus interfaces are distributed, parts of it are exported on
0032  * /Compositor, parts on /Effects and parts on /KWin. The implementation in this
0033  * class just delegates the method calls to the actual implementation in one of the
0034  * three singletons.
0035  *
0036  * @author Martin Gräßlin <mgraesslin@kde.org>
0037  */
0038 class DBusInterface : public QObject, protected QDBusContext
0039 {
0040     Q_OBJECT
0041     Q_CLASSINFO("D-Bus Interface", "org.kde.KWin")
0042 public:
0043     explicit DBusInterface(QObject *parent);
0044     ~DBusInterface() override;
0045 
0046 public: // PROPERTIES
0047     Q_PROPERTY(bool showingDesktop READ showingDesktop NOTIFY showingDesktopChanged)
0048     bool showingDesktop() const;
0049 
0050 public Q_SLOTS: // METHODS
0051     Q_NOREPLY void cascadeDesktop();
0052     int currentDesktop();
0053     Q_NOREPLY void killWindow();
0054     void nextDesktop();
0055     void previousDesktop();
0056     Q_NOREPLY void reconfigure();
0057     bool setCurrentDesktop(int desktop);
0058     bool startActivity(const QString &in0);
0059     bool stopActivity(const QString &in0);
0060     QString supportInformation();
0061     QString activeOutputName();
0062     Q_NOREPLY void unclutterDesktop();
0063     Q_NOREPLY void showDebugConsole();
0064 
0065     /**
0066      * Instructs kwin_wayland to restart itself.
0067      *
0068      * This acts as an implementation detail of: kwin_wayland --replace
0069      */
0070     Q_NOREPLY void replace();
0071 
0072     /**
0073      * Allows the user to pick a window and get info on it.
0074      *
0075      * When called the user's mouse cursor will become a targeting reticule.
0076      * On clicking a window with the target a map will be returned
0077      * with various information about the picked window, such as:
0078      * height, width, minimized, fullscreen, etc.
0079      */
0080     QVariantMap queryWindowInfo();
0081 
0082     /**
0083      * Returns a map with information about the window.
0084      *
0085      * The map includes entries such as position, size, status, and more.
0086      *
0087      * @param uuid is a QUuid from Window::internalId().
0088      */
0089     QVariantMap getWindowInfo(const QString &uuid);
0090 
0091     Q_NOREPLY void showDesktop(bool show);
0092 
0093 Q_SIGNALS:
0094     void showingDesktopChanged(bool showing);
0095 
0096 private Q_SLOTS:
0097     void onShowingDesktopChanged(bool show, bool /*animated*/);
0098 
0099 private:
0100     QString m_serviceName;
0101     QDBusMessage m_replyQueryWindowInfo;
0102 };
0103 
0104 class CompositorDBusInterface : public QObject
0105 {
0106     Q_OBJECT
0107     Q_CLASSINFO("D-Bus Interface", "org.kde.kwin.Compositing")
0108 
0109     /**
0110      * @brief Whether the Compositor is active. That is a Scene is present and the Compositor is
0111      * not shutting down itself.
0112      */
0113     Q_PROPERTY(bool active READ isActive)
0114 
0115     /**
0116      * @brief Whether compositing is possible. Mostly means whether the required X extensions
0117      * are available.
0118      */
0119     Q_PROPERTY(bool compositingPossible READ isCompositingPossible)
0120 
0121     /**
0122      * @brief The reason why compositing is not possible. Empty String if compositing is possible.
0123      */
0124     Q_PROPERTY(QString compositingNotPossibleReason READ compositingNotPossibleReason)
0125 
0126     /**
0127      * @brief Whether OpenGL has failed badly in the past (crash) and is considered as broken.
0128      */
0129     Q_PROPERTY(bool openGLIsBroken READ isOpenGLBroken)
0130 
0131     /**
0132      * The type of the currently used Scene:
0133      * @li @c none No Compositing
0134      * @li @c gl1 OpenGL 1
0135      * @li @c gl2 OpenGL 2
0136      * @li @c gles OpenGL ES 2
0137      */
0138     Q_PROPERTY(QString compositingType READ compositingType)
0139 
0140     /**
0141      * @brief All currently supported OpenGLPlatformInterfaces.
0142      *
0143      * Possible values:
0144      * @li glx
0145      * @li egl
0146      *
0147      * Values depend on operation mode and compile time options.
0148      */
0149     Q_PROPERTY(QStringList supportedOpenGLPlatformInterfaces READ supportedOpenGLPlatformInterfaces)
0150 
0151     Q_PROPERTY(bool platformRequiresCompositing READ platformRequiresCompositing)
0152 public:
0153     explicit CompositorDBusInterface(Compositor *parent);
0154     ~CompositorDBusInterface() override = default;
0155 
0156     bool isActive() const;
0157     bool isCompositingPossible() const;
0158     QString compositingNotPossibleReason() const;
0159     bool isOpenGLBroken() const;
0160     QString compositingType() const;
0161     QStringList supportedOpenGLPlatformInterfaces() const;
0162     bool platformRequiresCompositing() const;
0163 
0164 public Q_SLOTS:
0165     /**
0166      * @brief Suspends the Compositor if it is currently active.
0167      *
0168      * Note: it is possible that the Compositor is not able to suspend. Use isActive to check
0169      * whether the Compositor has been suspended.
0170      *
0171      * @return void
0172      * @see resume
0173      * @see isActive
0174      */
0175     void suspend();
0176 
0177     /**
0178      * @brief Resumes the Compositor if it is currently suspended.
0179      *
0180      * Note: it is possible that the Compositor cannot be resumed, that is there might be Clients
0181      * blocking the usage of Compositing or the Scene might be broken. Use isActive to check
0182      * whether the Compositor has been resumed. Also check isCompositingPossible and
0183      * isOpenGLBroken.
0184      *
0185      * Note: The starting of the Compositor can require some time and is partially done threaded.
0186      * After this method returns the setup may not have been completed.
0187      *
0188      * @return void
0189      * @see suspend
0190      * @see isActive
0191      * @see isCompositingPossible
0192      * @see isOpenGLBroken
0193      */
0194     void resume();
0195 
0196     /**
0197      * @brief Used by Compositing KCM after settings change.
0198      *
0199      * On signal Compositor reloads settings and restarts.
0200      */
0201     void reinitialize();
0202 
0203 Q_SIGNALS:
0204     void compositingToggled(bool active);
0205 
0206 private:
0207     Compositor *m_compositor;
0208 };
0209 
0210 // TODO: disable all of this in case of kiosk?
0211 
0212 class VirtualDesktopManagerDBusInterface : public QObject
0213 {
0214     Q_OBJECT
0215     Q_CLASSINFO("D-Bus Interface", "org.kde.KWin.VirtualDesktopManager")
0216 
0217     /**
0218      * The number of virtual desktops currently available.
0219      * The ids of the virtual desktops are in the range [1, VirtualDesktopManager::maximum()].
0220      */
0221     Q_PROPERTY(uint count READ count NOTIFY countChanged)
0222 
0223     /**
0224      * The number of rows the virtual desktops will be laid out in
0225      */
0226     Q_PROPERTY(uint rows READ rows WRITE setRows NOTIFY rowsChanged)
0227 
0228     /**
0229      * The id of the virtual desktop which is currently in use.
0230      */
0231     Q_PROPERTY(QString current READ current WRITE setCurrent NOTIFY currentChanged)
0232 
0233     /**
0234      * Whether navigation in the desktop layout wraps around at the borders.
0235      */
0236     Q_PROPERTY(bool navigationWrappingAround READ isNavigationWrappingAround WRITE setNavigationWrappingAround NOTIFY navigationWrappingAroundChanged)
0237 
0238     /**
0239      * list of key/value pairs which every one of them is representing a desktop
0240      */
0241     Q_PROPERTY(KWin::DBusDesktopDataVector desktops READ desktops NOTIFY desktopsChanged);
0242 
0243 public:
0244     VirtualDesktopManagerDBusInterface(VirtualDesktopManager *parent);
0245     ~VirtualDesktopManagerDBusInterface() override = default;
0246 
0247     uint count() const;
0248 
0249     void setRows(uint rows);
0250     uint rows() const;
0251 
0252     void setCurrent(const QString &id);
0253     QString current() const;
0254 
0255     void setNavigationWrappingAround(bool wraps);
0256     bool isNavigationWrappingAround() const;
0257 
0258     KWin::DBusDesktopDataVector desktops() const;
0259 
0260 Q_SIGNALS:
0261     void countChanged(uint count);
0262     void rowsChanged(uint rows);
0263     void currentChanged(const QString &id);
0264     void navigationWrappingAroundChanged(bool wraps);
0265     void desktopsChanged(KWin::DBusDesktopDataVector);
0266     void desktopDataChanged(const QString &id, KWin::DBusDesktopDataStruct);
0267     void desktopCreated(const QString &id, KWin::DBusDesktopDataStruct);
0268     void desktopRemoved(const QString &id);
0269 
0270 public Q_SLOTS:
0271     /**
0272      * Create a desktop with a new name at a given position
0273      * note: the position starts from 1
0274      */
0275     void createDesktop(uint position, const QString &name);
0276     void setDesktopName(const QString &id, const QString &name);
0277     void removeDesktop(const QString &id);
0278 
0279 private:
0280     VirtualDesktopManager *m_manager;
0281 };
0282 
0283 class PluginManagerDBusInterface : public QObject
0284 {
0285     Q_OBJECT
0286     Q_CLASSINFO("D-Bus Interface", "org.kde.KWin.Plugins")
0287 
0288     Q_PROPERTY(QStringList LoadedPlugins READ loadedPlugins)
0289     Q_PROPERTY(QStringList AvailablePlugins READ availablePlugins)
0290 
0291 public:
0292     explicit PluginManagerDBusInterface(PluginManager *manager);
0293 
0294     QStringList loadedPlugins() const;
0295     QStringList availablePlugins() const;
0296 
0297 public Q_SLOTS:
0298     bool LoadPlugin(const QString &name);
0299     void UnloadPlugin(const QString &name);
0300 
0301 private:
0302     PluginManager *m_manager;
0303 };
0304 
0305 } // namespace