diff --git a/src/Window.cpp b/src/Window.cpp index 8f893d71..a88e2b9b 100644 --- a/src/Window.cpp +++ b/src/Window.cpp @@ -351,6 +351,8 @@ void CWindow::applyDynamicRule(const SWindowRule& r) { m_sSpecialRenderData.activeBorderColor = configStringToInt(colorPart); } } catch (std::exception& e) { Debug::log(ERR, "BorderColor rule \"%s\" failed with: %s", r.szRule.c_str(), e.what()); } + } else if (r.szRule == "dimaround") { + m_sAdditionalConfigData.dimAround = true; } } @@ -367,6 +369,7 @@ void CWindow::updateDynamicRules() { m_sAdditionalConfigData.forceNoAnims = false; m_sAdditionalConfigData.animationStyle = ""; m_sAdditionalConfigData.rounding = -1; + m_sAdditionalConfigData.dimAround = false; const auto WINDOWRULES = g_pConfigManager->getMatchingRules(this); for (auto& r : WINDOWRULES) { diff --git a/src/Window.hpp b/src/Window.hpp index 0c01061b..d13097f1 100644 --- a/src/Window.hpp +++ b/src/Window.hpp @@ -8,8 +8,7 @@ #include #include "config/ConfigDataValues.hpp" -enum eIdleInhibitMode -{ +enum eIdleInhibitMode { IDLEINHIBIT_NONE = 0, IDLEINHIBIT_ALWAYS, IDLEINHIBIT_FULLSCREEN, @@ -43,6 +42,7 @@ struct SWindowAdditionalConfigData { bool forceNoShadow = false; bool windowDanceCompat = false; bool noMaxSize = false; + bool dimAround = false; }; struct SWindowRule { diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index dbcede2e..88e82791 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -93,6 +93,7 @@ void CConfigManager::setDefaultVars() { configValues["decoration:dim_inactive"].intValue = 0; configValues["decoration:dim_strength"].floatValue = 0.5f; configValues["decoration:dim_special"].floatValue = 0.2f; + configValues["decoration:dim_around"].floatValue = 0.4f; configValues["decoration:screen_shader"].strValue = STRVAL_EMPTY; configValues["dwindle:pseudotile"].intValue = 0; @@ -737,8 +738,8 @@ bool windowRuleValid(const std::string& RULE) { return !(RULE != "float" && RULE != "tile" && RULE.find("opacity") != 0 && RULE.find("move") != 0 && RULE.find("size") != 0 && RULE.find("minsize") != 0 && RULE.find("maxsize") != 0 && RULE.find("pseudo") != 0 && RULE.find("monitor") != 0 && RULE.find("idleinhibit") != 0 && RULE != "nofocus" && RULE != "noblur" && RULE != "noshadow" && RULE != "noborder" && RULE != "center" && RULE != "opaque" && RULE != "forceinput" && RULE != "fullscreen" && RULE != "nofullscreenrequest" && - RULE != "nomaxsize" && RULE != "pin" && RULE != "noanim" && RULE != "windowdance" && RULE != "maximize" && RULE.find("animation") != 0 && RULE.find("rounding") != 0 && - RULE.find("workspace") != 0 && RULE.find("bordercolor") != 0); + RULE != "nomaxsize" && RULE != "pin" && RULE != "noanim" && RULE != "dimaround" && RULE != "windowdance" && RULE != "maximize" && RULE.find("animation") != 0 && + RULE.find("rounding") != 0 && RULE.find("workspace") != 0 && RULE.find("bordercolor") != 0); } void CConfigManager::handleWindowRule(const std::string& command, const std::string& value) { diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 8853c69b..b51ec7aa 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -1102,6 +1102,8 @@ void CHyprOpenGLImpl::makeWindowSnapshot(CWindow* pWindow) { begin(PMONITOR, &fakeDamage, true); + g_pHyprRenderer->m_bRenderingSnapshot = true; + clear(CColor(0, 0, 0, 0)); // JIC timespec now; @@ -1141,6 +1143,8 @@ void CHyprOpenGLImpl::makeWindowSnapshot(CWindow* pWindow) { pixman_region32_fini(&fakeDamage); + g_pHyprRenderer->m_bRenderingSnapshot = false; + wlr_output_rollback(PMONITOR->output); } @@ -1158,6 +1162,8 @@ void CHyprOpenGLImpl::makeLayerSnapshot(SLayerSurface* pLayer) { begin(PMONITOR, &fakeDamage, true); + g_pHyprRenderer->m_bRenderingSnapshot = true; + const auto PFRAMEBUFFER = &m_mLayerFramebuffers[pLayer]; glViewport(0, 0, g_pHyprOpenGL->m_RenderData.pMonitor->vecPixelSize.x, g_pHyprOpenGL->m_RenderData.pMonitor->vecPixelSize.y); @@ -1188,9 +1194,10 @@ void CHyprOpenGLImpl::makeLayerSnapshot(SLayerSurface* pLayer) { #else glBindFramebuffer(GL_FRAMEBUFFER, m_iCurrentOutputFb); #endif - end(); + g_pHyprRenderer->m_bRenderingSnapshot = false; + pixman_region32_fini(&fakeDamage); wlr_output_rollback(PMONITOR->output); @@ -1202,9 +1209,11 @@ void CHyprOpenGLImpl::onWindowResizeEnd(CWindow* pWindow) {} void CHyprOpenGLImpl::renderSnapshot(CWindow** pWindow) { RASSERT(m_RenderData.pMonitor, "Tried to render snapshot rect without begin()!"); - const auto PWINDOW = *pWindow; + const auto PWINDOW = *pWindow; - auto it = m_mWindowFramebuffers.begin(); + static auto* const PDIMAROUND = &g_pConfigManager->getConfigValuePtr("decoration:dim_around")->floatValue; + + auto it = m_mWindowFramebuffers.begin(); for (; it != m_mWindowFramebuffers.end(); it++) { if (it->first == PWINDOW) { break; @@ -1230,6 +1239,11 @@ void CHyprOpenGLImpl::renderSnapshot(CWindow** pWindow) { pixman_region32_t fakeDamage; pixman_region32_init_rect(&fakeDamage, 0, 0, PMONITOR->vecTransformedSize.x, PMONITOR->vecTransformedSize.y); + if (*PDIMAROUND && (*pWindow)->m_sAdditionalConfigData.dimAround) { + wlr_box monbox = {0, 0, g_pHyprOpenGL->m_RenderData.pMonitor->vecPixelSize.x, g_pHyprOpenGL->m_RenderData.pMonitor->vecPixelSize.y}; + g_pHyprOpenGL->renderRect(&monbox, CColor(0, 0, 0, *PDIMAROUND * PWINDOW->m_fAlpha.fl())); + } + m_bEndFrame = true; renderTextureInternalWithDamage(it->second.m_cTex, &windowBox, PWINDOW->m_fAlpha.fl(), &fakeDamage, 0); diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index c1d5e155..d839f4a8 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -228,6 +228,7 @@ void CHyprRenderer::renderWindow(CWindow* pWindow, CMonitor* pMonitor, timespec* const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(pWindow->m_iWorkspaceID); const auto REALPOS = pWindow->m_vRealPosition.vec() + (pWindow->m_bPinned ? Vector2D{} : PWORKSPACE->m_vRenderOffset.vec()); static auto* const PNOFLOATINGBORDERS = &g_pConfigManager->getConfigValuePtr("general:no_border_on_floating")->intValue; + static auto* const PDIMAROUND = &g_pConfigManager->getConfigValuePtr("decoration:dim_around")->floatValue; SRenderData renderdata = {pMonitor->output, time, REALPOS.x, REALPOS.y}; if (ignorePosition) { @@ -261,6 +262,11 @@ void CHyprRenderer::renderWindow(CWindow* pWindow, CMonitor* pMonitor, timespec* g_pHyprOpenGL->m_pCurrentWindow = pWindow; + if (*PDIMAROUND && pWindow->m_sAdditionalConfigData.dimAround && !m_bRenderingSnapshot) { + wlr_box monbox = {0, 0, g_pHyprOpenGL->m_RenderData.pMonitor->vecPixelSize.x, g_pHyprOpenGL->m_RenderData.pMonitor->vecPixelSize.y}; + g_pHyprOpenGL->renderRect(&monbox, CColor(0, 0, 0, *PDIMAROUND * renderdata.alpha * renderdata.fadeAlpha)); + } + // clip box for animated offsets Vector2D offset; if (!ignorePosition && pWindow->m_bIsFloating && !pWindow->m_bPinned) { diff --git a/src/render/Renderer.hpp b/src/render/Renderer.hpp index af516774..cf42b9fe 100644 --- a/src/render/Renderer.hpp +++ b/src/render/Renderer.hpp @@ -48,6 +48,7 @@ class CHyprRenderer { bool m_bWindowRequestedCursorHide = false; bool m_bBlockSurfaceFeedback = false; + bool m_bRenderingSnapshot = false; CWindow* m_pLastScanout = nullptr; CMonitor* m_pMostHzMonitor = nullptr;