aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAqa-Ib <[email protected]>2024-10-22 23:51:25 +0000
committerGitHub <[email protected]>2024-10-23 00:51:25 +0100
commit2b6ff6837e81a3b459f2f3cc366830c420a7a62e (patch)
treeccb75f5411c186a01b67848b0bed7cb9e4a018ba
parent29997ef4ba8ef0a80390e80199998d1390177454 (diff)
downloadHyprland-2b6ff6837e81a3b459f2f3cc366830c420a7a62e.tar.gz
Hyprland-2b6ff6837e81a3b459f2f3cc366830c420a7a62e.zip
groups: add group_on_movetoworkspace (#8159)
-rw-r--r--src/Compositor.cpp49
-rw-r--r--src/config/ConfigDescriptions.hpp6
-rw-r--r--src/config/ConfigManager.cpp1
-rw-r--r--src/layout/IHyprLayout.cpp5
4 files changed, 48 insertions, 13 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp
index b23b3194..313d57ac 100644
--- a/src/Compositor.cpp
+++ b/src/Compositor.cpp
@@ -34,6 +34,7 @@
#include "render/Renderer.hpp"
#include "xwayland/XWayland.hpp"
#include "helpers/ByteOperations.hpp"
+#include "render/decorations/CHyprGroupBarDecoration.hpp"
#include <hyprutils/string/String.hpp>
#include <aquamarine/input/Input.hpp>
@@ -2748,21 +2749,47 @@ void CCompositor::moveWindowToWorkspaceSafe(PHLWINDOW pWindow, PHLWORKSPACE pWor
if (FULLSCREEN)
setWindowFullscreenInternal(pWindow, FSMODE_NONE);
- if (!pWindow->m_bIsFloating) {
+ const PHLWINDOW pFirstWindowOnWorkspace = g_pCompositor->getFirstWindowOnWorkspace(pWorkspace->m_iID);
+ const int visibleWindowsOnWorkspace = g_pCompositor->getWindowsOnWorkspace(pWorkspace->m_iID, std::nullopt, true);
+ const auto PWINDOWMONITOR = g_pCompositor->getMonitorFromID(pWindow->m_iMonitorID);
+ const auto POSTOMON = pWindow->m_vRealPosition.goal() - PWINDOWMONITOR->vecPosition;
+ const auto PWORKSPACEMONITOR = g_pCompositor->getMonitorFromID(pWorkspace->m_iMonitorID);
+
+ if (!pWindow->m_bIsFloating)
g_pLayoutManager->getCurrentLayout()->onWindowRemovedTiling(pWindow);
- pWindow->moveToWorkspace(pWorkspace);
- pWindow->m_iMonitorID = pWorkspace->m_iMonitorID;
- g_pLayoutManager->getCurrentLayout()->onWindowCreatedTiling(pWindow);
- } else {
- const auto PWINDOWMONITOR = g_pCompositor->getMonitorFromID(pWindow->m_iMonitorID);
- const auto POSTOMON = pWindow->m_vRealPosition.goal() - PWINDOWMONITOR->vecPosition;
- const auto PWORKSPACEMONITOR = g_pCompositor->getMonitorFromID(pWorkspace->m_iMonitorID);
+ pWindow->moveToWorkspace(pWorkspace);
+ pWindow->m_iMonitorID = pWorkspace->m_iMonitorID;
- pWindow->moveToWorkspace(pWorkspace);
- pWindow->m_iMonitorID = pWorkspace->m_iMonitorID;
+ static auto PGROUPONMOVETOWORKSPACE = CConfigValue<Hyprlang::INT>("group:group_on_movetoworkspace");
+ if (*PGROUPONMOVETOWORKSPACE && visibleWindowsOnWorkspace == 1 && pFirstWindowOnWorkspace && pFirstWindowOnWorkspace != pWindow &&
+ pFirstWindowOnWorkspace->m_sGroupData.pNextWindow.lock() && pWindow->canBeGroupedInto(pFirstWindowOnWorkspace)) {
+
+ pWindow->m_bIsFloating = pFirstWindowOnWorkspace->m_bIsFloating; // match the floating state. Needed to group tiled into floated and vice versa.
+ if (!pWindow->m_sGroupData.pNextWindow.expired()) {
+ PHLWINDOW next = pWindow->m_sGroupData.pNextWindow.lock();
+ while (next != pWindow) {
+ next->m_bIsFloating = pFirstWindowOnWorkspace->m_bIsFloating; // match the floating state of group members
+ next = next->m_sGroupData.pNextWindow.lock();
+ }
+ }
+
+ static auto USECURRPOS = CConfigValue<Hyprlang::INT>("group:insert_after_current");
+ (*USECURRPOS ? pFirstWindowOnWorkspace : pFirstWindowOnWorkspace->getGroupTail())->insertWindowToGroup(pWindow);
+
+ pFirstWindowOnWorkspace->setGroupCurrent(pWindow);
+ pWindow->updateWindowDecos();
+ g_pLayoutManager->getCurrentLayout()->recalculateWindow(pWindow);
+
+ if (!pWindow->getDecorationByType(DECORATION_GROUPBAR))
+ pWindow->addWindowDeco(std::make_unique<CHyprGroupBarDecoration>(pWindow));
+
+ } else {
+ if (!pWindow->m_bIsFloating)
+ g_pLayoutManager->getCurrentLayout()->onWindowCreatedTiling(pWindow);
- pWindow->m_vRealPosition = POSTOMON + PWORKSPACEMONITOR->vecPosition;
+ if (pWindow->m_bIsFloating)
+ pWindow->m_vRealPosition = POSTOMON + PWORKSPACEMONITOR->vecPosition;
}
pWindow->updateToplevel();
diff --git a/src/config/ConfigDescriptions.hpp b/src/config/ConfigDescriptions.hpp
index 7e2dd1be..7910e865 100644
--- a/src/config/ConfigDescriptions.hpp
+++ b/src/config/ConfigDescriptions.hpp
@@ -808,6 +808,12 @@ inline static const std::vector<SConfigOptionDescription> CONFIG_OPTIONS = {
.type = CONFIG_OPTION_BOOL,
.data = SConfigOptionDescription::SBoolData{false},
},
+ SConfigOptionDescription{
+ .value = "group:group_on_movetoworkspace",
+ .description = "whether using movetoworkspace[silent] will merge the window into the workspace's solitary unlocked group",
+ .type = CONFIG_OPTION_BOOL,
+ .data = SConfigOptionDescription::SBoolData{false},
+ },
/*
* group:groupbar:
diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp
index 1dbd248d..8237fd44 100644
--- a/src/config/ConfigManager.cpp
+++ b/src/config/ConfigManager.cpp
@@ -383,6 +383,7 @@ CConfigManager::CConfigManager() {
m_pConfig->addConfigValue("group:merge_floated_into_tiled_on_groupbar", Hyprlang::INT{0});
m_pConfig->addConfigValue("group:auto_group", Hyprlang::INT{1});
m_pConfig->addConfigValue("group:drag_into_group", Hyprlang::INT{1});
+ m_pConfig->addConfigValue("group:group_on_movetoworkspace", Hyprlang::INT{0});
m_pConfig->addConfigValue("group:groupbar:enabled", Hyprlang::INT{1});
m_pConfig->addConfigValue("group:groupbar:font_family", {STRVAL_EMPTY});
m_pConfig->addConfigValue("group:groupbar:font_size", Hyprlang::INT{8});
diff --git a/src/layout/IHyprLayout.cpp b/src/layout/IHyprLayout.cpp
index 95919c65..655f2341 100644
--- a/src/layout/IHyprLayout.cpp
+++ b/src/layout/IHyprLayout.cpp
@@ -194,8 +194,9 @@ bool IHyprLayout::onWindowCreatedAutoGroup(PHLWINDOW pWindow) {
denied = true;
if (*PAUTOGROUP // check if auto_group is enabled.
- && OPENINGON->m_sGroupData.pNextWindow.lock() // check if OPENINGON is a group.
+ && OPENINGON // this shouldn't be 0, but honestly, better safe than sorry.
&& OPENINGON != pWindow // prevent freeze when the "group set" window rule makes the new window to be already a group.
+ && OPENINGON->m_sGroupData.pNextWindow.lock() // check if OPENINGON is a group.
&& pWindow->canBeGroupedInto(OPENINGON) // check if the new window can be grouped into OPENINGON.
&& !g_pXWaylandManager->shouldBeFloated(pWindow) // don't group child windows. Fix for floated groups. Tiled groups don't need this because we check if !denied.
&& !denied) { // don't group a new floated window into a tiled group (for convenience).
@@ -352,7 +353,7 @@ void IHyprLayout::onEndDragWindow() {
DRAGGINGWINDOW->m_bDraggingTiled = false;
}
- if (DRAGGINGWINDOW->m_sGroupData.pNextWindow.lock()) {
+ if (DRAGGINGWINDOW->m_sGroupData.pNextWindow) {
std::vector<PHLWINDOW> members;
PHLWINDOW curr = DRAGGINGWINDOW->getGroupHead();
do {