hyprland-plugins/borders-plus-plus/borderDeco.cpp

146 lines
5.9 KiB
C++
Raw Normal View History

2023-02-27 16:24:28 +01:00
#include "borderDeco.hpp"
2023-02-27 20:54:53 +01:00
#include <hyprland/src/Compositor.hpp>
#include <hyprland/src/Window.hpp>
2023-02-27 16:24:28 +01:00
2023-02-27 20:54:53 +01:00
#include "globals.hpp"
2023-10-10 21:13:15 +02:00
CBordersPlusPlus::CBordersPlusPlus(CWindow* pWindow) : IHyprWindowDecoration(pWindow), m_pWindow(pWindow) {
2023-02-28 13:06:21 +01:00
m_vLastWindowPos = pWindow->m_vRealPosition.vec();
2023-02-27 16:24:28 +01:00
m_vLastWindowSize = pWindow->m_vRealSize.vec();
}
2023-02-28 13:06:21 +01:00
CBordersPlusPlus::~CBordersPlusPlus() {
damageEntire();
}
2023-02-27 16:24:28 +01:00
2023-11-11 15:39:46 +01:00
SDecorationPositioningInfo CBordersPlusPlus::getPositioningInfo() {
2024-02-18 16:30:21 +01:00
static auto* const PBORDERS = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:borders-plus-plus:add_borders")->getDataStaticPtr();
2023-11-11 15:39:46 +01:00
2024-02-18 16:30:21 +01:00
static std::vector<Hyprlang::INT* const*> PSIZES;
2023-11-11 15:39:46 +01:00
for (size_t i = 0; i < 9; ++i) {
2024-02-18 16:30:21 +01:00
PSIZES.push_back((Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:borders-plus-plus:border_size_" + std::to_string(i + 1))->getDataStaticPtr());
2023-11-11 15:39:46 +01:00
}
SDecorationPositioningInfo info;
info.policy = DECORATION_POSITION_ABSOLUTE;
info.reserved = true;
info.priority = 9990;
2023-11-11 15:39:46 +01:00
info.edges = DECORATION_EDGE_BOTTOM | DECORATION_EDGE_LEFT | DECORATION_EDGE_RIGHT | DECORATION_EDGE_TOP;
if (m_fLastThickness == 0) {
double size = 0;
2024-02-18 16:30:21 +01:00
for (size_t i = 0; i < **PBORDERS; ++i) {
size += **PSIZES[i];
2023-11-11 15:39:46 +01:00
}
info.desiredExtents = {{size, size}, {size, size}};
m_fLastThickness = size;
} else {
info.desiredExtents = {{m_fLastThickness, m_fLastThickness}, {m_fLastThickness, m_fLastThickness}};
}
return info;
}
void CBordersPlusPlus::onPositioningReply(const SDecorationPositioningReply& reply) {
; // ignored
2023-02-28 13:06:21 +01:00
}
2023-02-27 16:24:28 +01:00
2023-11-11 15:39:46 +01:00
uint64_t CBordersPlusPlus::getDecorationFlags() {
return 0;
}
eDecorationLayer CBordersPlusPlus::getDecorationLayer() {
return DECORATION_LAYER_OVER;
}
std::string CBordersPlusPlus::getDisplayName() {
return "Borders++";
}
2023-02-27 16:24:28 +01:00
void CBordersPlusPlus::draw(CMonitor* pMonitor, float a, const Vector2D& offset) {
2023-02-28 13:06:21 +01:00
if (!g_pCompositor->windowValidMapped(m_pWindow))
return;
2023-02-27 16:24:28 +01:00
2023-02-28 13:06:21 +01:00
if (!m_pWindow->m_sSpecialRenderData.decorate)
return;
2023-02-27 16:24:28 +01:00
2024-02-18 16:30:21 +01:00
static std::vector<Hyprlang::INT* const*> PCOLORS;
static std::vector<Hyprlang::INT* const*> PSIZES;
for (size_t i = 0; i < 9; ++i) {
2024-02-18 16:30:21 +01:00
PCOLORS.push_back((Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:borders-plus-plus:col.border_" + std::to_string(i + 1))->getDataStaticPtr());
PSIZES.push_back((Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:borders-plus-plus:border_size_" + std::to_string(i + 1))->getDataStaticPtr());
}
2024-02-18 16:30:21 +01:00
static auto* const PBORDERS = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:borders-plus-plus:add_borders")->getDataStaticPtr();
static auto* const PNATURALROUND = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:borders-plus-plus:natural_rounding")->getDataStaticPtr();
static auto* const PROUNDING = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, "decoration:rounding")->getDataStaticPtr();
static auto* const PBORDERSIZE = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, "general:border_size")->getDataStaticPtr();
2023-02-27 16:24:28 +01:00
2024-02-18 16:30:21 +01:00
if (**PBORDERS < 1)
2023-02-28 13:06:21 +01:00
return;
2023-02-27 16:24:28 +01:00
const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(m_pWindow->m_iWorkspaceID);
const auto WORKSPACEOFFSET = PWORKSPACE && !m_pWindow->m_bPinned ? PWORKSPACE->m_vRenderOffset.vec() : Vector2D();
2024-02-18 16:30:21 +01:00
auto rounding = m_pWindow->rounding() == 0 ? 0 : m_pWindow->rounding() * pMonitor->scale + **PBORDERSIZE;
const auto ORIGINALROUND = rounding == 0 ? 0 : m_pWindow->rounding() * pMonitor->scale + **PBORDERSIZE;
2023-11-04 18:25:00 +01:00
CBox fullBox = {m_vLastWindowPos.x, m_vLastWindowPos.y, m_vLastWindowSize.x, m_vLastWindowSize.y};
2023-02-27 16:24:28 +01:00
fullBox.translate(offset - pMonitor->vecPosition + WORKSPACEOFFSET).scale(pMonitor->scale);
2023-02-27 16:24:28 +01:00
double fullThickness = 0;
2023-02-27 16:24:28 +01:00
2024-02-18 16:30:21 +01:00
fullBox.x -= **PBORDERSIZE * pMonitor->scale;
fullBox.y -= **PBORDERSIZE * pMonitor->scale;
fullBox.width += **PBORDERSIZE * 2 * pMonitor->scale;
fullBox.height += **PBORDERSIZE * 2 * pMonitor->scale;
2023-02-27 16:24:28 +01:00
2024-02-18 16:30:21 +01:00
for (size_t i = 0; i < **PBORDERS; ++i) {
const int PREVBORDERSIZESCALED = i == 0 ? 0 : (**PSIZES[i - 1] == -1 ? **PBORDERSIZE : **(PSIZES[i - 1])) * pMonitor->scale;
const int THISBORDERSIZE = **(PSIZES[i]) == -1 ? **PBORDERSIZE : (**PSIZES[i]);
2023-02-27 16:24:28 +01:00
if (i != 0) {
rounding += rounding == 0 ? 0 : PREVBORDERSIZESCALED / pMonitor->scale;
fullBox.x -= PREVBORDERSIZESCALED;
fullBox.y -= PREVBORDERSIZESCALED;
fullBox.width += PREVBORDERSIZESCALED * 2;
fullBox.height += PREVBORDERSIZESCALED * 2;
}
2023-02-27 16:24:28 +01:00
if (fullBox.width < 1 || fullBox.height < 1)
break;
2023-02-27 16:24:28 +01:00
2023-11-04 18:25:00 +01:00
g_pHyprOpenGL->scissor((CBox*)nullptr);
2023-02-27 16:24:28 +01:00
2024-02-18 16:30:21 +01:00
g_pHyprOpenGL->renderBorder(&fullBox, CColor{(uint64_t) * *PCOLORS[i]}, **PNATURALROUND ? ORIGINALROUND : rounding, THISBORDERSIZE, a,
**PNATURALROUND ? ORIGINALROUND : -1);
2023-02-27 16:24:28 +01:00
fullThickness += THISBORDERSIZE;
}
2023-02-27 16:24:28 +01:00
m_seExtents = {{fullThickness, fullThickness}, {fullThickness, fullThickness}};
2023-11-11 15:39:46 +01:00
if (fullThickness != m_fLastThickness) {
m_fLastThickness = fullThickness;
g_pDecorationPositioner->repositionDeco(this);
}
2023-02-27 16:24:28 +01:00
}
2023-02-28 13:06:21 +01:00
eDecorationType CBordersPlusPlus::getDecorationType() {
return DECORATION_CUSTOM;
}
2023-02-27 16:24:28 +01:00
void CBordersPlusPlus::updateWindow(CWindow* pWindow) {
m_vLastWindowPos = pWindow->m_vRealPosition.vec();
2023-02-27 16:24:28 +01:00
m_vLastWindowSize = pWindow->m_vRealSize.vec();
damageEntire();
}
void CBordersPlusPlus::damageEntire() {
2023-11-04 18:25:00 +01:00
CBox dm = {(int)(m_vLastWindowPos.x - m_seExtents.topLeft.x), (int)(m_vLastWindowPos.y - m_seExtents.topLeft.y),
(int)(m_vLastWindowSize.x + m_seExtents.topLeft.x + m_seExtents.bottomRight.x), (int)m_seExtents.topLeft.y};
2023-02-27 16:24:28 +01:00
g_pHyprRenderer->damageBox(&dm);
}