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 };