File indexing completed on 2024-04-28 16:55:48

0001 /*
0002  * SPDX-FileCopyrightText: 2018 Red Hat Inc
0003  *
0004  * SPDX-License-Identifier: LGPL-2.0-or-later
0005  *
0006  * SPDX-FileCopyrightText: 2018 Jan Grulich <jgrulich@redhat.com>
0007  */
0008 
0009 #ifndef XDG_DESKTOP_PORTAL_KDE_SESSION_H
0010 #define XDG_DESKTOP_PORTAL_KDE_SESSION_H
0011 
0012 #include <QAction>
0013 #include <QDBusVirtualObject>
0014 #include <QObject>
0015 #include <QShortcut>
0016 
0017 #include "globalshortcuts.h"
0018 #include "remotedesktop.h"
0019 #include "screencast.h"
0020 #include "waylandintegration.h"
0021 
0022 class KStatusNotifierItem;
0023 class KGlobalAccelInterface;
0024 class KGlobalAccelComponentInterface;
0025 class RemoteDesktopPortal;
0026 
0027 class Session : public QDBusVirtualObject
0028 {
0029     Q_OBJECT
0030     Q_DISABLE_COPY(Session)
0031 public:
0032     explicit Session(QObject *parent = nullptr, const QString &appId = QString(), const QString &path = QString());
0033     ~Session() override;
0034 
0035     enum SessionType {
0036         ScreenCast = 0,
0037         RemoteDesktop = 1,
0038         GlobalShortcuts = 2,
0039     };
0040 
0041     bool handleMessage(const QDBusMessage &message, const QDBusConnection &connection) override;
0042     QString introspect(const QString &path) const override;
0043 
0044     bool close();
0045     virtual SessionType type() const = 0;
0046 
0047     static Session *createSession(QObject *parent, SessionType type, const QString &appId, const QString &path);
0048     static Session *getSession(const QString &sessionHandle);
0049 
0050     QString handle() const
0051     {
0052         return m_path;
0053     }
0054 
0055 Q_SIGNALS:
0056     void closed();
0057 
0058 protected:
0059     const QString m_appId;
0060     const QString m_path;
0061 };
0062 
0063 class ScreenCastSession : public Session
0064 {
0065     Q_OBJECT
0066 public:
0067     explicit ScreenCastSession(QObject *parent, const QString &appId, const QString &path, const QString &iconName);
0068     ~ScreenCastSession() override;
0069 
0070     void setOptions(const QVariantMap &options);
0071 
0072     ScreenCastPortal::CursorModes cursorMode() const;
0073     bool multipleSources() const;
0074     ScreenCastPortal::SourceType types() const;
0075 
0076     SessionType type() const override
0077     {
0078         return SessionType::ScreenCast;
0079     }
0080     QVariant restoreData() const
0081     {
0082         return m_restoreData;
0083     }
0084     ScreenCastPortal::PersistMode persistMode() const
0085     {
0086         return m_persistMode;
0087     }
0088 
0089     WaylandIntegration::Streams streams() const
0090     {
0091         return m_streams;
0092     }
0093     void setStreams(const WaylandIntegration::Streams &streams);
0094     virtual void refreshDescription()
0095     {
0096     }
0097 
0098 protected:
0099     void setDescription(const QString &description);
0100     KStatusNotifierItem *const m_item;
0101 
0102 private:
0103     bool m_multipleSources = false;
0104     ScreenCastPortal::CursorModes m_cursorMode = ScreenCastPortal::Hidden;
0105     ScreenCastPortal::SourceType m_types = ScreenCastPortal::Any;
0106     ScreenCastPortal::PersistMode m_persistMode = ScreenCastPortal::NoPersist;
0107     void streamClosed();
0108 
0109     WaylandIntegration::Streams m_streams;
0110     QVariant m_restoreData;
0111     friend class RemoteDesktopPortal;
0112 };
0113 
0114 class RemoteDesktopSession : public ScreenCastSession
0115 {
0116     Q_OBJECT
0117 public:
0118     explicit RemoteDesktopSession(QObject *parent, const QString &appId, const QString &path);
0119     ~RemoteDesktopSession() override;
0120 
0121     RemoteDesktopPortal::DeviceTypes deviceTypes() const;
0122     void setDeviceTypes(RemoteDesktopPortal::DeviceTypes deviceTypes);
0123 
0124     bool screenSharingEnabled() const;
0125     void setScreenSharingEnabled(bool enabled);
0126 
0127     void acquireStreamingInput();
0128     void refreshDescription() override;
0129 
0130     SessionType type() const override
0131     {
0132         return SessionType::RemoteDesktop;
0133     }
0134 
0135 private:
0136     bool m_screenSharingEnabled;
0137     RemoteDesktopPortal::DeviceTypes m_deviceTypes;
0138     bool m_acquired = false;
0139 };
0140 
0141 class GlobalShortcutsSession : public Session
0142 {
0143     Q_OBJECT
0144 public:
0145     explicit GlobalShortcutsSession(QObject *parent, const QString &appId, const QString &path);
0146     ~GlobalShortcutsSession() override;
0147 
0148     SessionType type() const override
0149     {
0150         return SessionType::GlobalShortcuts;
0151     }
0152 
0153     void restoreActions(const QVariant &shortcurts);
0154     QHash<QString, QAction *> shortcuts() const
0155     {
0156         return m_shortcuts;
0157     }
0158 
0159     QVariant shortcutDescriptionsVariant() const;
0160     Shortcuts shortcutDescriptions() const;
0161     KGlobalAccelComponentInterface *component() const
0162     {
0163         return m_component;
0164     }
0165     QString componentName() const
0166     {
0167         return m_appId + m_token;
0168     }
0169 
0170 Q_SIGNALS:
0171     void shortcutsChanged();
0172     void shortcutActivated(const QString &shortcutName, qlonglong timestamp);
0173     void shortcutDeactivated(const QString &shortcutName, qlonglong timestamp);
0174 
0175 private:
0176     const QString m_token;
0177     QHash<QString, QAction *> m_shortcuts;
0178     KGlobalAccelInterface *const m_globalAccelInterface;
0179     KGlobalAccelComponentInterface *const m_component;
0180 };
0181 
0182 #endif // XDG_DESKTOP_PORTAL_KDE_SESSION_H