core: immediately create session lock surfaces (#421)

* core: immediately create session lock surfaces

Instead of waiting for the `locked` event, create session lock surfaces
right away.

* core: don't allow unlock_and_destroy if `locked` has never been recieved
This commit is contained in:
Maximilian Seidler 2024-07-14 16:59:06 +02:00 committed by GitHub
parent b407128cae
commit 69d37d2663
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 19 additions and 4 deletions

View file

@ -400,6 +400,9 @@ void CHyprlock::run() {
acquireSessionLock(); acquireSessionLock();
if (m_bTerminate) // Recieved finished
exit(1);
g_pAuth = std::make_unique<CAuth>(); g_pAuth = std::make_unique<CAuth>();
g_pAuth->start(); g_pAuth->start();
@ -409,6 +412,8 @@ void CHyprlock::run() {
registerSignalAction(SIGSEGV, handleCriticalSignal); registerSignalAction(SIGSEGV, handleCriticalSignal);
registerSignalAction(SIGABRT, handleCriticalSignal); registerSignalAction(SIGABRT, handleCriticalSignal);
createSessionLockSurfaces();
pollfd pollfds[] = { pollfd pollfds[] = {
{ {
.fd = wl_display_get_fd(m_sWaylandState.display), .fd = wl_display_get_fd(m_sWaylandState.display),
@ -925,7 +930,7 @@ void CHyprlock::acquireSessionLock() {
m_sLockState.lock = ext_session_lock_manager_v1_lock(m_sWaylandState.sessionLock); m_sLockState.lock = ext_session_lock_manager_v1_lock(m_sWaylandState.sessionLock);
ext_session_lock_v1_add_listener(m_sLockState.lock, &sessionLockListener, nullptr); ext_session_lock_v1_add_listener(m_sLockState.lock, &sessionLockListener, nullptr);
// wait for wayland to signal whether the session lock has been acquired // roundtrip in case the compositor sends `finished` right away
wl_display_roundtrip(m_sWaylandState.display); wl_display_roundtrip(m_sWaylandState.display);
} }
@ -936,6 +941,12 @@ void CHyprlock::releaseSessionLock() {
return; return;
} }
if (!m_bLocked) {
// Would be a protocol error to allow this
Debug::log(ERR, "Trying to unlock the session, but never recieved the locked event!");
return;
}
ext_session_lock_v1_unlock_and_destroy(m_sLockState.lock); ext_session_lock_v1_unlock_and_destroy(m_sLockState.lock);
m_sLockState.lock = nullptr; m_sLockState.lock = nullptr;
@ -947,12 +958,14 @@ void CHyprlock::releaseSessionLock() {
wl_display_roundtrip(m_sWaylandState.display); wl_display_roundtrip(m_sWaylandState.display);
} }
void CHyprlock::onLockLocked() { void CHyprlock::createSessionLockSurfaces() {
Debug::log(LOG, "onLockLocked called");
for (auto& o : m_vOutputs) { for (auto& o : m_vOutputs) {
o->sessionLockSurface = std::make_unique<CSessionLockSurface>(o.get()); o->sessionLockSurface = std::make_unique<CSessionLockSurface>(o.get());
} }
}
void CHyprlock::onLockLocked() {
Debug::log(LOG, "onLockLocked called");
m_bLocked = true; m_bLocked = true;
} }

View file

@ -46,6 +46,8 @@ class CHyprlock {
void acquireSessionLock(); void acquireSessionLock();
void releaseSessionLock(); void releaseSessionLock();
void createSessionLockSurfaces();
void attemptRestoreOnDeath(); void attemptRestoreOnDeath();
void spawnAsync(const std::string& cmd); void spawnAsync(const std::string& cmd);