From fde569db6519b613369c863d192c67dedb386910 Mon Sep 17 00:00:00 2001 From: khushal-solves Date: Mon, 30 Dec 2024 04:41:16 +0530 Subject: [PATCH] master: replace always_center_master with slave_count_for_center_master (#8871) - Replaced boolean config parameter `always_center_master` to an integer value `slave_count_for_center_master` for more control on when to center master window. - Also updated configuration parameter, type, description and related internal variable. New description: **when using orientation=center, make the master window centered only when at least this many slave windows are open. (Set 0 to always_center_master)** This effects center orientation of master layout. Now, user can control when the master window would be centered --- src/config/ConfigDescriptions.hpp | 8 ++++---- src/config/ConfigManager.cpp | 2 +- src/layout/MasterLayout.cpp | 28 ++++++++++++++-------------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/config/ConfigDescriptions.hpp b/src/config/ConfigDescriptions.hpp index 6792a763..e1c9cb46 100644 --- a/src/config/ConfigDescriptions.hpp +++ b/src/config/ConfigDescriptions.hpp @@ -1603,10 +1603,10 @@ inline static const std::vector CONFIG_OPTIONS = { .data = SConfigOptionDescription::SBoolData{true}, }, SConfigOptionDescription{ - .value = "master:always_center_master", - .description = "when using orientation=center, keep the master window centered, even when it is the only window in the workspace.", - .type = CONFIG_OPTION_BOOL, - .data = SConfigOptionDescription::SBoolData{false}, + .value = "master:slave_count_for_center_master", + .description = "when using orientation=center, make the master window centered only when at least this many slave windows are open. (Set 0 to always_center_master)", + .type = CONFIG_OPTION_INT, + .data = SConfigOptionDescription::SRangeData{2, 0, 10}, //##TODO RANGE? }, SConfigOptionDescription{ .value = "master:center_ignores_reserved", diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 65f9cb13..0b8e68f6 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -477,7 +477,7 @@ CConfigManager::CConfigManager() { m_pConfig->addConfigValue("master:special_scale_factor", {1.f}); m_pConfig->addConfigValue("master:mfact", {0.55f}); m_pConfig->addConfigValue("master:new_status", {"slave"}); - m_pConfig->addConfigValue("master:always_center_master", Hyprlang::INT{0}); + m_pConfig->addConfigValue("master:slave_count_for_center_master", Hyprlang::INT{2}); m_pConfig->addConfigValue("master:center_ignores_reserved", Hyprlang::INT{0}); m_pConfig->addConfigValue("master:new_on_active", {"none"}); m_pConfig->addConfigValue("master:new_on_top", Hyprlang::INT{0}); diff --git a/src/layout/MasterLayout.cpp b/src/layout/MasterLayout.cpp index f4730892..05a2a707 100644 --- a/src/layout/MasterLayout.cpp +++ b/src/layout/MasterLayout.cpp @@ -325,11 +325,11 @@ void CHyprMasterLayout::calculateWorkspace(PHLWORKSPACE pWorkspace) { if (!PMASTERNODE) return; - eOrientation orientation = getDynamicOrientation(pWorkspace); - bool centerMasterWindow = false; - static auto ALWAYSCENTER = CConfigValue("master:always_center_master"); - static auto PIGNORERESERVED = CConfigValue("master:center_ignores_reserved"); - static auto PSMARTRESIZING = CConfigValue("master:smart_resizing"); + eOrientation orientation = getDynamicOrientation(pWorkspace); + bool centerMasterWindow = false; + static auto SLAVECOUNTFORCENTER = CConfigValue("master:slave_count_for_center_master"); + static auto PIGNORERESERVED = CConfigValue("master:center_ignores_reserved"); + static auto PSMARTRESIZING = CConfigValue("master:smart_resizing"); const auto MASTERS = getMastersOnWorkspace(pWorkspace->m_iID); const auto WINDOWS = getNodesOnWorkspace(pWorkspace->m_iID); @@ -338,7 +338,7 @@ void CHyprMasterLayout::calculateWorkspace(PHLWORKSPACE pWorkspace) { const auto WSPOS = PMONITOR->vecPosition + PMONITOR->vecReservedTopLeft; if (orientation == ORIENTATION_CENTER) { - if (STACKWINDOWS >= 2 || (*ALWAYSCENTER == 1)) { + if (STACKWINDOWS >= *SLAVECOUNTFORCENTER) { centerMasterWindow = true; } else { orientation = ORIENTATION_LEFT; @@ -708,13 +708,9 @@ void CHyprMasterLayout::resizeActiveWindow(const Vector2D& pixResize, eRectCorne return; } - const auto PMONITOR = PWINDOW->m_pMonitor.lock(); - static auto ALWAYSCENTER = CConfigValue("master:always_center_master"); - static auto PSMARTRESIZING = CConfigValue("master:smart_resizing"); - - eOrientation orientation = getDynamicOrientation(PWINDOW->m_pWorkspace); - bool centered = orientation == ORIENTATION_CENTER && (*ALWAYSCENTER == 1); - double delta = 0; + const auto PMONITOR = PWINDOW->m_pMonitor.lock(); + static auto SLAVECOUNTFORCENTER = CConfigValue("master:slave_count_for_center_master"); + static auto PSMARTRESIZING = CConfigValue("master:smart_resizing"); const bool DISPLAYBOTTOM = STICKS(PWINDOW->m_vPosition.y + PWINDOW->m_vSize.y, PMONITOR->vecPosition.y + PMONITOR->vecSize.y - PMONITOR->vecReservedBottomRight.y); const bool DISPLAYRIGHT = STICKS(PWINDOW->m_vPosition.x + PWINDOW->m_vSize.x, PMONITOR->vecPosition.x + PMONITOR->vecSize.x - PMONITOR->vecReservedBottomRight.x); @@ -729,6 +725,10 @@ void CHyprMasterLayout::resizeActiveWindow(const Vector2D& pixResize, eRectCorne const auto WINDOWS = getNodesOnWorkspace(PNODE->workspaceID); const auto STACKWINDOWS = WINDOWS - MASTERS; + eOrientation orientation = getDynamicOrientation(PWINDOW->m_pWorkspace); + bool centered = orientation == ORIENTATION_CENTER && (STACKWINDOWS >= *SLAVECOUNTFORCENTER); + double delta = 0; + if (getNodesOnWorkspace(PWINDOW->workspaceID()) == 1 && !centered) return; @@ -741,7 +741,7 @@ void CHyprMasterLayout::resizeActiveWindow(const Vector2D& pixResize, eRectCorne case ORIENTATION_TOP: delta = pixResize.y / PMONITOR->vecSize.y; break; case ORIENTATION_CENTER: delta = pixResize.x / PMONITOR->vecSize.x; - if (WINDOWS > 2 || *ALWAYSCENTER) { + if (STACKWINDOWS >= *SLAVECOUNTFORCENTER) { if (!NONE || !PNODE->isMaster) delta *= 2; if ((!PNODE->isMaster && DISPLAYLEFT) || (PNODE->isMaster && LEFT && *PSMARTRESIZING))