mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-26 22:45:59 +01:00
config: Add border gradients to windowrulev2 (#4335)
* Add border gradients to windowrulev2 * windowrule border gradient: Use CVarList to parse * windowrule border gradient: No {} around short ifs
This commit is contained in:
parent
13d9a637d6
commit
b6516bad02
5 changed files with 50 additions and 23 deletions
|
@ -1884,15 +1884,13 @@ void CCompositor::updateWindowAnimatedDecorationValues(CWindow* pWindow) {
|
||||||
if (pWindow == m_pLastWindow) {
|
if (pWindow == m_pLastWindow) {
|
||||||
const auto* const ACTIVECOLOR =
|
const auto* const ACTIVECOLOR =
|
||||||
!pWindow->m_sGroupData.pNextWindow ? (!pWindow->m_sGroupData.deny ? ACTIVECOL : NOGROUPACTIVECOL) : (GROUPLOCKED ? GROUPACTIVELOCKEDCOL : GROUPACTIVECOL);
|
!pWindow->m_sGroupData.pNextWindow ? (!pWindow->m_sGroupData.deny ? ACTIVECOL : NOGROUPACTIVECOL) : (GROUPLOCKED ? GROUPACTIVELOCKEDCOL : GROUPACTIVECOL);
|
||||||
setBorderColor(pWindow->m_sSpecialRenderData.activeBorderColor.toUnderlying() >= 0 ?
|
setBorderColor(pWindow->m_sSpecialRenderData.activeBorderColor.toUnderlying().m_vColors.empty() ? *ACTIVECOLOR :
|
||||||
CGradientValueData(CColor(pWindow->m_sSpecialRenderData.activeBorderColor.toUnderlying())) :
|
pWindow->m_sSpecialRenderData.activeBorderColor.toUnderlying());
|
||||||
*ACTIVECOLOR);
|
|
||||||
} else {
|
} else {
|
||||||
const auto* const INACTIVECOLOR =
|
const auto* const INACTIVECOLOR =
|
||||||
!pWindow->m_sGroupData.pNextWindow ? (!pWindow->m_sGroupData.deny ? INACTIVECOL : NOGROUPINACTIVECOL) : (GROUPLOCKED ? GROUPINACTIVELOCKEDCOL : GROUPINACTIVECOL);
|
!pWindow->m_sGroupData.pNextWindow ? (!pWindow->m_sGroupData.deny ? INACTIVECOL : NOGROUPINACTIVECOL) : (GROUPLOCKED ? GROUPINACTIVELOCKEDCOL : GROUPINACTIVECOL);
|
||||||
setBorderColor(pWindow->m_sSpecialRenderData.inactiveBorderColor.toUnderlying() >= 0 ?
|
setBorderColor(pWindow->m_sSpecialRenderData.inactiveBorderColor.toUnderlying().m_vColors.empty() ? *INACTIVECOLOR :
|
||||||
CGradientValueData(CColor(pWindow->m_sSpecialRenderData.inactiveBorderColor.toUnderlying())) :
|
pWindow->m_sSpecialRenderData.inactiveBorderColor.toUnderlying());
|
||||||
*INACTIVECOLOR);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -614,14 +614,42 @@ void CWindow::applyDynamicRule(const SWindowRule& r) {
|
||||||
m_sAdditionalConfigData.animationStyle = STYLE;
|
m_sAdditionalConfigData.animationStyle = STYLE;
|
||||||
} else if (r.szRule.starts_with("bordercolor")) {
|
} else if (r.szRule.starts_with("bordercolor")) {
|
||||||
try {
|
try {
|
||||||
std::string colorPart = removeBeginEndSpacesTabs(r.szRule.substr(r.szRule.find_first_of(' ') + 1));
|
// Each vector will only get used if it has at least one color
|
||||||
|
CGradientValueData activeBorderGradient = {};
|
||||||
|
CGradientValueData inactiveBorderGradient = {};
|
||||||
|
bool active = true;
|
||||||
|
CVarList colorsAndAngles = CVarList(removeBeginEndSpacesTabs(r.szRule.substr(r.szRule.find_first_of(' ') + 1)), 0, 's', true);
|
||||||
|
|
||||||
if (colorPart.contains(' ')) {
|
// Basic form has only two colors, everything else can be parsed as a gradient
|
||||||
// we have a space, 2 values
|
if (colorsAndAngles.size() == 2 && !colorsAndAngles[1].contains("deg")) {
|
||||||
m_sSpecialRenderData.activeBorderColor = configStringToInt(colorPart.substr(0, colorPart.find_first_of(' ')));
|
m_sSpecialRenderData.activeBorderColor = CGradientValueData(CColor(configStringToInt(colorsAndAngles[0])));
|
||||||
m_sSpecialRenderData.inactiveBorderColor = configStringToInt(colorPart.substr(colorPart.find_first_of(' ') + 1));
|
m_sSpecialRenderData.inactiveBorderColor = CGradientValueData(CColor(configStringToInt(colorsAndAngles[1])));
|
||||||
} else {
|
return;
|
||||||
m_sSpecialRenderData.activeBorderColor = configStringToInt(colorPart);
|
}
|
||||||
|
|
||||||
|
for (auto& token : colorsAndAngles) {
|
||||||
|
// The first angle, or an explicit "0deg", splits the two gradients
|
||||||
|
if (active && token.contains("deg")) {
|
||||||
|
activeBorderGradient.m_fAngle = std::stoi(token.substr(0, token.size() - 3)) * (PI / 180.0);
|
||||||
|
active = false;
|
||||||
|
} else if (token.contains("deg"))
|
||||||
|
inactiveBorderGradient.m_fAngle = std::stoi(token.substr(0, token.size() - 3)) * (PI / 180.0);
|
||||||
|
else if (active)
|
||||||
|
activeBorderGradient.m_vColors.push_back(configStringToInt(token));
|
||||||
|
else
|
||||||
|
inactiveBorderGradient.m_vColors.push_back(configStringToInt(token));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Includes sanity checks for the number of colors in each gradient
|
||||||
|
if (activeBorderGradient.m_vColors.size() > 10 || inactiveBorderGradient.m_vColors.size() > 10)
|
||||||
|
Debug::log(WARN, "Bordercolor rule \"{}\" has more than 10 colors in one gradient, ignoring", r.szRule);
|
||||||
|
else if (activeBorderGradient.m_vColors.empty())
|
||||||
|
Debug::log(WARN, "Bordercolor rule \"{}\" has no colors, ignoring", r.szRule);
|
||||||
|
else if (inactiveBorderGradient.m_vColors.empty())
|
||||||
|
m_sSpecialRenderData.activeBorderColor = activeBorderGradient;
|
||||||
|
else {
|
||||||
|
m_sSpecialRenderData.activeBorderColor = activeBorderGradient;
|
||||||
|
m_sSpecialRenderData.inactiveBorderColor = inactiveBorderGradient;
|
||||||
}
|
}
|
||||||
} catch (std::exception& e) { Debug::log(ERR, "BorderColor rule \"{}\" failed with: {}", r.szRule, e.what()); }
|
} catch (std::exception& e) { Debug::log(ERR, "BorderColor rule \"{}\" failed with: {}", r.szRule, e.what()); }
|
||||||
} else if (r.szRule == "dimaround") {
|
} else if (r.szRule == "dimaround") {
|
||||||
|
@ -651,8 +679,8 @@ void CWindow::applyDynamicRule(const SWindowRule& r) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWindow::updateDynamicRules() {
|
void CWindow::updateDynamicRules() {
|
||||||
m_sSpecialRenderData.activeBorderColor = -1;
|
m_sSpecialRenderData.activeBorderColor = CGradientValueData();
|
||||||
m_sSpecialRenderData.inactiveBorderColor = -1;
|
m_sSpecialRenderData.inactiveBorderColor = CGradientValueData();
|
||||||
m_sSpecialRenderData.alpha = 1.f;
|
m_sSpecialRenderData.alpha = 1.f;
|
||||||
m_sSpecialRenderData.alphaInactive = -1.f;
|
m_sSpecialRenderData.alphaInactive = -1.f;
|
||||||
m_sAdditionalConfigData.forceNoBlur = false;
|
m_sAdditionalConfigData.forceNoBlur = false;
|
||||||
|
|
|
@ -106,13 +106,13 @@ class CWindowOverridableVar {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SWindowSpecialRenderData {
|
struct SWindowSpecialRenderData {
|
||||||
CWindowOverridableVar<bool> alphaOverride = false;
|
CWindowOverridableVar<bool> alphaOverride = false;
|
||||||
CWindowOverridableVar<float> alpha = 1.f;
|
CWindowOverridableVar<float> alpha = 1.f;
|
||||||
CWindowOverridableVar<bool> alphaInactiveOverride = false;
|
CWindowOverridableVar<bool> alphaInactiveOverride = false;
|
||||||
CWindowOverridableVar<float> alphaInactive = -1.f; // -1 means unset
|
CWindowOverridableVar<float> alphaInactive = -1.f; // -1 means unset
|
||||||
|
|
||||||
CWindowOverridableVar<int64_t> activeBorderColor = -1; // -1 means unset
|
CWindowOverridableVar<CGradientValueData> activeBorderColor = CGradientValueData(); // empty color vector means unset
|
||||||
CWindowOverridableVar<int64_t> inactiveBorderColor = -1; // -1 means unset
|
CWindowOverridableVar<CGradientValueData> inactiveBorderColor = CGradientValueData(); // empty color vector means unset
|
||||||
|
|
||||||
// set by the layout
|
// set by the layout
|
||||||
CWindowOverridableVar<int> borderSize = -1; // -1 means unset
|
CWindowOverridableVar<int> borderSize = -1; // -1 means unset
|
||||||
|
|
|
@ -16,6 +16,7 @@ class ICustomConfigValueData {
|
||||||
|
|
||||||
class CGradientValueData : public ICustomConfigValueData {
|
class CGradientValueData : public ICustomConfigValueData {
|
||||||
public:
|
public:
|
||||||
|
CGradientValueData(){};
|
||||||
CGradientValueData(CColor col) {
|
CGradientValueData(CColor col) {
|
||||||
m_vColors.push_back(col);
|
m_vColors.push_back(col);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1138,9 +1138,9 @@ std::string dispatchSetProp(std::string request) {
|
||||||
} else if (PROP == "alphainactive") {
|
} else if (PROP == "alphainactive") {
|
||||||
PWINDOW->m_sSpecialRenderData.alphaInactive.forceSetIgnoreLocked(std::stof(VAL), lock);
|
PWINDOW->m_sSpecialRenderData.alphaInactive.forceSetIgnoreLocked(std::stof(VAL), lock);
|
||||||
} else if (PROP == "activebordercolor") {
|
} else if (PROP == "activebordercolor") {
|
||||||
PWINDOW->m_sSpecialRenderData.activeBorderColor.forceSetIgnoreLocked(configStringToInt(VAL), lock);
|
PWINDOW->m_sSpecialRenderData.activeBorderColor.forceSetIgnoreLocked(CGradientValueData(CColor(configStringToInt(VAL))), lock);
|
||||||
} else if (PROP == "inactivebordercolor") {
|
} else if (PROP == "inactivebordercolor") {
|
||||||
PWINDOW->m_sSpecialRenderData.inactiveBorderColor.forceSetIgnoreLocked(configStringToInt(VAL), lock);
|
PWINDOW->m_sSpecialRenderData.inactiveBorderColor.forceSetIgnoreLocked(CGradientValueData(CColor(configStringToInt(VAL))), lock);
|
||||||
} else if (PROP == "forcergbx") {
|
} else if (PROP == "forcergbx") {
|
||||||
PWINDOW->m_sAdditionalConfigData.forceRGBX.forceSetIgnoreLocked(configStringToInt(VAL), lock);
|
PWINDOW->m_sAdditionalConfigData.forceRGBX.forceSetIgnoreLocked(configStringToInt(VAL), lock);
|
||||||
} else if (PROP == "bordersize") {
|
} else if (PROP == "bordersize") {
|
||||||
|
|
Loading…
Reference in a new issue