From ff459f4a2af01e3c99ededc827b6a3edbda55965 Mon Sep 17 00:00:00 2001 From: Nikolai Nechaev Date: Fri, 17 Apr 2026 01:54:04 +0900 Subject: [PATCH] groups: fix `movewindoworgroup` when moving from group to group (#14086) * Add test for movewindowgroup * groups: Fix `movewindoworgroup` moving into group Fixes `CKeybindManager::moveWindowIntoGroup` to remove a window from a group before attempting to add it to another group. Addresses #13843. But the animation of moving a window from a group into another group now looks weird: as if the whole target group is being moved. --- hyprtester/src/tests/main/groups.cpp | 59 ++++++++++++++++++++++++++++ src/managers/KeybindManager.cpp | 2 + 2 files changed, 61 insertions(+) diff --git a/hyprtester/src/tests/main/groups.cpp b/hyprtester/src/tests/main/groups.cpp index c23899b62..86ffc7f75 100644 --- a/hyprtester/src/tests/main/groups.cpp +++ b/hyprtester/src/tests/main/groups.cpp @@ -25,6 +25,65 @@ static bool test() { NLog::log("{}Dispatching workspace `groups`", Colors::YELLOW); getFromSocket("/dispatch workspace name:groups"); + NLog::log("{}Testing movewindoworgroup from group to group", Colors::YELLOW); + auto kittyA = Tests::spawnKitty("kittyA"); + if (!kittyA) { + NLog::log("{}Error: kitty did not spawn", Colors::RED); + return false; + } + + // check kitty properties. One kitty should take the entire screen, minus the gaps. + NLog::log("{}Check kittyA dimensions", Colors::YELLOW); + { + auto str = getFromSocket("/clients"); + EXPECT_COUNT_STRING(str, "at: 22,22", 1); + EXPECT_COUNT_STRING(str, "size: 1876,1036", 1); + EXPECT_COUNT_STRING(str, "fullscreen: 0", 1); + } + + auto kittyB = Tests::spawnKitty("kittyB"); + if (!kittyB) { + NLog::log("{}Error: kitty did not spawn", Colors::RED); + return false; + } + + OK(getFromSocket("/dispatch focuswindow class:kittyB")); + OK(getFromSocket("/dispatch togglegroup")); + OK(getFromSocket("/dispatch focuswindow class:kittyA")); + OK(getFromSocket("/dispatch togglegroup")); + + NLog::log("{}Check kittyB dimensions", Colors::YELLOW); + { + auto str = getFromSocket("/activewindow"); + EXPECT_COUNT_STRING(str, "size: 931,1015", 1); + EXPECT_COUNT_STRING(str, "fullscreen: 0", 1); + } + + auto kittyC = Tests::spawnKitty("kittyC"); + if (!kittyC) { + NLog::log("{}Error: kitty did not spawn", Colors::RED); + return false; + } + + NLog::log("{}Check kittyC dimensions", Colors::YELLOW); + { + auto str = getFromSocket("/activewindow"); + EXPECT_COUNT_STRING(str, "size: 931,1015", 1); + EXPECT_COUNT_STRING(str, "fullscreen: 0", 1); + } + + OK(getFromSocket("/dispatch movewindoworgroup r")); + NLog::log("{}Check that dimensions remain the same after move", Colors::YELLOW); + { + auto str = getFromSocket("/activewindow"); + EXPECT_COUNT_STRING(str, "size: 931,1015", 1); + EXPECT_COUNT_STRING(str, "fullscreen: 0", 1); + } + + // kill all + NLog::log("{}Kill windows", Colors::YELLOW); + Tests::killAllWindows(); + NLog::log("{}Spawning kittyProcA", Colors::YELLOW); auto kittyProcA = Tests::spawnKitty(); if (!kittyProcA) { diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index 5c233ef51..d7c57baa0 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -2625,6 +2625,8 @@ void CKeybindManager::moveWindowIntoGroup(PHLWINDOW pWindow, PHLWINDOW pWindowIn pWindow->m_monitor = pWindowInDirection->m_monitor; } + if (pWindow->m_group) + pWindow->m_group->remove(pWindow); pWindowInDirection->m_group->add(pWindow); pWindowInDirection->m_group->setCurrent(pWindow);