diff --git a/src/helpers/MiscFunctions.cpp b/src/helpers/MiscFunctions.cpp index 7a9c5e5e..85a81657 100644 --- a/src/helpers/MiscFunctions.cpp +++ b/src/helpers/MiscFunctions.cpp @@ -204,12 +204,12 @@ std::string removeBeginEndSpacesTabs(std::string str) { return str; } -float getPlusMinusKeywordResult(std::string source, float relative) { +std::optional getPlusMinusKeywordResult(std::string source, float relative) { try { return relative + stof(source); } catch (...) { Debug::log(ERR, "Invalid arg \"{}\" in getPlusMinusKeywordResult!", source); - return INT_MAX; + return {}; } } @@ -300,7 +300,13 @@ int getWorkspaceIDFromString(const std::string& in, std::string& outName) { Debug::log(ERR, "Relative monitor workspace on monitor null!"); return WORKSPACE_INVALID; } - result = (int)getPlusMinusKeywordResult(in.substr(1), 0); + + const auto PLUSMINUSRESULT = getPlusMinusKeywordResult(in.substr(1), 0); + + if (!PLUSMINUSRESULT.has_value()) + return WORKSPACE_INVALID; + + result = (int)PLUSMINUSRESULT.value(); int remains = (int)result; @@ -436,7 +442,12 @@ int getWorkspaceIDFromString(const std::string& in, std::string& outName) { } // monitor relative - result = (int)getPlusMinusKeywordResult(in.substr(1), 0); + const auto PLUSMINUSRESULT = getPlusMinusKeywordResult(in.substr(1), 0); + + if (!PLUSMINUSRESULT.has_value()) + return WORKSPACE_INVALID; + + result = (int)PLUSMINUSRESULT.value(); // result now has +/- what we should move on mon int remains = (int)result; @@ -477,9 +488,13 @@ int getWorkspaceIDFromString(const std::string& in, std::string& outName) { outName = g_pCompositor->getWorkspaceByID(validWSes[currentItem])->m_szName; } else { if (in[0] == '+' || in[0] == '-') { - if (g_pCompositor->m_pLastMonitor) - result = std::max((int)getPlusMinusKeywordResult(in, g_pCompositor->m_pLastMonitor->activeWorkspace), 1); - else { + if (g_pCompositor->m_pLastMonitor) { + const auto PLUSMINUSRESULT = getPlusMinusKeywordResult(in, g_pCompositor->m_pLastMonitor->activeWorkspace); + if (!PLUSMINUSRESULT.has_value()) + return WORKSPACE_INVALID; + + result = std::max((int)PLUSMINUSRESULT.value(), 1); + } else { Debug::log(ERR, "Relative workspace on no mon!"); return WORKSPACE_INVALID; } diff --git a/src/helpers/MiscFunctions.hpp b/src/helpers/MiscFunctions.hpp index b2fe5858..90479121 100644 --- a/src/helpers/MiscFunctions.hpp +++ b/src/helpers/MiscFunctions.hpp @@ -27,7 +27,7 @@ void logSystemInfo(); std::string execAndGet(const char*); int64_t getPPIDof(int64_t pid); int64_t configStringToInt(const std::string&); -float getPlusMinusKeywordResult(std::string in, float relative); +std::optional getPlusMinusKeywordResult(std::string in, float relative); void matrixProjection(float mat[9], int w, int h, wl_output_transform tr); double normalizeAngleRad(double ang); std::string replaceInString(std::string subject, const std::string& search, const std::string& replace); diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index d8307de2..553872a5 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -1216,24 +1216,16 @@ void CKeybindManager::toggleSplit(std::string args) { } void CKeybindManager::alterSplitRatio(std::string args) { - float splitratio = 0; - bool exact = false; + std::optional splitResult; + bool exact = false; - if (args == "+" || args == "-") { - Debug::log(LOG, "alterSplitRatio: using LEGACY +/-, consider switching to the Hyprland syntax."); - splitratio = (args == "+" ? 0.05f : -0.05f); - } + if (args.starts_with("exact")) { + exact = true; + splitResult = getPlusMinusKeywordResult(args.substr(5), 0); + } else + splitResult = getPlusMinusKeywordResult(args, 0); - if (splitratio == 0) { - if (args.starts_with("exact")) { - exact = true; - splitratio = getPlusMinusKeywordResult(args.substr(5), 0); - } else { - splitratio = getPlusMinusKeywordResult(args, 0); - } - } - - if (splitratio == WORKSPACE_INVALID) { + if (!splitResult.has_value()) { Debug::log(ERR, "Splitratio invalid in alterSplitRatio!"); return; } @@ -1243,7 +1235,7 @@ void CKeybindManager::alterSplitRatio(std::string args) { if (!PLASTWINDOW) return; - g_pLayoutManager->getCurrentLayout()->alterSplitRatio(PLASTWINDOW, splitratio, exact); + g_pLayoutManager->getCurrentLayout()->alterSplitRatio(PLASTWINDOW, splitResult.value(), exact); } void CKeybindManager::focusMonitor(std::string arg) {