mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-07 20:25:58 +01:00
Add bordercolor windowrule (#992)
* Add bordercolor windowrule * remove spaces form bordercolor rule + typo Co-authored-by: Jef Steelant <jef.steelant_ext@softathome.com>
This commit is contained in:
parent
1a14841a75
commit
549fdf63f6
6 changed files with 65 additions and 43 deletions
|
@ -1415,7 +1415,9 @@ void CCompositor::updateWindowAnimatedDecorationValues(CWindow* pWindow) {
|
||||||
if (RENDERDATA.isBorderColor)
|
if (RENDERDATA.isBorderColor)
|
||||||
pWindow->m_cRealBorderColor = RENDERDATA.borderColor;
|
pWindow->m_cRealBorderColor = RENDERDATA.borderColor;
|
||||||
else
|
else
|
||||||
pWindow->m_cRealBorderColor = CColor(pWindow == m_pLastWindow ? *ACTIVECOL : *INACTIVECOL);
|
pWindow->m_cRealBorderColor = CColor(pWindow == m_pLastWindow ?
|
||||||
|
(pWindow->m_sSpecialRenderData.activeBorderColor >= 0 ? pWindow->m_sSpecialRenderData.activeBorderColor : *ACTIVECOL) :
|
||||||
|
(pWindow->m_sSpecialRenderData.inactiveBorderColor >= 0 ? pWindow->m_sSpecialRenderData.inactiveBorderColor : *INACTIVECOL));
|
||||||
|
|
||||||
|
|
||||||
// opacity
|
// opacity
|
||||||
|
|
|
@ -18,6 +18,9 @@ struct SWindowSpecialRenderData {
|
||||||
float alpha = 1.f;
|
float alpha = 1.f;
|
||||||
float alphaInactive = -1.f; // -1 means unset
|
float alphaInactive = -1.f; // -1 means unset
|
||||||
|
|
||||||
|
int64_t activeBorderColor = -1; // -1 means unset
|
||||||
|
int64_t inactiveBorderColor = -1; // -1 means unset
|
||||||
|
|
||||||
// set by the layout
|
// set by the layout
|
||||||
bool rounding = true;
|
bool rounding = true;
|
||||||
bool border = true;
|
bool border = true;
|
||||||
|
|
|
@ -312,45 +312,10 @@ void CConfigManager::configSetValueSafe(const std::string& COMMAND, const std::s
|
||||||
|
|
||||||
if (CONFIGENTRY->intValue != -INT64_MAX) {
|
if (CONFIGENTRY->intValue != -INT64_MAX) {
|
||||||
try {
|
try {
|
||||||
if (VALUE.find("0x") == 0) {
|
CONFIGENTRY->intValue = configStringToInt(VALUE);
|
||||||
// Values with 0x are hex
|
} catch (std::exception& e) {
|
||||||
const auto VALUEWITHOUTHEX = VALUE.substr(2);
|
|
||||||
CONFIGENTRY->intValue = stol(VALUEWITHOUTHEX, nullptr, 16);
|
|
||||||
} else if (VALUE.find("rgba(") == 0 && VALUE.find(")") == VALUE.length() - 1) {
|
|
||||||
const auto VALUEWITHOUTFUNC = VALUE.substr(5, VALUE.length() - 6);
|
|
||||||
|
|
||||||
if (removeBeginEndSpacesTabs(VALUEWITHOUTFUNC).length() != 8) {
|
|
||||||
Debug::log(WARN, "invalid length %i for rgba", VALUEWITHOUTFUNC.length());
|
|
||||||
parseError = "rgba() expects length of 8 characters (4 bytes)";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto RGBA = std::stol(VALUEWITHOUTFUNC, nullptr, 16);
|
|
||||||
|
|
||||||
// now we need to RGBA -> ARGB. The config holds ARGB only.
|
|
||||||
CONFIGENTRY->intValue = (RGBA >> 8) + 0x1000000 * (RGBA & 0xFF);
|
|
||||||
} else if (VALUE.find("rgb(") == 0 && VALUE.find(")") == VALUE.length() - 1) {
|
|
||||||
const auto VALUEWITHOUTFUNC = VALUE.substr(4, VALUE.length() - 5);
|
|
||||||
|
|
||||||
if (removeBeginEndSpacesTabs(VALUEWITHOUTFUNC).length() != 6) {
|
|
||||||
Debug::log(WARN, "invalid length %i for rgb", VALUEWITHOUTFUNC.length());
|
|
||||||
parseError = "rgb() expects length of 6 characters (3 bytes)";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto RGB = std::stol(VALUEWITHOUTFUNC, nullptr, 16);
|
|
||||||
|
|
||||||
CONFIGENTRY->intValue = RGB + 0xFF000000; // 0xFF for opaque
|
|
||||||
} else if (VALUE.find("true") == 0 || VALUE.find("on") == 0 || VALUE.find("yes") == 0) {
|
|
||||||
CONFIGENTRY->intValue = 1;
|
|
||||||
} else if (VALUE.find("false") == 0 || VALUE.find("off") == 0 || VALUE.find("no") == 0) {
|
|
||||||
CONFIGENTRY->intValue = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
CONFIGENTRY->intValue = stol(VALUE);
|
|
||||||
} catch (...) {
|
|
||||||
Debug::log(WARN, "Error reading value of %s", COMMAND.c_str());
|
Debug::log(WARN, "Error reading value of %s", COMMAND.c_str());
|
||||||
parseError = "Error setting value <" + VALUE + "> for field <" + COMMAND + ">.";
|
parseError = "Error setting value <" + VALUE + "> for field <" + COMMAND + ">. " + e.what();
|
||||||
}
|
}
|
||||||
} else if (CONFIGENTRY->floatValue != -__FLT_MAX__) {
|
} else if (CONFIGENTRY->floatValue != -__FLT_MAX__) {
|
||||||
try {
|
try {
|
||||||
|
@ -717,7 +682,8 @@ bool windowRuleValid(const std::string& RULE) {
|
||||||
&& RULE != "windowdance"
|
&& RULE != "windowdance"
|
||||||
&& RULE.find("animation") != 0
|
&& RULE.find("animation") != 0
|
||||||
&& RULE.find("rounding") != 0
|
&& RULE.find("rounding") != 0
|
||||||
&& RULE.find("workspace") != 0);
|
&& RULE.find("workspace") != 0
|
||||||
|
&& RULE.find("bordercolor") != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CConfigManager::handleWindowRule(const std::string& command, const std::string& value) {
|
void CConfigManager::handleWindowRule(const std::string& command, const std::string& value) {
|
||||||
|
|
|
@ -187,10 +187,10 @@ void Events::listener_mapWindow(void* owner, void* data) {
|
||||||
}
|
}
|
||||||
} else if (r.szRule.find("opacity") == 0) {
|
} else if (r.szRule.find("opacity") == 0) {
|
||||||
try {
|
try {
|
||||||
std::string alphaPart = r.szRule.substr(r.szRule.find_first_of(' ') + 1);
|
std::string alphaPart = removeBeginEndSpacesTabs(r.szRule.substr(r.szRule.find_first_of(' ') + 1));
|
||||||
|
|
||||||
if (alphaPart.contains(' ')) {
|
if (alphaPart.contains(' ')) {
|
||||||
// we have a comma, 2 values
|
// we have a space, 2 values
|
||||||
PWINDOW->m_sSpecialRenderData.alpha = std::stof(alphaPart.substr(0, alphaPart.find_first_of(' ')));
|
PWINDOW->m_sSpecialRenderData.alpha = std::stof(alphaPart.substr(0, alphaPart.find_first_of(' ')));
|
||||||
PWINDOW->m_sSpecialRenderData.alphaInactive = std::stof(alphaPart.substr(alphaPart.find_first_of(' ') + 1));
|
PWINDOW->m_sSpecialRenderData.alphaInactive = std::stof(alphaPart.substr(alphaPart.find_first_of(' ') + 1));
|
||||||
} else {
|
} else {
|
||||||
|
@ -216,6 +216,20 @@ void Events::listener_mapWindow(void* owner, void* data) {
|
||||||
} else {
|
} else {
|
||||||
Debug::log(ERR, "Rule idleinhibit: unknown mode %s", IDLERULE.c_str());
|
Debug::log(ERR, "Rule idleinhibit: unknown mode %s", IDLERULE.c_str());
|
||||||
}
|
}
|
||||||
|
} else if (r.szRule.find("bordercolor") == 0) {
|
||||||
|
try {
|
||||||
|
std::string colorPart = removeBeginEndSpacesTabs(r.szRule.substr(r.szRule.find_first_of(' ') + 1));
|
||||||
|
|
||||||
|
if (colorPart.contains(' ')) {
|
||||||
|
// we have a space, 2 values
|
||||||
|
PWINDOW->m_sSpecialRenderData.activeBorderColor = configStringToInt(colorPart.substr(0, colorPart.find_first_of(' ')));
|
||||||
|
PWINDOW->m_sSpecialRenderData.inactiveBorderColor = configStringToInt(colorPart.substr(colorPart.find_first_of(' ') + 1));
|
||||||
|
} else {
|
||||||
|
PWINDOW->m_sSpecialRenderData.activeBorderColor = configStringToInt(colorPart);
|
||||||
|
}
|
||||||
|
} catch(std::exception& e) {
|
||||||
|
Debug::log(ERR, "BorderColor rule \"%s\" failed with: %s", r.szRule.c_str(), e.what());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -450,3 +450,39 @@ int64_t getPPIDof(int64_t pid) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t configStringToInt(const std::string& VALUE) {
|
||||||
|
if (VALUE.find("0x") == 0) {
|
||||||
|
// Values with 0x are hex
|
||||||
|
const auto VALUEWITHOUTHEX = VALUE.substr(2);
|
||||||
|
return stol(VALUEWITHOUTHEX, nullptr, 16);
|
||||||
|
} else if (VALUE.find("rgba(") == 0 && VALUE.find(")") == VALUE.length() - 1) {
|
||||||
|
const auto VALUEWITHOUTFUNC = VALUE.substr(5, VALUE.length() - 6);
|
||||||
|
|
||||||
|
if (removeBeginEndSpacesTabs(VALUEWITHOUTFUNC).length() != 8) {
|
||||||
|
Debug::log(WARN, "invalid length %i for rgba", VALUEWITHOUTFUNC.length());
|
||||||
|
throw std::invalid_argument("rgba() expects length of 8 characters (4 bytes)");
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto RGBA = std::stol(VALUEWITHOUTFUNC, nullptr, 16);
|
||||||
|
|
||||||
|
// now we need to RGBA -> ARGB. The config holds ARGB only.
|
||||||
|
return (RGBA >> 8) + 0x1000000 * (RGBA & 0xFF);
|
||||||
|
} else if (VALUE.find("rgb(") == 0 && VALUE.find(")") == VALUE.length() - 1) {
|
||||||
|
const auto VALUEWITHOUTFUNC = VALUE.substr(4, VALUE.length() - 5);
|
||||||
|
|
||||||
|
if (removeBeginEndSpacesTabs(VALUEWITHOUTFUNC).length() != 6) {
|
||||||
|
Debug::log(WARN, "invalid length %i for rgb", VALUEWITHOUTFUNC.length());
|
||||||
|
throw std::invalid_argument("rgb() expects length of 6 characters (3 bytes)");
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto RGB = std::stol(VALUEWITHOUTFUNC, nullptr, 16);
|
||||||
|
|
||||||
|
return RGB + 0xFF000000; // 0xFF for opaque
|
||||||
|
} else if (VALUE.find("true") == 0 || VALUE.find("on") == 0 || VALUE.find("yes") == 0) {
|
||||||
|
return 1;
|
||||||
|
} else if (VALUE.find("false") == 0 || VALUE.find("off") == 0 || VALUE.find("no") == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return stol(VALUE);
|
||||||
|
}
|
|
@ -15,6 +15,7 @@ float vecToRectDistanceSquared(const Vector2D& vec, const Vector2D& p1, const Ve
|
||||||
void logSystemInfo();
|
void logSystemInfo();
|
||||||
std::string execAndGet(const char*);
|
std::string execAndGet(const char*);
|
||||||
int64_t getPPIDof(int64_t pid);
|
int64_t getPPIDof(int64_t pid);
|
||||||
|
int64_t configStringToInt(const std::string&);
|
||||||
|
|
||||||
float getPlusMinusKeywordResult(std::string in, float relative);
|
float getPlusMinusKeywordResult(std::string in, float relative);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue