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