From 1ce614dfc0eb8b323e603b76975842c1f2e6a553 Mon Sep 17 00:00:00 2001 From: CyrenArkade Date: Mon, 5 May 2025 20:54:27 -0500 Subject: [PATCH] animations: Add option for animating workspaces as if the first and last were adjacent (#10277) * add option for animating workspaces as if the first and last were adjacent * change wraparound detection to use IDs instead of dispatcher * move shouldWraparound from MiscFunctions to Monitor --- src/config/ConfigDescriptions.hpp | 6 ++++++ src/config/ConfigManager.cpp | 1 + src/helpers/Monitor.cpp | 21 ++++++++++++++++++++- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/config/ConfigDescriptions.hpp b/src/config/ConfigDescriptions.hpp index 9214772d..8fc6b04b 100644 --- a/src/config/ConfigDescriptions.hpp +++ b/src/config/ConfigDescriptions.hpp @@ -372,6 +372,12 @@ inline static const std::vector CONFIG_OPTIONS = { .type = CONFIG_OPTION_BOOL, .data = SConfigOptionDescription::SBoolData{true}, }, + SConfigOptionDescription{ + .value = "animations:workspace_wraparound", + .description = "changes the direction of slide animations between the first and last workspaces", + .type = CONFIG_OPTION_BOOL, + .data = SConfigOptionDescription::SBoolData{true}, + }, /* * input: diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 4ef39280..564ebcda 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -610,6 +610,7 @@ CConfigManager::CConfigManager() { registerConfigVar("animations:enabled", Hyprlang::INT{1}); registerConfigVar("animations:first_launch_animation", Hyprlang::INT{1}); + registerConfigVar("animations:workspace_wraparound", Hyprlang::INT{0}); registerConfigVar("input:follow_mouse", Hyprlang::INT{1}); registerConfigVar("input:follow_mouse_threshold", Hyprlang::FLOAT{0}); diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index 3cbfbf46..4dc0942d 100644 --- a/src/helpers/Monitor.cpp +++ b/src/helpers/Monitor.cpp @@ -1100,6 +1100,25 @@ float CMonitor::getDefaultScale() { return 1; } +static bool shouldWraparound(const WORKSPACEID id1, const WORKSPACEID id2) { + static auto PWORKSPACEWRAPAROUND = CConfigValue("animations:workspace_wraparound"); + + if (!*PWORKSPACEWRAPAROUND) + return false; + + WORKSPACEID lowestID = INT64_MAX; + WORKSPACEID highestID = INT64_MIN; + + for (auto const& w : g_pCompositor->m_workspaces) { + if (w->m_id < 0 || w->m_isSpecialWorkspace) + continue; + lowestID = std::min(w->m_id, lowestID); + highestID = std::max(w->m_id, highestID); + } + + return std::min(id1, id2) == lowestID && std::max(id1, id2) == highestID; +} + void CMonitor::changeWorkspace(const PHLWORKSPACE& pWorkspace, bool internal, bool noMouseMove, bool noFocus) { if (!pWorkspace) return; @@ -1123,7 +1142,7 @@ void CMonitor::changeWorkspace(const PHLWORKSPACE& pWorkspace, bool internal, bo m_activeWorkspace = pWorkspace; if (!internal) { - const auto ANIMTOLEFT = POLDWORKSPACE && pWorkspace->m_id > POLDWORKSPACE->m_id; + const auto ANIMTOLEFT = POLDWORKSPACE && (shouldWraparound(pWorkspace->m_id, POLDWORKSPACE->m_id) ^ (pWorkspace->m_id > POLDWORKSPACE->m_id)); if (POLDWORKSPACE) POLDWORKSPACE->startAnim(false, ANIMTOLEFT); pWorkspace->startAnim(true, ANIMTOLEFT);