Add 'exact' option for 'splitratio' (#1245)

* Simplify getPlusMinusKeywordResult()

* Add an 'exact' option for 'splitratio'
This commit is contained in:
Julian Schuler 2022-12-17 23:37:44 +01:00 committed by GitHub
parent 0f3214714f
commit 2daabfa0e9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 57 additions and 78 deletions

View file

@ -162,41 +162,12 @@ std::string removeBeginEndSpacesTabs(std::string str) {
} }
float getPlusMinusKeywordResult(std::string source, float relative) { float getPlusMinusKeywordResult(std::string source, float relative) {
float result = INT_MAX;
if (source[0] == '+') {
try { try {
if (source.contains('.')) return relative + stof(source);
result = relative + std::stof(source.substr(1));
else
result = relative + std::stoi(source.substr(1));
} catch (...) { } catch (...) {
Debug::log(ERR, "Invalid arg \"%s\" in getPlusMinusKeywordResult!", source.c_str()); Debug::log(ERR, "Invalid arg \"%s\" in getPlusMinusKeywordResult!", source.c_str());
return INT_MAX; return INT_MAX;
} }
} else if (source[0] == '-') {
try {
if (source.contains('.'))
result = relative - std::stof(source.substr(1));
else
result = relative - std::stoi(source.substr(1));
} catch (...) {
Debug::log(ERR, "Invalid arg \"%s\" in getPlusMinusKeywordResult!", source.c_str());
return INT_MAX;
}
} else {
try {
if (source.contains('.'))
result = stof(source);
else
result = stoi(source);
} catch (...) {
Debug::log(ERR, "Invalid arg \"%s\" in getPlusMinusKeywordResult!", source.c_str());
return INT_MAX;
}
}
return result;
} }
bool isNumber(const std::string& str, bool allowfloat) { bool isNumber(const std::string& str, bool allowfloat) {

View file

@ -1166,7 +1166,7 @@ void CHyprDwindleLayout::switchWindows(CWindow* pWindow, CWindow* pWindow2) {
g_pHyprRenderer->damageWindow(pWindow2); g_pHyprRenderer->damageWindow(pWindow2);
} }
void CHyprDwindleLayout::alterSplitRatioBy(CWindow* pWindow, float ratio) { void CHyprDwindleLayout::alterSplitRatio(CWindow* pWindow, float ratio, bool exact) {
// window should be valid, insallah // window should be valid, insallah
const auto PNODE = getNodeFromWindow(pWindow); const auto PNODE = getNodeFromWindow(pWindow);
@ -1174,7 +1174,8 @@ void CHyprDwindleLayout::alterSplitRatioBy(CWindow* pWindow, float ratio) {
if (!PNODE || !PNODE->pParent || (PNODE->isGroupMember() && PNODE->getGroupMemberCount() == g_pCompositor->getWindowsOnWorkspace(PNODE->workspaceID))) if (!PNODE || !PNODE->pParent || (PNODE->isGroupMember() && PNODE->getGroupMemberCount() == g_pCompositor->getWindowsOnWorkspace(PNODE->workspaceID)))
return; return;
PNODE->pParent->splitRatio = std::clamp(PNODE->pParent->splitRatio + ratio, 0.1f, 1.9f); float newRatio = exact ? ratio : PNODE->pParent->splitRatio + ratio;
PNODE->pParent->splitRatio = std::clamp(newRatio, 0.1f, 1.9f);
PNODE->pParent->recalcSizePosRecursive(); PNODE->pParent->recalcSizePosRecursive();
} }

View file

@ -60,7 +60,7 @@ class CHyprDwindleLayout : public IHyprLayout {
virtual std::any layoutMessage(SLayoutMessageHeader, std::string); virtual std::any layoutMessage(SLayoutMessageHeader, std::string);
virtual SWindowRenderLayoutHints requestRenderHints(CWindow*); virtual SWindowRenderLayoutHints requestRenderHints(CWindow*);
virtual void switchWindows(CWindow*, CWindow*); virtual void switchWindows(CWindow*, CWindow*);
virtual void alterSplitRatioBy(CWindow*, float); virtual void alterSplitRatio(CWindow*, float, bool);
virtual std::string getLayoutName(); virtual std::string getLayoutName();
virtual void onEnable(); virtual void onEnable();

View file

@ -115,10 +115,10 @@ interface IHyprLayout {
virtual void switchWindows(CWindow*, CWindow*) = 0; virtual void switchWindows(CWindow*, CWindow*) = 0;
/* /*
Called when the user requests to change the splitratio by X Called when the user requests to change the splitratio by or to X
on a window on a window
*/ */
virtual void alterSplitRatioBy(CWindow*, float) = 0; virtual void alterSplitRatio(CWindow*, float, bool exact = false) = 0;
/* /*
Called when something wants the current layout's name Called when something wants the current layout's name

View file

@ -604,7 +604,7 @@ void CHyprMasterLayout::switchWindows(CWindow* pWindow, CWindow* pWindow2) {
prepareNewFocus(pWindow2, inheritFullscreen); prepareNewFocus(pWindow2, inheritFullscreen);
} }
void CHyprMasterLayout::alterSplitRatioBy(CWindow* pWindow, float ratio) { void CHyprMasterLayout::alterSplitRatio(CWindow* pWindow, float ratio, bool exact) {
// window should be valid, insallah // window should be valid, insallah
const auto PNODE = getNodeFromWindow(pWindow); const auto PNODE = getNodeFromWindow(pWindow);
@ -614,7 +614,8 @@ void CHyprMasterLayout::alterSplitRatioBy(CWindow* pWindow, float ratio) {
const auto PMASTER = getMasterNodeOnWorkspace(pWindow->m_iWorkspaceID); const auto PMASTER = getMasterNodeOnWorkspace(pWindow->m_iWorkspaceID);
PMASTER->percMaster = std::clamp(PMASTER->percMaster + ratio, 0.05f, 0.95f); float newRatio = exact ? ratio : PMASTER->percMaster + ratio;
PMASTER->percMaster = std::clamp(newRatio, 0.05f, 0.95f);
recalculateMonitor(pWindow->m_iMonitorID); recalculateMonitor(pWindow->m_iMonitorID);
} }

View file

@ -56,7 +56,7 @@ class CHyprMasterLayout : public IHyprLayout {
virtual std::any layoutMessage(SLayoutMessageHeader, std::string); virtual std::any layoutMessage(SLayoutMessageHeader, std::string);
virtual SWindowRenderLayoutHints requestRenderHints(CWindow*); virtual SWindowRenderLayoutHints requestRenderHints(CWindow*);
virtual void switchWindows(CWindow*, CWindow*); virtual void switchWindows(CWindow*, CWindow*);
virtual void alterSplitRatioBy(CWindow*, float); virtual void alterSplitRatio(CWindow*, float, bool);
virtual std::string getLayoutName(); virtual std::string getLayoutName();
virtual void onEnable(); virtual void onEnable();

View file

@ -1152,6 +1152,7 @@ void CKeybindManager::toggleSplit(std::string args) {
void CKeybindManager::alterSplitRatio(std::string args) { void CKeybindManager::alterSplitRatio(std::string args) {
float splitratio = 0; float splitratio = 0;
bool exact = false;
if (args == "+" || args == "-") { if (args == "+" || args == "-") {
Debug::log(LOG, "alterSplitRatio: using LEGACY +/-, consider switching to the Hyprland syntax."); Debug::log(LOG, "alterSplitRatio: using LEGACY +/-, consider switching to the Hyprland syntax.");
@ -1159,8 +1160,13 @@ void CKeybindManager::alterSplitRatio(std::string args) {
} }
if (splitratio == 0) { if (splitratio == 0) {
if (args.find("exact") == 0) {
exact = true;
splitratio = getPlusMinusKeywordResult(args.substr(5), 0);
} else {
splitratio = getPlusMinusKeywordResult(args, 0); splitratio = getPlusMinusKeywordResult(args, 0);
} }
}
if (splitratio == INT_MAX) { if (splitratio == INT_MAX) {
Debug::log(ERR, "Splitratio invalid in alterSplitRatio!"); Debug::log(ERR, "Splitratio invalid in alterSplitRatio!");
@ -1172,7 +1178,7 @@ void CKeybindManager::alterSplitRatio(std::string args) {
if (!PLASTWINDOW) if (!PLASTWINDOW)
return; return;
g_pLayoutManager->getCurrentLayout()->alterSplitRatioBy(PLASTWINDOW, splitratio); g_pLayoutManager->getCurrentLayout()->alterSplitRatio(PLASTWINDOW, splitratio, exact);
} }
void CKeybindManager::focusMonitor(std::string arg) { void CKeybindManager::focusMonitor(std::string arg) {