Files
face-unlock/src/agent/sessionlock.h
T

92 lines
2.7 KiB
C++

// SPDX-License-Identifier: GPL-3.0-or-later
//
// face-unlock's own lock screen, for whoever wants it on a compositor whose
// lock screen is a program of its own (ext-session-lock: Hyprland, Niri,
// Sway and others): `face-unlock lock`.
//
// Any other lock screen there covers the bubble, and only opens itself (it
// gets the face through PAM, see src/lib/pam.sh). This one is the lock
// screen, so the bubble shows on it and a face opens it straight away. The
// picture behind it is the user's choice (LockWallpaper).
//
// Qt knows no ext-session-lock, so each screen's window gets the lock surface
// role through Qt's shell integration, the way LayerShellQt gives windows the
// layer-shell role. If this program goes away while locked, the compositor
// keeps the session locked: that is the protocol's promise.
#pragma once
#include <QHash>
#include <QObject>
#include <QPointer>
#include <QUrl>
#include <QtGlobal>
class BubbleController;
class LockScreenController;
class UserConfig;
class QQmlEngine;
class QQuickView;
class QScreen;
class LockIntegration;
class Lock;
class SessionLock : public QObject
{
Q_OBJECT
public:
SessionLock(QQmlEngine *engine, BubbleController *bubble, LockScreenController *screen, UserConfig *config, QObject *parent = nullptr);
~SessionLock() override;
// Whether this build has it. Qt before 6.10 commits a window's surface
// before a lock surface may be committed, which the protocol forbids.
static constexpr bool built = QT_VERSION >= QT_VERSION_CHECK(6, 10, 0);
// Whether it can lock here: built, and the compositor offers
// ext-session-lock.
static bool available();
// From the lock request until the lock is gone again.
bool isLocked() const
{
return m_lock != nullptr;
}
// The compositor has confirmed the lock: nothing unlocked is on screen.
bool isConfirmed() const
{
return m_confirmed;
}
// A file that says the screen is locked, so that an agent started again
// after a crash locks again (see main.cpp).
static QString markerPath();
public Q_SLOTS:
void lock();
void unlock();
Q_SIGNALS:
void lockedChanged(bool locked);
void confirmed();
private:
friend class Lock;
void onLocked();
void onFinished();
void addScreen(QScreen *screen);
void removeScreen(QScreen *screen);
void release();
QQmlEngine *m_engine;
BubbleController *m_bubble;
LockScreenController *m_screen;
UserConfig *m_config;
LockIntegration *m_integration = nullptr;
Lock *m_lock = nullptr;
bool m_confirmed = false;
bool m_unlockWanted = false;
QHash<QScreen *, QPointer<QQuickView>> m_views;
// The pictures behind it, by output (see Wallpaper).
QHash<QString, QUrl> m_pictures;
};