mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-09 15:45:57 +01:00
internal: create canBeGroupedInto() (#3693)
modified: src/Window.cpp modified: src/Window.hpp modified: src/layout/DwindleLayout.cpp modified: src/layout/MasterLayout.cpp modified: src/render/decorations/CHyprGroupBarDecoration.cpp
This commit is contained in:
parent
cb6cfde6e8
commit
a1924ae435
5 changed files with 18 additions and 28 deletions
|
@ -767,6 +767,15 @@ int CWindow::getGroupSize() {
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CWindow::canBeGroupedInto(CWindow* pWindow) {
|
||||||
|
return !g_pKeybindManager->m_bGroupsLocked // global group lock disengaged
|
||||||
|
&& ((m_eGroupRules & GROUP_INVADE && m_bFirstMap) // window ignore local group locks, or
|
||||||
|
|| (!pWindow->getGroupHead()->m_sGroupData.locked // target unlocked
|
||||||
|
&& !(m_sGroupData.pNextWindow && getGroupHead()->m_sGroupData.locked))) // source unlocked or isn't group
|
||||||
|
&& !m_sGroupData.deny // source is not denied entry
|
||||||
|
&& !(m_eGroupRules & GROUP_BARRED && m_bFirstMap); // group rule doesn't prevent adding window
|
||||||
|
}
|
||||||
|
|
||||||
CWindow* CWindow::getGroupWindowByIndex(int index) {
|
CWindow* CWindow::getGroupWindowByIndex(int index) {
|
||||||
const int SIZE = getGroupSize();
|
const int SIZE = getGroupSize();
|
||||||
index = ((index % SIZE) + SIZE) % SIZE;
|
index = ((index % SIZE) + SIZE) % SIZE;
|
||||||
|
|
|
@ -11,16 +11,14 @@
|
||||||
#include "macros.hpp"
|
#include "macros.hpp"
|
||||||
#include "managers/XWaylandManager.hpp"
|
#include "managers/XWaylandManager.hpp"
|
||||||
|
|
||||||
enum eIdleInhibitMode
|
enum eIdleInhibitMode {
|
||||||
{
|
|
||||||
IDLEINHIBIT_NONE = 0,
|
IDLEINHIBIT_NONE = 0,
|
||||||
IDLEINHIBIT_ALWAYS,
|
IDLEINHIBIT_ALWAYS,
|
||||||
IDLEINHIBIT_FULLSCREEN,
|
IDLEINHIBIT_FULLSCREEN,
|
||||||
IDLEINHIBIT_FOCUS
|
IDLEINHIBIT_FOCUS
|
||||||
};
|
};
|
||||||
|
|
||||||
enum eGroupRules
|
enum eGroupRules {
|
||||||
{
|
|
||||||
// effective only during first map, except for _ALWAYS variant
|
// effective only during first map, except for _ALWAYS variant
|
||||||
GROUP_NONE = 0,
|
GROUP_NONE = 0,
|
||||||
GROUP_SET = 1 << 0, // Open as new group or add to focused group
|
GROUP_SET = 1 << 0, // Open as new group or add to focused group
|
||||||
|
@ -379,6 +377,7 @@ class CWindow {
|
||||||
CWindow* getGroupPrevious();
|
CWindow* getGroupPrevious();
|
||||||
CWindow* getGroupWindowByIndex(int);
|
CWindow* getGroupWindowByIndex(int);
|
||||||
int getGroupSize();
|
int getGroupSize();
|
||||||
|
bool canBeGroupedInto(CWindow* pWindow);
|
||||||
void setGroupCurrent(CWindow* pWindow);
|
void setGroupCurrent(CWindow* pWindow);
|
||||||
void insertWindowToGroup(CWindow* pWindow);
|
void insertWindowToGroup(CWindow* pWindow);
|
||||||
void updateGroupOutputs();
|
void updateGroupOutputs();
|
||||||
|
@ -428,4 +427,4 @@ struct std::formatter<CWindow*, CharT> : std::formatter<CharT> {
|
||||||
std::format_to(out, ", class: {}", g_pXWaylandManager->getAppIDClass(w));
|
std::format_to(out, ", class: {}", g_pXWaylandManager->getAppIDClass(w));
|
||||||
return std::format_to(out, "]");
|
return std::format_to(out, "]");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -326,15 +326,8 @@ void CHyprDwindleLayout::onWindowCreatedTiling(CWindow* pWindow, eDirection dire
|
||||||
}
|
}
|
||||||
|
|
||||||
// if it's a group, add the window
|
// if it's a group, add the window
|
||||||
if (OPENINGON->pWindow->m_sGroupData.pNextWindow // target is group
|
if (OPENINGON->pWindow->m_sGroupData.pNextWindow // target is group
|
||||||
&& !g_pKeybindManager->m_bGroupsLocked // global group lock disengaged
|
&& pWindow->canBeGroupedInto(OPENINGON->pWindow) && !m_vOverrideFocalPoint) { // we are not moving window
|
||||||
&& ((pWindow->m_eGroupRules & GROUP_INVADE && pWindow->m_bFirstMap) // window ignore local group locks, or
|
|
||||||
|| (!OPENINGON->pWindow->getGroupHead()->m_sGroupData.locked // target unlocked
|
|
||||||
&& !(pWindow->m_sGroupData.pNextWindow && pWindow->getGroupHead()->m_sGroupData.locked))) // source unlocked or isn't group
|
|
||||||
&& !pWindow->m_sGroupData.deny // source is not denied entry
|
|
||||||
&& !(pWindow->m_eGroupRules & GROUP_BARRED && pWindow->m_bFirstMap) // group rule doesn't prevent adding window
|
|
||||||
&& !m_vOverrideFocalPoint // we are not moving window
|
|
||||||
) {
|
|
||||||
if (!pWindow->m_sGroupData.pNextWindow)
|
if (!pWindow->m_sGroupData.pNextWindow)
|
||||||
pWindow->m_dWindowDecorations.emplace_back(std::make_unique<CHyprGroupBarDecoration>(pWindow));
|
pWindow->m_dWindowDecorations.emplace_back(std::make_unique<CHyprGroupBarDecoration>(pWindow));
|
||||||
|
|
||||||
|
|
|
@ -108,14 +108,8 @@ void CHyprMasterLayout::onWindowCreatedTiling(CWindow* pWindow, eDirection direc
|
||||||
}
|
}
|
||||||
|
|
||||||
// if it's a group, add the window
|
// if it's a group, add the window
|
||||||
if (OPENINGON && OPENINGON != PNODE && OPENINGON->pWindow->m_sGroupData.pNextWindow // target is group
|
if (OPENINGON && OPENINGON != PNODE && OPENINGON->pWindow->m_sGroupData.pNextWindow // target is group
|
||||||
&& !g_pKeybindManager->m_bGroupsLocked // global group lock disengaged
|
&& pWindow->canBeGroupedInto(OPENINGON->pWindow)) {
|
||||||
&& ((pWindow->m_eGroupRules & GROUP_INVADE && pWindow->m_bFirstMap) // window ignore local group locks, or
|
|
||||||
|| (!OPENINGON->pWindow->getGroupHead()->m_sGroupData.locked // target unlocked
|
|
||||||
&& !(pWindow->m_sGroupData.pNextWindow && pWindow->getGroupHead()->m_sGroupData.locked))) // source unlocked or isn't group
|
|
||||||
&& !pWindow->m_sGroupData.deny // source is not denied entry
|
|
||||||
&& !(pWindow->m_eGroupRules & GROUP_BARRED) // group rule doesn't prevent adding window
|
|
||||||
) {
|
|
||||||
|
|
||||||
if (!pWindow->m_sGroupData.pNextWindow)
|
if (!pWindow->m_sGroupData.pNextWindow)
|
||||||
pWindow->m_dWindowDecorations.emplace_back(std::make_unique<CHyprGroupBarDecoration>(pWindow));
|
pWindow->m_dWindowDecorations.emplace_back(std::make_unique<CHyprGroupBarDecoration>(pWindow));
|
||||||
|
|
|
@ -307,12 +307,7 @@ bool CHyprGroupBarDecoration::allowsInput() {
|
||||||
|
|
||||||
bool CHyprGroupBarDecoration::onEndWindowDragOnDeco(CWindow* pDraggedWindow, const Vector2D& pos) {
|
bool CHyprGroupBarDecoration::onEndWindowDragOnDeco(CWindow* pDraggedWindow, const Vector2D& pos) {
|
||||||
|
|
||||||
if (!(!g_pKeybindManager->m_bGroupsLocked // global group lock disengaged
|
if (!pDraggedWindow->canBeGroupedInto(m_pWindow))
|
||||||
&& ((pDraggedWindow->m_eGroupRules & GROUP_INVADE && pDraggedWindow->m_bFirstMap) // window ignore local group locks, or
|
|
||||||
|| (!m_pWindow->getGroupHead()->m_sGroupData.locked // target unlocked
|
|
||||||
&& !(pDraggedWindow->m_sGroupData.pNextWindow && pDraggedWindow->getGroupHead()->m_sGroupData.locked))) // source unlocked or isn't group
|
|
||||||
&& !pDraggedWindow->m_sGroupData.deny // source is not denied entry
|
|
||||||
&& !(pDraggedWindow->m_eGroupRules & GROUP_BARRED && pDraggedWindow->m_bFirstMap))) // group rule doesn't prevent adding window
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
const float BARRELATIVEX = pos.x - m_vLastWindowPos.x - m_fBarWidth / 2;
|
const float BARRELATIVEX = pos.x - m_vLastWindowPos.x - m_fBarWidth / 2;
|
||||||
|
|
Loading…
Reference in a new issue