File indexing completed on 2024-05-12 17:08:56

0001 /*
0002     SPDX-FileCopyrightText: 2015 Kai Uwe Broulik <kde@privat.broulik.de>
0003 
0004     SPDX-License-Identifier: MIT
0005 */
0006 
0007 #pragma once
0008 
0009 #include <QAbstractListModel>
0010 
0011 #include <kdisplaymanager.h>
0012 
0013 #include <functional>
0014 
0015 class OrgFreedesktopScreenSaverInterface;
0016 namespace org
0017 {
0018 namespace freedesktop
0019 {
0020 using ScreenSaver = ::OrgFreedesktopScreenSaverInterface;
0021 }
0022 }
0023 
0024 struct SessionEntry {
0025     QString realName;
0026     QString icon;
0027     QString name;
0028     QString displayNumber;
0029     QString session;
0030     int vtNumber;
0031     bool isTty;
0032 };
0033 
0034 class KDisplayManager;
0035 
0036 // This model should be compatible with SDDM::SessionModel
0037 class SessionsModel : public QAbstractListModel
0038 {
0039     Q_OBJECT
0040 
0041     Q_PROPERTY(bool canSwitchUser READ canSwitchUser CONSTANT)
0042     Q_PROPERTY(bool canStartNewSession READ canStartNewSession CONSTANT)
0043     Q_PROPERTY(bool shouldLock READ shouldLock NOTIFY shouldLockChanged)
0044     Q_PROPERTY(bool showNewSessionEntry MEMBER m_showNewSessionEntry WRITE setShowNewSessionEntry NOTIFY showNewSessionEntryChanged)
0045     Q_PROPERTY(bool includeUnusedSessions READ includeUnusedSessions WRITE setIncludeUnusedSessions NOTIFY includeUnusedSessionsChanged)
0046 
0047     Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
0048 
0049 public:
0050     explicit SessionsModel(QObject *parent = nullptr);
0051     ~SessionsModel() override = default;
0052 
0053     enum UserRoles {
0054         NameRole = Qt::UserRole + 1,
0055         RealNameRole,
0056         IconRole, // path to a file
0057         IconNameRole, // name of an icon
0058         DisplayNumberRole,
0059         VtNumberRole,
0060         SessionRole,
0061         IsTtyRole,
0062     };
0063     Q_ENUM(UserRoles)
0064 
0065     bool canSwitchUser() const;
0066     bool canStartNewSession() const;
0067     bool shouldLock() const;
0068     bool includeUnusedSessions() const;
0069 
0070     void setShowNewSessionEntry(bool showNewSessionEntry);
0071     void setIncludeUnusedSessions(bool includeUnusedSessions);
0072 
0073     Q_INVOKABLE void reload();
0074     Q_INVOKABLE void switchUser(int vt, bool shouldLock = false);
0075     Q_INVOKABLE void startNewSession(bool shouldLock = false);
0076 
0077     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
0078     int rowCount(const QModelIndex &parent = QModelIndex()) const override;
0079     QHash<int, QByteArray> roleNames() const override;
0080 
0081 Q_SIGNALS:
0082     void shouldLockChanged();
0083     void showNewSessionEntryChanged();
0084     void countChanged();
0085     void includeUnusedSessionsChanged();
0086 
0087     void switchedUser(int vt);
0088     void startedNewSession();
0089     void aboutToLockScreen();
0090 
0091 private:
0092     void checkScreenLocked(const std::function<void(bool)> &cb);
0093 
0094     KDisplayManager m_displayManager;
0095 
0096     QVector<SessionEntry> m_data;
0097 
0098     bool m_shouldLock = true;
0099 
0100     int m_pendingVt = 0;
0101     bool m_pendingReserve = false;
0102 
0103     bool m_showNewSessionEntry = false;
0104     bool m_includeUnusedSessions = true;
0105 
0106     org::freedesktop::ScreenSaver *m_screensaverInterface = nullptr;
0107 };