From 43b96f03b5af60586a864ea64e8c71b11ea6eb85 Mon Sep 17 00:00:00 2001 From: SoSeDiK Date: Mon, 8 Apr 2024 01:19:02 +0300 Subject: props: Allow setting per-window fullscreen opacity (#5470) --- src/Compositor.cpp | 5 ++++- src/debug/HyprCtl.cpp | 4 ++++ src/desktop/Window.cpp | 17 ++++++++++++----- src/desktop/Window.hpp | 10 ++++++---- 4 files changed, 26 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 746011ef..5c42b8ff 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -1922,7 +1922,10 @@ void CCompositor::updateWindowAnimatedDecorationValues(CWindow* pWindow) { // opacity const auto PWORKSPACE = pWindow->m_pWorkspace; if (pWindow->m_bIsFullscreen && PWORKSPACE->m_efFullscreenMode == FULLSCREEN_FULL) { - pWindow->m_fActiveInactiveAlpha = *PFULLSCREENALPHA; + pWindow->m_fActiveInactiveAlpha = pWindow->m_sSpecialRenderData.alphaFullscreen.toUnderlying() != -1 ? + (pWindow->m_sSpecialRenderData.alphaFullscreenOverride.toUnderlying() ? pWindow->m_sSpecialRenderData.alphaFullscreen.toUnderlying() : + pWindow->m_sSpecialRenderData.alphaFullscreen.toUnderlying() * *PFULLSCREENALPHA) : + *PFULLSCREENALPHA; } else { if (pWindow == m_pLastWindow) pWindow->m_fActiveInactiveAlpha = pWindow->m_sSpecialRenderData.alphaOverride.toUnderlying() ? pWindow->m_sSpecialRenderData.alpha.toUnderlying() : diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp index d672a2d0..ad62de12 100644 --- a/src/debug/HyprCtl.cpp +++ b/src/debug/HyprCtl.cpp @@ -1209,6 +1209,10 @@ std::string dispatchSetProp(eHyprCtlOutputFormat format, std::string request) { PWINDOW->m_sSpecialRenderData.alphaInactiveOverride.forceSetIgnoreLocked(configStringToInt(VAL), lock); } else if (PROP == "alphainactive") { PWINDOW->m_sSpecialRenderData.alphaInactive.forceSetIgnoreLocked(std::stof(VAL), lock); + } else if (PROP == "alphafullscreenoverride") { + PWINDOW->m_sSpecialRenderData.alphaFullscreenOverride.forceSetIgnoreLocked(configStringToInt(VAL), lock); + } else if (PROP == "alphafullscreen") { + PWINDOW->m_sSpecialRenderData.alphaFullscreen.forceSetIgnoreLocked(std::stof(VAL), lock); } else if (PROP == "activebordercolor") { PWINDOW->m_sSpecialRenderData.activeBorderColor.forceSetIgnoreLocked(CGradientValueData(CColor(configStringToInt(VAL))), lock); } else if (PROP == "inactivebordercolor") { diff --git a/src/desktop/Window.cpp b/src/desktop/Window.cpp index 75f1f4a9..902ec2ca 100644 --- a/src/desktop/Window.cpp +++ b/src/desktop/Window.cpp @@ -604,19 +604,26 @@ void CWindow::applyDynamicRule(const SWindowRule& r) { if (r == "override") { if (opacityIDX == 1) { - m_sSpecialRenderData.alphaOverride = true; - m_sSpecialRenderData.alphaInactiveOverride = true; + m_sSpecialRenderData.alphaOverride = true; + m_sSpecialRenderData.alphaInactiveOverride = true; + m_sSpecialRenderData.alphaFullscreenOverride = true; } else if (opacityIDX == 2) m_sSpecialRenderData.alphaInactiveOverride = true; + else if (opacityIDX == 3) + m_sSpecialRenderData.alphaFullscreenOverride = true; } else { if (opacityIDX == 0) { - m_sSpecialRenderData.alpha = std::stof(r); - m_sSpecialRenderData.alphaInactive = std::stof(r); + m_sSpecialRenderData.alpha = std::stof(r); + m_sSpecialRenderData.alphaInactive = std::stof(r); + m_sSpecialRenderData.alphaFullscreen = std::stof(r); } else if (opacityIDX == 1) { m_sSpecialRenderData.alphaInactive = std::stof(r); m_sSpecialRenderData.alphaInactiveOverride = false; + } else if (opacityIDX == 2) { + m_sSpecialRenderData.alphaFullscreen = std::stof(r); + m_sSpecialRenderData.alphaFullscreenOverride = false; } else { - throw std::runtime_error("more than 2 alpha values"); + throw std::runtime_error("more than 3 alpha values"); } opacityIDX++; diff --git a/src/desktop/Window.hpp b/src/desktop/Window.hpp index ae62e77e..3001f74e 100644 --- a/src/desktop/Window.hpp +++ b/src/desktop/Window.hpp @@ -126,10 +126,12 @@ class CWindowOverridableVar { }; struct SWindowSpecialRenderData { - CWindowOverridableVar alphaOverride = false; - CWindowOverridableVar alpha = 1.f; - CWindowOverridableVar alphaInactiveOverride = false; - CWindowOverridableVar alphaInactive = -1.f; // -1 means unset + CWindowOverridableVar alphaOverride = false; + CWindowOverridableVar alpha = 1.f; + CWindowOverridableVar alphaInactiveOverride = false; + CWindowOverridableVar alphaInactive = -1.f; // -1 means unset + CWindowOverridableVar alphaFullscreenOverride = false; + CWindowOverridableVar alphaFullscreen = -1.f; // -1 means unset CWindowOverridableVar activeBorderColor = CGradientValueData(); // empty color vector means unset CWindowOverridableVar inactiveBorderColor = CGradientValueData(); // empty color vector means unset -- cgit v1.2.3