From c17ea5437146075ccfdd1368e14cceb97d02a6f6 Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Fri, 20 Jun 2025 16:37:22 -0700 Subject: [PATCH] wayland/lock: check for protocol availability before use Fixes #66 --- src/wayland/session_lock.cpp | 7 +++++++ src/wayland/session_lock/session_lock.cpp | 2 ++ src/wayland/session_lock/session_lock.hpp | 2 ++ 3 files changed, 11 insertions(+) diff --git a/src/wayland/session_lock.cpp b/src/wayland/session_lock.cpp index ccba9bc..0ecf9ec 100644 --- a/src/wayland/session_lock.cpp +++ b/src/wayland/session_lock.cpp @@ -109,6 +109,13 @@ void WlSessionLock::updateSurfaces(bool show, WlSessionLock* old) { void WlSessionLock::realizeLockTarget(WlSessionLock* old) { if (this->lockTarget) { + if (!SessionLockManager::lockAvailable()) { + qCritical() << "Cannot start session lock: The current compositor does not support the " + "ext-session-lock-v1 protocol."; + this->unlock(); + return; + } + if (this->mSurfaceComponent == nullptr) { qWarning() << "WlSessionLock.surface is null. Aborting lock."; this->unlock(); diff --git a/src/wayland/session_lock/session_lock.cpp b/src/wayland/session_lock/session_lock.cpp index 50e8818..c32dd90 100644 --- a/src/wayland/session_lock/session_lock.cpp +++ b/src/wayland/session_lock/session_lock.cpp @@ -22,6 +22,8 @@ QSWaylandSessionLockManager* manager() { } } // namespace +bool SessionLockManager::lockAvailable() { return manager()->isActive(); } + bool SessionLockManager::lock() { if (this->isLocked() || SessionLockManager::sessionLocked()) return false; this->mLock = manager()->acquireLock(); diff --git a/src/wayland/session_lock/session_lock.hpp b/src/wayland/session_lock/session_lock.hpp index 1ad6ae9..5a55896 100644 --- a/src/wayland/session_lock/session_lock.hpp +++ b/src/wayland/session_lock/session_lock.hpp @@ -15,6 +15,8 @@ class SessionLockManager: public QObject { public: explicit SessionLockManager(QObject* parent = nullptr): QObject(parent) {} + [[nodiscard]] static bool lockAvailable(); + // 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.