diff --git a/src/helpers/MiscFunctions.cpp b/src/helpers/MiscFunctions.cpp index 63751781..489fa02a 100644 --- a/src/helpers/MiscFunctions.cpp +++ b/src/helpers/MiscFunctions.cpp @@ -73,4 +73,42 @@ std::string removeBeginEndSpacesTabs(std::string str) { } return str; +} + +float getPlusMinusKeywordResult(std::string source, float relative) { + float result = INT_MAX; + + if (source.find_first_of("+") == 0) { + try { + if (source.find('.') != std::string::npos) + 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 if (source.find_first_of("-") == 0) { + try { + if (source.find('.') != std::string::npos) + 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.find('.') != std::string::npos) + result = stof(source); + else + result = stoi(source); + } catch (...) { + Debug::log(ERR, "Invalid arg \"%s\" in getPlusMinusKeywordResult!", source.c_str()); + return INT_MAX; + } + } + + return result; } \ No newline at end of file diff --git a/src/helpers/MiscFunctions.hpp b/src/helpers/MiscFunctions.hpp index 08e69e34..4fb42e12 100644 --- a/src/helpers/MiscFunctions.hpp +++ b/src/helpers/MiscFunctions.hpp @@ -6,4 +6,6 @@ void addWLSignal(wl_signal*, wl_listener*, void* pOwner, std::string ownerString void wlr_signal_emit_safe(struct wl_signal *signal, void *data); std::string getFormat(const char *fmt, ...); // Basically Debug::log to a string void scaleBox(wlr_box*, float); -std::string removeBeginEndSpacesTabs(std::string); \ No newline at end of file +std::string removeBeginEndSpacesTabs(std::string); + +float getPlusMinusKeywordResult(std::string in, float relative); \ No newline at end of file diff --git a/src/layout/DwindleLayout.cpp b/src/layout/DwindleLayout.cpp index 5b7ee165..e7f4b87a 100644 --- a/src/layout/DwindleLayout.cpp +++ b/src/layout/DwindleLayout.cpp @@ -778,4 +778,17 @@ void CHyprDwindleLayout::switchWindows(CWindow* pWindow, CWindow* pWindow2) { // recalc the workspace getMasterNodeOnWorkspace(PNODE->workspaceID)->recalcSizePosRecursive(); +} + +void CHyprDwindleLayout::alterSplitRatioBy(CWindow* pWindow, float ratio) { + // window should be valid, insallah + + const auto PNODE = getNodeFromWindow(pWindow); + + if (!PNODE || !PNODE->pParent) + return; + + PNODE->pParent->splitRatio = std::clamp(PNODE->pParent->splitRatio + ratio, 0.1f, 1.9f); + + PNODE->pParent->recalcSizePosRecursive(); } \ No newline at end of file diff --git a/src/layout/DwindleLayout.hpp b/src/layout/DwindleLayout.hpp index 68496723..7eeb5793 100644 --- a/src/layout/DwindleLayout.hpp +++ b/src/layout/DwindleLayout.hpp @@ -51,7 +51,8 @@ public: virtual void toggleWindowGroup(CWindow*); virtual void switchGroupWindow(CWindow*); virtual SWindowRenderLayoutHints requestRenderHints(CWindow*); - virtual void switchWindows(CWindow*, CWindow*); + virtual void switchWindows(CWindow*, CWindow*); + virtual void alterSplitRatioBy(CWindow*, float); private: diff --git a/src/layout/IHyprLayout.hpp b/src/layout/IHyprLayout.hpp index 341d5fbb..6d40ef03 100644 --- a/src/layout/IHyprLayout.hpp +++ b/src/layout/IHyprLayout.hpp @@ -90,4 +90,10 @@ public: The layout is free to ignore. */ virtual void switchWindows(CWindow*, CWindow*) = 0; + + /* + Called when the user requests to change the splitratio by X + on a window + */ + virtual void alterSplitRatioBy(CWindow*, float) = 0; }; \ No newline at end of file diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index 4f87e67e..69535ec8 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -62,6 +62,7 @@ bool CKeybindManager::handleKeybinds(const uint32_t& modmask, const xkb_keysym_t else if (k.handler == "movewindow") { moveActiveTo(k.arg); } else if (k.handler == "togglegroup") { toggleGroup(k.arg); } else if (k.handler == "changegroupactive") { changeGroupActive(k.arg); } + else if (k.handler == "splitratio") { alterSplitRatio(k.arg); } else { Debug::log(ERR, "Inavlid handler in a keybind! (handler %s does not exist)", k.handler.c_str()); } @@ -142,29 +143,11 @@ void CKeybindManager::toggleActivePseudo(std::string args) { } void CKeybindManager::changeworkspace(std::string args) { - int workspaceToChangeTo = 0; + int workspaceToChangeTo = std::clamp((int)getPlusMinusKeywordResult(args, g_pCompositor->m_pLastMonitor->activeWorkspace), 1, INT_MAX); - if (args.find_first_of("+") == 0) { - try { - workspaceToChangeTo = g_pCompositor->m_pLastMonitor->activeWorkspace + std::stoi(args.substr(1)); - } catch (...) { - Debug::log(ERR, "Invalid arg \"%s\" in changeWorkspace!", args.c_str()); - return; - } - } else if (args.find_first_of("-") == 0) { - try { - workspaceToChangeTo = std::clamp(g_pCompositor->m_pLastMonitor->activeWorkspace - std::stoi(args.substr(1)), 1, INT_MAX); - } catch (...) { - Debug::log(ERR, "Invalid arg \"%s\" in changeWorkspace!", args.c_str()); - return; - } - } else { - try { - workspaceToChangeTo = stoi(args); - } catch (...) { - Debug::log(ERR, "Invalid arg \"%s\" in changeWorkspace!", args.c_str()); - return; - } + if (workspaceToChangeTo == INT_MAX) { + Debug::log(ERR, "Error in changeworkspace, invalid value"); + return; } // if it exists, we warp to it @@ -359,12 +342,12 @@ void CKeybindManager::moveActiveTo(std::string args) { const auto PLASTWINDOW = g_pCompositor->m_pLastWindow; - if (!PLASTWINDOW) + if (!g_pCompositor->windowValidMapped(PLASTWINDOW)) return; const auto PWINDOWTOCHANGETO = g_pCompositor->getWindowInDirection(PLASTWINDOW, arg); - if (!PWINDOWTOCHANGETO) + if (!g_pCompositor->windowValidMapped(PWINDOWTOCHANGETO)) return; g_pLayoutManager->getCurrentLayout()->switchWindows(PLASTWINDOW, PWINDOWTOCHANGETO); @@ -376,4 +359,29 @@ void CKeybindManager::toggleGroup(std::string args) { void CKeybindManager::changeGroupActive(std::string args) { g_pLayoutManager->getCurrentLayout()->switchGroupWindow(g_pCompositor->m_pLastWindow); +} + +void CKeybindManager::alterSplitRatio(std::string args) { + float splitratio = 0; + + if (args == "+" || args == "-") { + Debug::log(LOG, "alterSplitRatio: using LEGACY +/-, consider switching to the Hyprland syntax."); + splitratio = (args == "+" ? 0.05f : -0.05f); + } + + if (splitratio == 0) { + splitratio = getPlusMinusKeywordResult(args, 0); + } + + if (splitratio == INT_MAX) { + Debug::log(ERR, "Splitratio invalid in alterSplitRatio!"); + return; + } + + const auto PLASTWINDOW = g_pCompositor->m_pLastWindow; + + if (!g_pCompositor->windowValidMapped(PLASTWINDOW)) + return; + + g_pLayoutManager->getCurrentLayout()->alterSplitRatioBy(PLASTWINDOW, splitratio); } \ No newline at end of file diff --git a/src/managers/KeybindManager.hpp b/src/managers/KeybindManager.hpp index fde9868d..30e03823 100644 --- a/src/managers/KeybindManager.hpp +++ b/src/managers/KeybindManager.hpp @@ -35,6 +35,7 @@ private: void moveActiveTo(std::string); void toggleGroup(std::string); void changeGroupActive(std::string); + void alterSplitRatio(std::string); }; inline std::unique_ptr g_pKeybindManager; \ No newline at end of file