aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/render/Renderer.cpp
diff options
context:
space:
mode:
authorVaxry <[email protected]>2024-08-29 23:30:12 +0200
committerGitHub <[email protected]>2024-08-29 23:30:12 +0200
commit604eb21a7e55d85ec7f6cb8cba39fc4c20a07a9d (patch)
tree7b31fb7e21d779fee2911aa7430feed1ec3774d6 /src/render/Renderer.cpp
parent92a0dd164e9cc74060b63abae67b0204b6b6074c (diff)
downloadHyprland-604eb21a7e55d85ec7f6cb8cba39fc4c20a07a9d.tar.gz
Hyprland-604eb21a7e55d85ec7f6cb8cba39fc4c20a07a9d.zip
renderer: better lockscreen dead behavior (#7574)
--------- Co-authored-by: Mihai Fufezan <[email protected]>
Diffstat (limited to 'src/render/Renderer.cpp')
-rw-r--r--src/render/Renderer.cpp53
1 files changed, 37 insertions, 16 deletions
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index 33679731..2854a973 100644
--- a/src/render/Renderer.cpp
+++ b/src/render/Renderer.cpp
@@ -839,9 +839,7 @@ void CHyprRenderer::renderAllClientsForWorkspace(CMonitor* pMonitor, PHLWORKSPAC
if (g_pSessionLockManager->isSessionLocked() && !g_pSessionLockManager->isSessionLockPresent()) {
// locked with no exclusive, draw only red
- CBox boxe = {0, 0, INT16_MAX, INT16_MAX};
- const float A = g_pSessionLockManager->getRedScreenAlphaForMonitor(pMonitor->ID);
- g_pHyprOpenGL->renderRect(&boxe, CColor(1.0, 0.2, 0.2, A));
+ renderSessionLockMissing(pMonitor);
return;
}
@@ -1001,27 +999,50 @@ void CHyprRenderer::renderLockscreen(CMonitor* pMonitor, timespec* now, const CB
if (g_pSessionLockManager->isSessionLocked()) {
Vector2D translate = {geometry.x, geometry.y};
- float scale = (float)geometry.width / pMonitor->vecPixelSize.x;
const auto PSLS = g_pSessionLockManager->getSessionLockSurfaceForMonitor(pMonitor->ID);
- if (!PSLS) {
- // locked with no surface, fill with red
- const auto ALPHA = g_pSessionLockManager->getRedScreenAlphaForMonitor(pMonitor->ID);
-
- CBox monbox = {translate.x, translate.y, pMonitor->vecTransformedSize.x * scale, pMonitor->vecTransformedSize.y * scale};
- g_pHyprOpenGL->renderRect(&monbox, CColor(1.0, 0.2, 0.2, ALPHA));
-
- if (ALPHA < 1.f) /* animate */
- damageMonitor(pMonitor);
- else
- g_pSessionLockManager->onLockscreenRenderedOnMonitor(pMonitor->ID);
- } else {
+ if (!PSLS)
+ renderSessionLockMissing(pMonitor);
+ else {
renderSessionLockSurface(PSLS, pMonitor, now);
g_pSessionLockManager->onLockscreenRenderedOnMonitor(pMonitor->ID);
}
}
}
+void CHyprRenderer::renderSessionLockMissing(CMonitor* pMonitor) {
+ const auto ALPHA = g_pSessionLockManager->getRedScreenAlphaForMonitor(pMonitor->ID);
+
+ CBox monbox = {{}, pMonitor->vecPixelSize};
+
+ const bool ANY_PRESENT = g_pSessionLockManager->anySessionLockSurfacesPresent();
+
+ if (ANY_PRESENT) {
+ // render image2, without instructions. Lock still "alive", unless texture dead
+ if (g_pHyprOpenGL->m_pLockDead2Texture)
+ g_pHyprOpenGL->renderTexture(g_pHyprOpenGL->m_pLockDead2Texture, &monbox, ALPHA);
+ else
+ g_pHyprOpenGL->renderRect(&monbox, CColor(1.0, 0.2, 0.2, ALPHA));
+ } else {
+ // render image, with instructions. Lock is gone.
+ if (g_pHyprOpenGL->m_pLockDeadTexture) {
+ g_pHyprOpenGL->renderTexture(g_pHyprOpenGL->m_pLockDeadTexture, &monbox, ALPHA);
+
+ // also render text for the tty number
+ if (g_pHyprOpenGL->m_pLockTtyTextTexture) {
+ CBox texbox = {{}, g_pHyprOpenGL->m_pLockTtyTextTexture->m_vSize};
+ g_pHyprOpenGL->renderTexture(g_pHyprOpenGL->m_pLockTtyTextTexture, &texbox, 1.F);
+ }
+ } else
+ g_pHyprOpenGL->renderRect(&monbox, CColor(1.0, 0.2, 0.2, ALPHA));
+ }
+
+ if (ALPHA < 1.f) /* animate */
+ damageMonitor(pMonitor);
+ else
+ g_pSessionLockManager->onLockscreenRenderedOnMonitor(pMonitor->ID);
+}
+
void CHyprRenderer::calculateUVForSurface(PHLWINDOW pWindow, SP<CWLSurfaceResource> pSurface, bool main, const Vector2D& projSize, bool fixMisalignedFSV1) {
if (!pWindow || !pWindow->m_bIsX11) {
Vector2D uvTL;