File indexing completed on 2024-04-28 05:36:53

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 
0081     void setRestoreData(const QVariant &restoreData)
0082     {
0083         m_restoreData = restoreData;
0084     }
0085 
0086     QVariant restoreData() const
0087     {
0088         return m_restoreData;
0089     }
0090 
0091     void setPersistMode(ScreenCastPortal::PersistMode persistMode);
0092 
0093     ScreenCastPortal::PersistMode persistMode() const
0094     {
0095         return m_persistMode;
0096     }
0097 
0098     WaylandIntegration::Streams streams() const
0099     {
0100         return m_streams;
0101     }
0102     void setStreams(const WaylandIntegration::Streams &streams);
0103     virtual void refreshDescription()
0104     {
0105     }
0106 
0107 protected:
0108     void setDescription(const QString &description);
0109     KStatusNotifierItem *const m_item;
0110 
0111 private:
0112     bool m_multipleSources = false;
0113     ScreenCastPortal::CursorModes m_cursorMode = ScreenCastPortal::Hidden;
0114     ScreenCastPortal::SourceType m_types = ScreenCastPortal::Any;
0115     ScreenCastPortal::PersistMode m_persistMode = ScreenCastPortal::NoPersist;
0116     QVariant m_restoreData;
0117 
0118     void streamClosed();
0119 
0120     WaylandIntegration::Streams m_streams;
0121     friend class RemoteDesktopPortal;
0122 };
0123 
0124 class RemoteDesktopSession : public ScreenCastSession
0125 {
0126     Q_OBJECT
0127 public:
0128     explicit RemoteDesktopSession(QObject *parent, const QString &appId, const QString &path);
0129     ~RemoteDesktopSession() override;
0130 
0131     void setOptions(const QVariantMap &options);
0132 
0133     RemoteDesktopPortal::DeviceTypes deviceTypes() const;
0134     void setDeviceTypes(RemoteDesktopPortal::DeviceTypes deviceTypes);
0135 
0136     bool screenSharingEnabled() const;
0137     void setScreenSharingEnabled(bool enabled);
0138 
0139     void acquireStreamingInput();
0140     void refreshDescription() override;
0141 
0142     SessionType type() const override
0143     {
0144         return SessionType::RemoteDesktop;
0145     }
0146 
0147 private:
0148     bool m_screenSharingEnabled;
0149     RemoteDesktopPortal::DeviceTypes m_deviceTypes;
0150     bool m_acquired = false;
0151 };
0152 
0153 class GlobalShortcutsSession : public Session
0154 {
0155     Q_OBJECT
0156 public:
0157     explicit GlobalShortcutsSession(QObject *parent, const QString &appId, const QString &path);
0158     ~GlobalShortcutsSession() override;
0159 
0160     SessionType type() const override
0161     {
0162         return SessionType::GlobalShortcuts;
0163     }
0164 
0165     void restoreActions(const QVariant &shortcurts);
0166     QHash<QString, QAction *> shortcuts() const
0167     {
0168         return m_shortcuts;
0169     }
0170 
0171     QVariant shortcutDescriptionsVariant() const;
0172     Shortcuts shortcutDescriptions() const;
0173     KGlobalAccelComponentInterface *component() const
0174     {
0175         return m_component;
0176     }
0177     QString componentName() const
0178     {
0179         return m_appId + m_token;
0180     }
0181 
0182 Q_SIGNALS:
0183     void shortcutsChanged();
0184     void shortcutActivated(const QString &shortcutName, qlonglong timestamp);
0185     void shortcutDeactivated(const QString &shortcutName, qlonglong timestamp);
0186 
0187 private:
0188     const QString m_token;
0189     QHash<QString, QAction *> m_shortcuts;
0190     KGlobalAccelInterface *const m_globalAccelInterface;
0191     KGlobalAccelComponentInterface *const m_component;
0192 };
0193 
0194 #endif // XDG_DESKTOP_PORTAL_KDE_SESSION_H