diff --git a/src/config/ConfigDescriptions.hpp b/src/config/ConfigDescriptions.hpp index a77cf757..98214284 100644 --- a/src/config/ConfigDescriptions.hpp +++ b/src/config/ConfigDescriptions.hpp @@ -32,6 +32,13 @@ inline static const std::vector CONFIG_OPTIONS = { .type = CONFIG_OPTION_STRING_SHORT, .data = SConfigOptionDescription::SStringData{"20"}, }, + SConfigOptionDescription{ + .value = "general:float_gaps", + .description = "gaps between windows and monitor edges for floating windows\n\nsupports css style gaps (top, right, bottom, left -> 5 10 15 20). \n-1 means default " + "gaps_in/gaps_out\n0 means no gaps", + .type = CONFIG_OPTION_STRING_SHORT, + .data = SConfigOptionDescription::SStringData{"0"}, + }, SConfigOptionDescription{ .value = "general:gaps_workspaces", .description = "gaps between workspaces. Stacks with gaps_out.", diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 8dce9f30..e2fb26ab 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -444,6 +444,7 @@ CConfigManager::CConfigManager() { registerConfigVar("general:no_border_on_floating", Hyprlang::INT{0}); registerConfigVar("general:gaps_in", Hyprlang::CConfigCustomValueType{configHandleGapSet, configHandleGapDestroy, "5"}); registerConfigVar("general:gaps_out", Hyprlang::CConfigCustomValueType{configHandleGapSet, configHandleGapDestroy, "20"}); + registerConfigVar("general:float_gaps", Hyprlang::CConfigCustomValueType{configHandleGapSet, configHandleGapDestroy, "0"}); registerConfigVar("general:gaps_workspaces", Hyprlang::INT{0}); registerConfigVar("general:no_focus_fallback", Hyprlang::INT{0}); registerConfigVar("general:resize_on_border", Hyprlang::INT{0}); @@ -1318,6 +1319,8 @@ SWorkspaceRule CConfigManager::mergeWorkspaceRules(const SWorkspaceRule& rule1, mergedRule.gapsIn = rule2.gapsIn; if (rule2.gapsOut.has_value()) mergedRule.gapsOut = rule2.gapsOut; + if (rule2.floatGaps) + mergedRule.floatGaps = rule2.floatGaps; if (rule2.borderSize.has_value()) mergedRule.borderSize = rule2.borderSize; if (rule2.noBorder.has_value()) diff --git a/src/config/ConfigManager.hpp b/src/config/ConfigManager.hpp index 5cb95bac..134292e5 100644 --- a/src/config/ConfigManager.hpp +++ b/src/config/ConfigManager.hpp @@ -36,6 +36,7 @@ struct SWorkspaceRule { bool isPersistent = false; std::optional gapsIn; std::optional gapsOut; + std::optional floatGaps = gapsOut; std::optional borderSize; std::optional decorate; std::optional noRounding; diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index 976e292d..43558d9d 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -1682,16 +1682,25 @@ SDispatchResult CKeybindManager::moveActiveTo(std::string args) { if (PLASTWINDOW->m_isFloating) { std::optional vPosx, vPosy; - const auto PMONITOR = PLASTWINDOW->m_monitor.lock(); - const auto BORDERSIZE = PLASTWINDOW->getRealBorderSize(); + const auto PMONITOR = PLASTWINDOW->m_monitor.lock(); + const auto BORDERSIZE = PLASTWINDOW->getRealBorderSize(); + static auto PGAPSCUSTOMDATA = CConfigValue("general:float_gaps"); + static auto PGAPSOUTDATA = CConfigValue("general:gaps_out"); + auto* PGAPSOUT = (CCssGapData*)PGAPSCUSTOMDATA.ptr()->getData(); + if (PGAPSOUT->m_left < 0 || PGAPSOUT->m_right < 0 || PGAPSOUT->m_top < 0 || PGAPSOUT->m_bottom < 0) + PGAPSOUT = (CCssGapData*)PGAPSOUTDATA.ptr()->getData(); switch (arg) { - case 'l': vPosx = PMONITOR->m_reservedTopLeft.x + BORDERSIZE + PMONITOR->m_position.x; break; - case 'r': vPosx = PMONITOR->m_size.x - PMONITOR->m_reservedBottomRight.x - PLASTWINDOW->m_realSize->goal().x - BORDERSIZE + PMONITOR->m_position.x; break; + case 'l': vPosx = PMONITOR->m_reservedTopLeft.x + BORDERSIZE + PMONITOR->m_position.x + PGAPSOUT->m_left; break; + case 'r': + vPosx = PMONITOR->m_size.x - PMONITOR->m_reservedBottomRight.x - PLASTWINDOW->m_realSize->goal().x - BORDERSIZE + PMONITOR->m_position.x - PGAPSOUT->m_right; + break; case 't': - case 'u': vPosy = PMONITOR->m_reservedTopLeft.y + BORDERSIZE + PMONITOR->m_position.y; break; + case 'u': vPosy = PMONITOR->m_reservedTopLeft.y + BORDERSIZE + PMONITOR->m_position.y + PGAPSOUT->m_top; break; case 'b': - case 'd': vPosy = PMONITOR->m_size.y - PMONITOR->m_reservedBottomRight.y - PLASTWINDOW->m_realSize->goal().y - BORDERSIZE + PMONITOR->m_position.y; break; + case 'd': + vPosy = PMONITOR->m_size.y - PMONITOR->m_reservedBottomRight.y - PLASTWINDOW->m_realSize->goal().y - BORDERSIZE + PMONITOR->m_position.y - PGAPSOUT->m_bottom; + break; } *PLASTWINDOW->m_realPosition = Vector2D(vPosx.value_or(PLASTWINDOW->m_realPosition->goal().x), vPosy.value_or(PLASTWINDOW->m_realPosition->goal().y));