diff options
| author | memchr <118117622+memchr@users.noreply.github.com> | 2023-06-09 21:44:18 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-06-09 23:44:18 +0200 |
| commit | bca3068db224d76b2da3f792efe4d0cb8cd2fe3e (patch) | |
| tree | ad65b8486745efa24faca33dfe2ecaadd5451937 /src/layout | |
| parent | cf37922d4285689990a648bc02aecb90a07a36ba (diff) | |
feat: add lockactivegroup dispatcher (#2478)
* feat: add lockactivegroup dispatcher
The `lockactivewindow` dispatcher takes `lock`, `toggle` or `unlock` as arguments. When a group is locked, no window or group can be added to it, nor can it be added to another group, but the `moveintogroup` and `moveoutofgroup` dispatches are not affected.
Implementation details:
the lock is implement via `SGroupData.locked` flag (defaults to false).
The flag is only relevant to the group head, and upon the group head's succession, the flag will be passed down to the new head. Meanwhile, the old head's flag will be set to false.
The flag is set to false when a group is dismissed.
New condition checks have been added to the dwindle and master layout to check if target group is unlocked (and if the source is also a group and unlocked) before adding windows to the target group.
* refactor: `lockactivegroup dispatcher code ordering
Diffstat (limited to 'src/layout')
| -rw-r--r-- | src/layout/DwindleLayout.cpp | 4 | ||||
| -rw-r--r-- | src/layout/IHyprLayout.cpp | 2 | ||||
| -rw-r--r-- | src/layout/MasterLayout.cpp | 4 |
3 files changed, 8 insertions, 2 deletions
diff --git a/src/layout/DwindleLayout.cpp b/src/layout/DwindleLayout.cpp index 5db9d771..3d16cb12 100644 --- a/src/layout/DwindleLayout.cpp +++ b/src/layout/DwindleLayout.cpp @@ -311,7 +311,9 @@ void CHyprDwindleLayout::onWindowCreatedTiling(CWindow* pWindow) { } // if it's a group, add the window - if (OPENINGON->pWindow->m_sGroupData.pNextWindow && !g_pKeybindManager->m_bGroupsLocked) { + if (OPENINGON->pWindow->m_sGroupData.pNextWindow && !OPENINGON->pWindow->getGroupHead()->m_sGroupData.locked && // target is an unlocked group + (!pWindow->m_sGroupData.pNextWindow || !pWindow->getGroupHead()->m_sGroupData.locked) // source is not group or is a unlocked group + && !g_pKeybindManager->m_bGroupsLocked) { m_lDwindleNodesData.remove(*PNODE); OPENINGON->pWindow->insertWindowToGroup(pWindow); diff --git a/src/layout/IHyprLayout.cpp b/src/layout/IHyprLayout.cpp index b5663b69..8f256630 100644 --- a/src/layout/IHyprLayout.cpp +++ b/src/layout/IHyprLayout.cpp @@ -45,6 +45,8 @@ void IHyprLayout::onWindowRemoved(CWindow* pWindow) { if (pWindow->m_sGroupData.head) { pWindow->m_sGroupData.head = false; curr->m_sGroupData.head = true; + curr->m_sGroupData.locked = pWindow->m_sGroupData.locked; + pWindow->m_sGroupData.locked = false; } if (pWindow == m_pLastTiledWindow) diff --git a/src/layout/MasterLayout.cpp b/src/layout/MasterLayout.cpp index 8f208fdb..494fd7a2 100644 --- a/src/layout/MasterLayout.cpp +++ b/src/layout/MasterLayout.cpp @@ -91,7 +91,9 @@ void CHyprMasterLayout::onWindowCreatedTiling(CWindow* pWindow) { getNodeFromWindow(g_pCompositor->m_pLastWindow) : getMasterNodeOnWorkspace(pWindow->m_iWorkspaceID); - if (OPENINGON && OPENINGON->pWindow->m_sGroupData.pNextWindow && OPENINGON != PNODE && !g_pKeybindManager->m_bGroupsLocked) { + if (OPENINGON && OPENINGON->pWindow->m_sGroupData.pNextWindow && !OPENINGON->pWindow->getGroupHead()->m_sGroupData.locked && // target is an unlocked group + (!pWindow->m_sGroupData.pNextWindow || !pWindow->getGroupHead()->m_sGroupData.locked) // source is not group or is an unlocked group + && OPENINGON != PNODE && !g_pKeybindManager->m_bGroupsLocked) { m_lMasterNodesData.remove(*PNODE); OPENINGON->pWindow->insertWindowToGroup(pWindow); |
