mirror of
https://github.com/hyprwm/Hyprland.git
synced 2024-12-24 08:03:36 +03:00
groups: add group_on_movetoworkspace (#8159)
This commit is contained in:
parent
29997ef4ba
commit
2b6ff6837e
@ -34,6 +34,7 @@
|
|||||||
#include "render/Renderer.hpp"
|
#include "render/Renderer.hpp"
|
||||||
#include "xwayland/XWayland.hpp"
|
#include "xwayland/XWayland.hpp"
|
||||||
#include "helpers/ByteOperations.hpp"
|
#include "helpers/ByteOperations.hpp"
|
||||||
|
#include "render/decorations/CHyprGroupBarDecoration.hpp"
|
||||||
|
|
||||||
#include <hyprutils/string/String.hpp>
|
#include <hyprutils/string/String.hpp>
|
||||||
#include <aquamarine/input/Input.hpp>
|
#include <aquamarine/input/Input.hpp>
|
||||||
@ -2748,20 +2749,46 @@ void CCompositor::moveWindowToWorkspaceSafe(PHLWINDOW pWindow, PHLWORKSPACE pWor
|
|||||||
if (FULLSCREEN)
|
if (FULLSCREEN)
|
||||||
setWindowFullscreenInternal(pWindow, FSMODE_NONE);
|
setWindowFullscreenInternal(pWindow, FSMODE_NONE);
|
||||||
|
|
||||||
if (!pWindow->m_bIsFloating) {
|
const PHLWINDOW pFirstWindowOnWorkspace = g_pCompositor->getFirstWindowOnWorkspace(pWorkspace->m_iID);
|
||||||
g_pLayoutManager->getCurrentLayout()->onWindowRemovedTiling(pWindow);
|
const int visibleWindowsOnWorkspace = g_pCompositor->getWindowsOnWorkspace(pWorkspace->m_iID, std::nullopt, true);
|
||||||
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 PWINDOWMONITOR = g_pCompositor->getMonitorFromID(pWindow->m_iMonitorID);
|
||||||
const auto POSTOMON = pWindow->m_vRealPosition.goal() - PWINDOWMONITOR->vecPosition;
|
const auto POSTOMON = pWindow->m_vRealPosition.goal() - PWINDOWMONITOR->vecPosition;
|
||||||
|
|
||||||
const auto PWORKSPACEMONITOR = g_pCompositor->getMonitorFromID(pWorkspace->m_iMonitorID);
|
const auto PWORKSPACEMONITOR = g_pCompositor->getMonitorFromID(pWorkspace->m_iMonitorID);
|
||||||
|
|
||||||
|
if (!pWindow->m_bIsFloating)
|
||||||
|
g_pLayoutManager->getCurrentLayout()->onWindowRemovedTiling(pWindow);
|
||||||
|
|
||||||
pWindow->moveToWorkspace(pWorkspace);
|
pWindow->moveToWorkspace(pWorkspace);
|
||||||
pWindow->m_iMonitorID = pWorkspace->m_iMonitorID;
|
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);
|
||||||
|
|
||||||
|
if (pWindow->m_bIsFloating)
|
||||||
pWindow->m_vRealPosition = POSTOMON + PWORKSPACEMONITOR->vecPosition;
|
pWindow->m_vRealPosition = POSTOMON + PWORKSPACEMONITOR->vecPosition;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -808,6 +808,12 @@ inline static const std::vector<SConfigOptionDescription> CONFIG_OPTIONS = {
|
|||||||
.type = CONFIG_OPTION_BOOL,
|
.type = CONFIG_OPTION_BOOL,
|
||||||
.data = SConfigOptionDescription::SBoolData{false},
|
.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:
|
* group:groupbar:
|
||||||
|
@ -383,6 +383,7 @@ CConfigManager::CConfigManager() {
|
|||||||
m_pConfig->addConfigValue("group:merge_floated_into_tiled_on_groupbar", Hyprlang::INT{0});
|
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:auto_group", Hyprlang::INT{1});
|
||||||
m_pConfig->addConfigValue("group:drag_into_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:enabled", Hyprlang::INT{1});
|
||||||
m_pConfig->addConfigValue("group:groupbar:font_family", {STRVAL_EMPTY});
|
m_pConfig->addConfigValue("group:groupbar:font_family", {STRVAL_EMPTY});
|
||||||
m_pConfig->addConfigValue("group:groupbar:font_size", Hyprlang::INT{8});
|
m_pConfig->addConfigValue("group:groupbar:font_size", Hyprlang::INT{8});
|
||||||
|
@ -194,8 +194,9 @@ bool IHyprLayout::onWindowCreatedAutoGroup(PHLWINDOW pWindow) {
|
|||||||
denied = true;
|
denied = true;
|
||||||
|
|
||||||
if (*PAUTOGROUP // check if auto_group is enabled.
|
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 != 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.
|
&& 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.
|
&& !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).
|
&& !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;
|
DRAGGINGWINDOW->m_bDraggingTiled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DRAGGINGWINDOW->m_sGroupData.pNextWindow.lock()) {
|
if (DRAGGINGWINDOW->m_sGroupData.pNextWindow) {
|
||||||
std::vector<PHLWINDOW> members;
|
std::vector<PHLWINDOW> members;
|
||||||
PHLWINDOW curr = DRAGGINGWINDOW->getGroupHead();
|
PHLWINDOW curr = DRAGGINGWINDOW->getGroupHead();
|
||||||
do {
|
do {
|
||||||
|
Loading…
Reference in New Issue
Block a user