quickshell/src/wayland/session_lock/session_lock.hpp
outfoxxed 1fa87b7c5a
feat(slock): implement ext_session_lock_v1 backend
note: did not run lints or fully test yet
2024-02-28 04:37:52 -08:00

92 lines
2.7 KiB
C++

#pragma once
#include <qobject.h>
#include <qtclasshelpermacros.h>
#include <qtmetamacros.h>
#include <qwindow.h>
class QSWaylandSessionLock;
class QSWaylandSessionLockSurface;
class QSWaylandSessionLockIntegration;
class SessionLockManager: public QObject {
Q_OBJECT;
public:
SessionLockManager(QObject* parent = nullptr): QObject(parent) {}
Q_DISABLE_COPY_MOVE(SessionLockManager);
// Returns true if a lock was acquired.
// If true is returned the caller must watch the global screen list and create/destroy
// windows with an attached LockWindowExtension to match it.
bool lock();
// Returns true if the session was locked and is now unlocked.
bool unlock();
[[nodiscard]] bool isLocked() const;
static bool sessionLocked();
signals:
// This signal is sent once the compositor considers the session to be fully locked.
// This corrosponds to the ext_session_lock_v1::locked event.
void locked();
// This signal is sent once the compositor considers the session to be unlocked.
// This corrosponds to the ext_session_lock_v1::finished event.
//
// The session lock will end in one of three cases.
// 1. unlock() is called.
// 2. The SessionLockManager is destroyed.
// 3. The compositor forcibly unlocks the session.
//
// After receiving this event the caller should destroy all of its lock surfaces.
void unlocked();
private slots:
//void onUnlocked();
private:
QSWaylandSessionLock* mLock = nullptr;
friend class LockWindowExtension;
};
class LockWindowExtension: public QObject {
Q_OBJECT;
public:
LockWindowExtension(QObject* parent = nullptr): QObject(parent) {}
~LockWindowExtension() override;
// Attach this lock extension to the given window.
// The extension is reparented to the window and replaces any existing lock extension.
// Returns false if the window cannot be used.
bool attach(QWindow* window, SessionLockManager* manager);
// This must be called in place of QWindow::setVisible. Calling QWindow::setVisible will result in a crash.
// To make a window invisible, destroy it as it cannot be recovered.
void setVisible();
[[nodiscard]] bool isLocked() const;
static LockWindowExtension* get(QWindow* window);
signals:
// This signal is sent once the compositor considers the session to be fully locked.
// See SessionLockManager::locked for details.
void locked();
// After receiving this signal the window is no longer in use by the compositor
// and should be destroyed. See SessionLockManager::unlocked for details.
void unlocked();
private:
QSWaylandSessionLockSurface* surface = nullptr;
QSWaylandSessionLock* lock = nullptr;
bool immediatelyVisible = false;
friend class QSWaylandSessionLockSurface;
friend class QSWaylandSessionLockIntegration;
};