From 7f595ed0cac2ffa154132e992c7e4902ca819a14 Mon Sep 17 00:00:00 2001 From: vaxerski Date: Sat, 31 Dec 2022 16:23:56 +0100 Subject: [PATCH] support gradients in dwindle group colors --- src/Compositor.cpp | 4 +-- src/config/ConfigManager.cpp | 10 ++++--- src/layout/DwindleLayout.cpp | 16 +++++------ src/layout/IHyprLayout.hpp | 54 ++++++++++++++++++------------------ 4 files changed, 43 insertions(+), 41 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 7d019648..bf94c1cc 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -1486,8 +1486,8 @@ void CCompositor::updateWindowAnimatedDecorationValues(CWindow* pWindow) { // border const auto RENDERDATA = g_pLayoutManager->getCurrentLayout()->requestRenderHints(pWindow); - if (RENDERDATA.isBorderColor) - setBorderColor(RENDERDATA.borderColor * (1.f / 255.f)); + if (RENDERDATA.isBorderGradient) + setBorderColor(*RENDERDATA.borderGradient); else setBorderColor( pWindow == m_pLastWindow ? diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 2ac24f6f..128ae9da 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -11,8 +11,10 @@ #include CConfigManager::CConfigManager() { - configValues["general:col.active_border"].data = std::make_shared(0xffffffff); - configValues["general:col.inactive_border"].data = std::make_shared(0xff444444); + configValues["general:col.active_border"].data = std::make_shared(0xffffffff); + configValues["general:col.inactive_border"].data = std::make_shared(0xff444444); + configValues["dwindle:col.group_border"].data = std::make_shared(0x66777700); + configValues["dwindle:col.group_border_active"].data = std::make_shared(0x66ffff00); setDefaultVars(); setDefaultAnimationVars(); @@ -94,9 +96,9 @@ void CConfigManager::setDefaultVars() { configValues["decoration:dim_around"].floatValue = 0.4f; configValues["decoration:screen_shader"].strValue = STRVAL_EMPTY; + ((CGradientValueData*)configValues["dwindle:col.group_border"].data.get())->reset(0x66777700); + ((CGradientValueData*)configValues["dwindle:col.group_border_active"].data.get())->reset(0x66ffff00); configValues["dwindle:pseudotile"].intValue = 0; - configValues["dwindle:col.group_border"].intValue = 0x66777700; - configValues["dwindle:col.group_border_active"].intValue = 0x66ffff00; configValues["dwindle:force_split"].intValue = 0; configValues["dwindle:preserve_split"].intValue = 0; configValues["dwindle:special_scale_factor"].floatValue = 0.8f; diff --git a/src/layout/DwindleLayout.cpp b/src/layout/DwindleLayout.cpp index c903a441..4ce2f66c 100644 --- a/src/layout/DwindleLayout.cpp +++ b/src/layout/DwindleLayout.cpp @@ -655,7 +655,7 @@ void CHyprDwindleLayout::resizeActiveWindow(const Vector2D& pixResize, CWindow* const bool DISPLAYBOTTOM = STICKS(PWINDOW->m_vPosition.y + PWINDOW->m_vSize.y, PMONITOR->vecPosition.y + PMONITOR->vecSize.y - PMONITOR->vecReservedBottomRight.y); // construct allowed movement - Vector2D allowedMovement = pixResize; + Vector2D allowedMovement = pixResize; if (DISPLAYLEFT && DISPLAYRIGHT) allowedMovement.x = 0; @@ -671,7 +671,7 @@ void CHyprDwindleLayout::resizeActiveWindow(const Vector2D& pixResize, CWindow* const bool PARENTSIDEBYSIDE = !PPARENT->splitTop; // Get the parent's parent - auto PPARENT2 = PPARENT->pParent; + auto PPARENT2 = PPARENT->pParent; // No parent means we have only 2 windows, and thus one axis of freedom if (!PPARENT2) { @@ -1044,20 +1044,20 @@ SWindowRenderLayoutHints CHyprDwindleLayout::requestRenderHints(CWindow* pWindow SWindowRenderLayoutHints hints; - static auto* const PGROUPCOLACTIVE = &g_pConfigManager->getConfigValuePtr("dwindle:col.group_border_active")->intValue; - static auto* const PGROUPCOLINACTIVE = &g_pConfigManager->getConfigValuePtr("dwindle:col.group_border")->intValue; + static auto* const PGROUPCOLACTIVE = &g_pConfigManager->getConfigValuePtr("dwindle:col.group_border_active")->data; + static auto* const PGROUPCOLINACTIVE = &g_pConfigManager->getConfigValuePtr("dwindle:col.group_border")->data; const auto PNODE = getNodeFromWindow(pWindow); if (!PNODE) return hints; // left for the future, maybe floating funkiness if (PNODE->isGroupMember()) { - hints.isBorderColor = true; + hints.isBorderGradient = true; if (pWindow == g_pCompositor->m_pLastWindow) - hints.borderColor = CColor(*PGROUPCOLACTIVE); + hints.borderGradient = (CGradientValueData*)PGROUPCOLACTIVE->get(); else - hints.borderColor = CColor(*PGROUPCOLINACTIVE); + hints.borderGradient = (CGradientValueData*)PGROUPCOLINACTIVE->get(); } return hints; @@ -1174,7 +1174,7 @@ void CHyprDwindleLayout::alterSplitRatio(CWindow* pWindow, float ratio, bool exa if (!PNODE || !PNODE->pParent || (PNODE->isGroupMember() && PNODE->getGroupMemberCount() == g_pCompositor->getWindowsOnWorkspace(PNODE->workspaceID))) return; - float newRatio = exact ? ratio : PNODE->pParent->splitRatio + ratio; + float newRatio = exact ? ratio : PNODE->pParent->splitRatio + ratio; PNODE->pParent->splitRatio = std::clamp(newRatio, 0.1f, 1.9f); PNODE->pParent->recalcSizePosRecursive(); diff --git a/src/layout/IHyprLayout.hpp b/src/layout/IHyprLayout.hpp index 1be26d2b..214a4927 100644 --- a/src/layout/IHyprLayout.hpp +++ b/src/layout/IHyprLayout.hpp @@ -5,8 +5,8 @@ #include struct SWindowRenderLayoutHints { - bool isBorderColor = false; - CColor borderColor; + bool isBorderGradient = false; + CGradientValueData* borderGradient; }; struct SLayoutMessageHeader { @@ -17,89 +17,89 @@ enum eFullscreenMode : uint8_t; interface IHyprLayout { public: - virtual ~IHyprLayout() = 0; - virtual void onEnable() = 0; - virtual void onDisable() = 0; + virtual ~IHyprLayout() = 0; + virtual void onEnable() = 0; + virtual void onDisable() = 0; /* Called when a window is created (mapped) The layout HAS TO set the goal pos and size (anim mgr will use it) If !animationinprogress, then the anim mgr will not apply an anim. */ - virtual void onWindowCreated(CWindow*); - virtual void onWindowCreatedTiling(CWindow*) = 0; - virtual void onWindowCreatedFloating(CWindow*); + virtual void onWindowCreated(CWindow*); + virtual void onWindowCreatedTiling(CWindow*) = 0; + virtual void onWindowCreatedFloating(CWindow*); /* Return tiled status */ - virtual bool isWindowTiled(CWindow*) = 0; + virtual bool isWindowTiled(CWindow*) = 0; /* Called when a window is removed (unmapped) */ - virtual void onWindowRemoved(CWindow*); - virtual void onWindowRemovedTiling(CWindow*) = 0; - virtual void onWindowRemovedFloating(CWindow*); + virtual void onWindowRemoved(CWindow*); + virtual void onWindowRemovedTiling(CWindow*) = 0; + virtual void onWindowRemovedFloating(CWindow*); /* Called when the monitor requires a layout recalculation this usually means reserved area changes */ - virtual void recalculateMonitor(const int&) = 0; + virtual void recalculateMonitor(const int&) = 0; /* Called when the compositor requests a window to be recalculated, e.g. when pseudo is toggled. */ - virtual void recalculateWindow(CWindow*) = 0; + virtual void recalculateWindow(CWindow*) = 0; /* Called when a window is requested to be floated */ - virtual void changeWindowFloatingMode(CWindow*); + virtual void changeWindowFloatingMode(CWindow*); /* Called when a window is clicked on, beginning a drag this might be a resize, move, whatever the layout defines it as. */ - virtual void onBeginDragWindow(); + virtual void onBeginDragWindow(); /* Called when a user requests a resize of the current window by a vec Vector2D holds pixel values Optional pWindow for a specific window */ - virtual void resizeActiveWindow(const Vector2D&, CWindow* pWindow = nullptr) = 0; + virtual void resizeActiveWindow(const Vector2D&, CWindow* pWindow = nullptr) = 0; /* Called when a user requests a move of the current window by a vec Vector2D holds pixel values Optional pWindow for a specific window */ - virtual void moveActiveWindow(const Vector2D&, CWindow* pWindow = nullptr); + virtual void moveActiveWindow(const Vector2D&, CWindow* pWindow = nullptr); /* Called when a window is ended being dragged (mouse up) */ - virtual void onEndDragWindow(); + virtual void onEndDragWindow(); /* Called whenever the mouse moves, should the layout want to do anything with it. Useful for dragging. */ - virtual void onMouseMove(const Vector2D&); + virtual void onMouseMove(const Vector2D&); /* Called when a window / the user requests to toggle the fullscreen state of a window The layout sets all the fullscreen flags. It can either accept or ignore. */ - virtual void fullscreenRequestForWindow(CWindow*, eFullscreenMode, bool) = 0; + virtual void fullscreenRequestForWindow(CWindow*, eFullscreenMode, bool) = 0; /* Called when a dispatcher requests a custom message The layout is free to ignore. std::any is the reply. Can be empty. */ - virtual std::any layoutMessage(SLayoutMessageHeader, std::string) = 0; + virtual std::any layoutMessage(SLayoutMessageHeader, std::string) = 0; /* Required to be handled, but may return just SWindowRenderLayoutHints() @@ -112,28 +112,28 @@ interface IHyprLayout { Called when the user requests two windows to be swapped places. The layout is free to ignore. */ - virtual void switchWindows(CWindow*, CWindow*) = 0; + virtual void switchWindows(CWindow*, CWindow*) = 0; /* Called when the user requests to change the splitratio by or to X on a window */ - virtual void alterSplitRatio(CWindow*, float, bool exact = false) = 0; + virtual void alterSplitRatio(CWindow*, float, bool exact = false) = 0; /* Called when something wants the current layout's name */ - virtual std::string getLayoutName() = 0; + virtual std::string getLayoutName() = 0; /* Called for getting the next candidate for a focus */ - virtual CWindow* getNextWindowCandidate(CWindow*); + virtual CWindow* getNextWindowCandidate(CWindow*); /* Internal: called when window focus changes */ - virtual void onWindowFocusChange(CWindow*); + virtual void onWindowFocusChange(CWindow*); private: Vector2D m_vBeginDragXY;