From bdf1c1619529792e95cd6cf2aa1d68e51db76252 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Sat, 28 May 2022 20:46:20 +0200 Subject: Added IHyprWindowDecoration and Group Bars --- src/layout/DwindleLayout.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++- src/layout/DwindleLayout.hpp | 5 ++++- src/layout/IHyprLayout.hpp | 10 +++++++-- 3 files changed, 64 insertions(+), 4 deletions(-) (limited to 'src/layout') diff --git a/src/layout/DwindleLayout.cpp b/src/layout/DwindleLayout.cpp index ef312abd..0f41265b 100644 --- a/src/layout/DwindleLayout.cpp +++ b/src/layout/DwindleLayout.cpp @@ -275,6 +275,10 @@ void CHyprDwindleLayout::onWindowCreated(CWindow* pWindow) { if (OPENINGON->pGroupParent) { // means we opened on a group + + // add the group deco + pWindow->m_dWindowDecorations.emplace_back(new CHyprGroupBarDecoration(pWindow)); + PNODE->pGroupParent = OPENINGON->pGroupParent; PNODE->pGroupParent->groupMembers.push_back(PNODE); PNODE->pGroupParent->groupMemberActive = PNODE->pGroupParent->groupMembers.size() - 1; @@ -693,6 +697,10 @@ void CHyprDwindleLayout::toggleWindowGroup(CWindow* pWindow) { for (auto& node : PGROUPPARENT->groupMembers) { node->pGroupParent = nullptr; node->pWindow->m_cRealBorderColor.setValueAndWarp(INACTIVEBORDERCOL); // no anim here because they pop in + + for (auto& wd : node->pWindow->m_dWindowDecorations) { + wd->updateWindow(node->pWindow); + } } PGROUPPARENT->groupMembers.clear(); @@ -725,6 +733,8 @@ void CHyprDwindleLayout::toggleWindowGroup(CWindow* pWindow) { c->pGroupParent = PPARENT; c->pWindow->m_cRealBorderColor = GROUPINACTIVEBORDERCOL; + c->pWindow->m_dWindowDecorations.push_back(new CHyprGroupBarDecoration(c->pWindow)); + if (c->pWindow == g_pCompositor->m_pLastWindow) c->pWindow->m_cRealBorderColor = CColor(g_pConfigManager->getInt("dwindle:col.group_border_active")); } @@ -735,6 +745,31 @@ void CHyprDwindleLayout::toggleWindowGroup(CWindow* pWindow) { } } +std::deque CHyprDwindleLayout::getGroupMembers(CWindow* pWindow) { + + std::deque result; + + if (!g_pCompositor->windowExists(pWindow)) + return result; // reject with empty + + // get the node + const auto PNODE = getNodeFromWindow(pWindow); + + if (!PNODE) + return result; // reject with empty + + const auto PGROUPPARENT = PNODE->pGroupParent; + + if (!PGROUPPARENT) + return result; // reject with empty + + for (auto& node : PGROUPPARENT->groupMembers) { + result.push_back(node->pWindow); + } + + return result; +} + void CHyprDwindleLayout::switchGroupWindow(CWindow* pWindow, bool forward) { if (!g_pCompositor->windowValidMapped(pWindow)) return; // reject @@ -760,6 +795,12 @@ void CHyprDwindleLayout::switchGroupWindow(CWindow* pWindow, bool forward) { PNODE->pGroupParent->recalcSizePosRecursive(); + for (auto& gm : PNODE->pGroupParent->groupMembers) { + for (auto& deco : gm->pWindow->m_dWindowDecorations) { + deco->updateWindow(gm->pWindow); + } + } + // focus g_pCompositor->focusWindow(PNODE->pGroupParent->groupMembers[PNODE->pGroupParent->groupMemberActive]->pWindow); } @@ -850,7 +891,7 @@ void CHyprDwindleLayout::alterSplitRatioBy(CWindow* pWindow, float ratio) { PNODE->pParent->recalcSizePosRecursive(); } -void CHyprDwindleLayout::layoutMessage(SLayoutMessageHeader header, std::string message) { +std::any CHyprDwindleLayout::layoutMessage(SLayoutMessageHeader header, std::string message) { if (message == "togglegroup") toggleWindowGroup(header.pWindow); else if (message == "changegroupactivef") @@ -859,6 +900,12 @@ void CHyprDwindleLayout::layoutMessage(SLayoutMessageHeader header, std::string switchGroupWindow(header.pWindow, false); else if (message == "togglesplit") toggleSplit(header.pWindow); + else if (message == "groupinfo") { + auto res = getGroupMembers(g_pCompositor->m_pLastWindow); + return res; + } + + return ""; } void CHyprDwindleLayout::toggleSplit(CWindow* pWindow) { @@ -870,4 +917,8 @@ void CHyprDwindleLayout::toggleSplit(CWindow* pWindow) { PNODE->pParent->splitTop = !PNODE->pParent->splitTop; PNODE->pParent->recalcSizePosRecursive(); +} + +std::string CHyprDwindleLayout::getLayoutName() { + return "dwindle"; } \ No newline at end of file diff --git a/src/layout/DwindleLayout.hpp b/src/layout/DwindleLayout.hpp index 91d3a820..4abd04ef 100644 --- a/src/layout/DwindleLayout.hpp +++ b/src/layout/DwindleLayout.hpp @@ -3,6 +3,7 @@ #include "IHyprLayout.hpp" #include #include +#include "../render/decorations/CHyprGroupBarDecoration.hpp" class CHyprDwindleLayout; @@ -50,10 +51,11 @@ public: virtual void onMouseMove(const Vector2D&); virtual void onWindowCreatedFloating(CWindow*); virtual void fullscreenRequestForWindow(CWindow*); - virtual void layoutMessage(SLayoutMessageHeader, std::string); + virtual std::any layoutMessage(SLayoutMessageHeader, std::string); virtual SWindowRenderLayoutHints requestRenderHints(CWindow*); virtual void switchWindows(CWindow*, CWindow*); virtual void alterSplitRatioBy(CWindow*, float); + virtual std::string getLayoutName(); private: @@ -73,6 +75,7 @@ public: void toggleWindowGroup(CWindow*); void switchGroupWindow(CWindow*, bool forward); void toggleSplit(CWindow*); + std::deque getGroupMembers(CWindow*); friend struct SDwindleNodeData; }; \ No newline at end of file diff --git a/src/layout/IHyprLayout.hpp b/src/layout/IHyprLayout.hpp index 71f30e3d..01e3e04a 100644 --- a/src/layout/IHyprLayout.hpp +++ b/src/layout/IHyprLayout.hpp @@ -74,9 +74,10 @@ public: /* Called when a dispatcher requests a custom message - The layout is free to ignore. + The layout is free to ignore. + std::any is the reply. Can be empty. */ - virtual void layoutMessage(SLayoutMessageHeader, std::string) = 0; + virtual std::any layoutMessage(SLayoutMessageHeader, std::string) = 0; /* Required to be handled, but may return just SWindowRenderLayoutHints() @@ -96,4 +97,9 @@ public: on a window */ virtual void alterSplitRatioBy(CWindow*, float) = 0; + + /* + Called when something wants the current layout's name + */ + virtual std::string getLayoutName() = 0; }; \ No newline at end of file -- cgit v1.2.3