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