mirror of
https://github.com/hyprwm/hyprland-plugins.git
synced 2024-11-22 10:35:58 +01:00
all: update for hyprland#3800
This commit is contained in:
parent
344e5a145e
commit
2cc193e6dc
9 changed files with 149 additions and 96 deletions
|
@ -14,12 +14,46 @@ CBordersPlusPlus::~CBordersPlusPlus() {
|
||||||
damageEntire();
|
damageEntire();
|
||||||
}
|
}
|
||||||
|
|
||||||
SWindowDecorationExtents CBordersPlusPlus::getWindowDecorationExtents() {
|
SDecorationPositioningInfo CBordersPlusPlus::getPositioningInfo() {
|
||||||
return m_seExtents;
|
static auto* const PBORDERS = &HyprlandAPI::getConfigValue(PHANDLE, "plugin:borders-plus-plus:add_borders")->intValue;
|
||||||
|
|
||||||
|
static std::vector<int64_t*> PSIZES;
|
||||||
|
for (size_t i = 0; i < 9; ++i) {
|
||||||
|
PSIZES.push_back(&HyprlandAPI::getConfigValue(PHANDLE, "plugin:borders-plus-plus:border_size_" + std::to_string(i + 1))->intValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDecorationPositioningInfo info;
|
||||||
|
info.policy = DECORATION_POSITION_ABSOLUTE;
|
||||||
|
info.reserved = true;
|
||||||
|
info.priority = 1005;
|
||||||
|
info.edges = DECORATION_EDGE_BOTTOM | DECORATION_EDGE_LEFT | DECORATION_EDGE_RIGHT | DECORATION_EDGE_TOP;
|
||||||
|
|
||||||
|
if (m_fLastThickness == 0) {
|
||||||
|
double size = 0;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < *PBORDERS; ++i) {
|
||||||
|
size += *PSIZES[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
info.desiredExtents = {{size, size}, {size, size}};
|
||||||
|
m_fLastThickness = size;
|
||||||
|
} else {
|
||||||
|
info.desiredExtents = {{m_fLastThickness, m_fLastThickness}, {m_fLastThickness, m_fLastThickness}};
|
||||||
|
}
|
||||||
|
|
||||||
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
SWindowDecorationExtents CBordersPlusPlus::getWindowDecorationReservedArea() {
|
void CBordersPlusPlus::onPositioningReply(const SDecorationPositioningReply& reply) {
|
||||||
return m_seExtents;
|
; // ignored
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t CBordersPlusPlus::getDecorationFlags() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
eDecorationLayer CBordersPlusPlus::getDecorationLayer() {
|
||||||
|
return DECORATION_LAYER_OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBordersPlusPlus::draw(CMonitor* pMonitor, float a, const Vector2D& offset) {
|
void CBordersPlusPlus::draw(CMonitor* pMonitor, float a, const Vector2D& offset) {
|
||||||
|
@ -83,6 +117,11 @@ void CBordersPlusPlus::draw(CMonitor* pMonitor, float a, const Vector2D& offset)
|
||||||
}
|
}
|
||||||
|
|
||||||
m_seExtents = {{fullThickness, fullThickness}, {fullThickness, fullThickness}};
|
m_seExtents = {{fullThickness, fullThickness}, {fullThickness, fullThickness}};
|
||||||
|
|
||||||
|
if (fullThickness != m_fLastThickness) {
|
||||||
|
m_fLastThickness = fullThickness;
|
||||||
|
g_pDecorationPositioner->repositionDeco(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
eDecorationType CBordersPlusPlus::getDecorationType() {
|
eDecorationType CBordersPlusPlus::getDecorationType() {
|
||||||
|
|
|
@ -9,17 +9,21 @@ class CBordersPlusPlus : public IHyprWindowDecoration {
|
||||||
CBordersPlusPlus(CWindow*);
|
CBordersPlusPlus(CWindow*);
|
||||||
virtual ~CBordersPlusPlus();
|
virtual ~CBordersPlusPlus();
|
||||||
|
|
||||||
virtual SWindowDecorationExtents getWindowDecorationExtents();
|
virtual SDecorationPositioningInfo getPositioningInfo();
|
||||||
|
|
||||||
virtual void draw(CMonitor*, float a, const Vector2D& offset);
|
virtual void onPositioningReply(const SDecorationPositioningReply& reply);
|
||||||
|
|
||||||
virtual eDecorationType getDecorationType();
|
virtual void draw(CMonitor*, float a, const Vector2D& offset);
|
||||||
|
|
||||||
virtual void updateWindow(CWindow*);
|
virtual eDecorationType getDecorationType();
|
||||||
|
|
||||||
virtual void damageEntire();
|
virtual void updateWindow(CWindow*);
|
||||||
|
|
||||||
virtual SWindowDecorationExtents getWindowDecorationReservedArea();
|
virtual void damageEntire();
|
||||||
|
|
||||||
|
virtual uint64_t getDecorationFlags();
|
||||||
|
|
||||||
|
virtual eDecorationLayer getDecorationLayer();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SWindowDecorationExtents m_seExtents;
|
SWindowDecorationExtents m_seExtents;
|
||||||
|
@ -28,4 +32,6 @@ class CBordersPlusPlus : public IHyprWindowDecoration {
|
||||||
|
|
||||||
Vector2D m_vLastWindowPos;
|
Vector2D m_vLastWindowPos;
|
||||||
Vector2D m_vLastWindowSize;
|
Vector2D m_vLastWindowSize;
|
||||||
|
|
||||||
|
double m_fLastThickness = 0;
|
||||||
};
|
};
|
|
@ -19,7 +19,7 @@ void onNewWindow(void* self, std::any data) {
|
||||||
// data is guaranteed
|
// data is guaranteed
|
||||||
auto* const PWINDOW = std::any_cast<CWindow*>(data);
|
auto* const PWINDOW = std::any_cast<CWindow*>(data);
|
||||||
|
|
||||||
HyprlandAPI::addWindowDecoration(PHANDLE, PWINDOW, new CBordersPlusPlus(PWINDOW));
|
HyprlandAPI::addWindowDecoration(PHANDLE, PWINDOW, std::make_unique<CBordersPlusPlus>(PWINDOW));
|
||||||
}
|
}
|
||||||
|
|
||||||
APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
|
APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
|
||||||
|
@ -41,6 +41,8 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
|
||||||
HyprlandAPI::addConfigValue(PHANDLE, "plugin:borders-plus-plus:border_size_" + std::to_string(i + 1), SConfigValue{.intValue = -1});
|
HyprlandAPI::addConfigValue(PHANDLE, "plugin:borders-plus-plus:border_size_" + std::to_string(i + 1), SConfigValue{.intValue = -1});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HyprlandAPI::reloadConfig();
|
||||||
|
|
||||||
HyprlandAPI::registerCallbackDynamic(PHANDLE, "openWindow", [&](void* self, SCallbackInfo& info, std::any data) { onNewWindow(self, data); });
|
HyprlandAPI::registerCallbackDynamic(PHANDLE, "openWindow", [&](void* self, SCallbackInfo& info, std::any data) { onNewWindow(self, data); });
|
||||||
|
|
||||||
// add deco to existing windows
|
// add deco to existing windows
|
||||||
|
@ -48,11 +50,9 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
|
||||||
if (w->isHidden() || !w->m_bIsMapped)
|
if (w->isHidden() || !w->m_bIsMapped)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
HyprlandAPI::addWindowDecoration(PHANDLE, w.get(), new CBordersPlusPlus(w.get()));
|
HyprlandAPI::addWindowDecoration(PHANDLE, w.get(), std::make_unique<CBordersPlusPlus>(w.get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
HyprlandAPI::reloadConfig();
|
|
||||||
|
|
||||||
HyprlandAPI::addNotification(PHANDLE, "[borders-plus-plus] Initialized successfully!", CColor{0.2, 1.0, 0.2, 1.0}, 5000);
|
HyprlandAPI::addNotification(PHANDLE, "[borders-plus-plus] Initialized successfully!", CColor{0.2, 1.0, 0.2, 1.0}, 5000);
|
||||||
|
|
||||||
return {"borders-plus-plus", "A plugin to add more borders to windows.", "Vaxry", "1.0"};
|
return {"borders-plus-plus", "A plugin to add more borders to windows.", "Vaxry", "1.0"};
|
||||||
|
|
|
@ -10,9 +10,7 @@ constexpr int BAR_PADDING = 10;
|
||||||
constexpr int BUTTONS_PAD = 5;
|
constexpr int BUTTONS_PAD = 5;
|
||||||
|
|
||||||
CHyprBar::CHyprBar(CWindow* pWindow) : IHyprWindowDecoration(pWindow) {
|
CHyprBar::CHyprBar(CWindow* pWindow) : IHyprWindowDecoration(pWindow) {
|
||||||
m_pWindow = pWindow;
|
m_pWindow = pWindow;
|
||||||
m_vLastWindowPos = pWindow->m_vRealPosition.vec();
|
|
||||||
m_vLastWindowSize = pWindow->m_vRealSize.vec();
|
|
||||||
|
|
||||||
const auto PMONITOR = g_pCompositor->getMonitorFromID(pWindow->m_iMonitorID);
|
const auto PMONITOR = g_pCompositor->getMonitorFromID(pWindow->m_iMonitorID);
|
||||||
PMONITOR->scheduledRecalc = true;
|
PMONITOR->scheduledRecalc = true;
|
||||||
|
@ -31,8 +29,23 @@ CHyprBar::~CHyprBar() {
|
||||||
std::erase(g_pGlobalState->bars, this);
|
std::erase(g_pGlobalState->bars, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
SWindowDecorationExtents CHyprBar::getWindowDecorationExtents() {
|
SDecorationPositioningInfo CHyprBar::getPositioningInfo() {
|
||||||
return m_seExtents;
|
static auto* const PHEIGHT = &HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprbars:bar_height")->intValue;
|
||||||
|
|
||||||
|
SDecorationPositioningInfo info;
|
||||||
|
info.policy = DECORATION_POSITION_STICKY;
|
||||||
|
info.edges = DECORATION_EDGE_TOP;
|
||||||
|
info.priority = 1000;
|
||||||
|
info.reserved = true;
|
||||||
|
info.desiredExtents = {{0, *PHEIGHT}, {0, 0}};
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CHyprBar::onPositioningReply(const SDecorationPositioningReply& reply) {
|
||||||
|
if (reply.assignedGeometry.size() != m_bAssignedBox.size())
|
||||||
|
m_bWindowSizeChanged = true;
|
||||||
|
|
||||||
|
m_bAssignedBox = reply.assignedGeometry;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHyprBar::onMouseDown(SCallbackInfo& info, wlr_pointer_button_event* e) {
|
void CHyprBar::onMouseDown(SCallbackInfo& info, wlr_pointer_button_event* e) {
|
||||||
|
@ -44,7 +57,7 @@ void CHyprBar::onMouseDown(SCallbackInfo& info, wlr_pointer_button_event* e) {
|
||||||
static auto* const PHEIGHT = &HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprbars:bar_height")->intValue;
|
static auto* const PHEIGHT = &HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprbars:bar_height")->intValue;
|
||||||
const auto BORDERSIZE = m_pWindow->getRealBorderSize();
|
const auto BORDERSIZE = m_pWindow->getRealBorderSize();
|
||||||
|
|
||||||
if (!VECINRECT(COORDS, 0, 0, m_vLastWindowSize.x + BORDERSIZE * 2, *PHEIGHT)) {
|
if (!VECINRECT(COORDS, 0, 0, assignedBoxGlobal().w + BORDERSIZE * 2, *PHEIGHT)) {
|
||||||
|
|
||||||
if (m_bDraggingThis) {
|
if (m_bDraggingThis) {
|
||||||
g_pKeybindManager->m_mDispatchers["mouse"]("0movewindow");
|
g_pKeybindManager->m_mDispatchers["mouse"]("0movewindow");
|
||||||
|
@ -83,7 +96,7 @@ void CHyprBar::onMouseDown(SCallbackInfo& info, wlr_pointer_button_event* e) {
|
||||||
float offset = 0;
|
float offset = 0;
|
||||||
|
|
||||||
for (auto& b : g_pGlobalState->buttons) {
|
for (auto& b : g_pGlobalState->buttons) {
|
||||||
const auto BARBUF = Vector2D{(int)m_vLastWindowSize.x + 2 * BORDERSIZE, *PHEIGHT + BORDERSIZE};
|
const auto BARBUF = Vector2D{(int)assignedBoxGlobal().w, *PHEIGHT + BORDERSIZE};
|
||||||
Vector2D currentPos = Vector2D{BARBUF.x - 2 * BUTTONS_PAD - b.size - offset, (BARBUF.y - b.size) / 2.0}.floor();
|
Vector2D currentPos = Vector2D{BARBUF.x - 2 * BUTTONS_PAD - b.size - offset, (BARBUF.y - b.size) / 2.0}.floor();
|
||||||
|
|
||||||
if (VECINRECT(COORDS, currentPos.x, currentPos.y, currentPos.x + b.size + BUTTONS_PAD, currentPos.y + b.size)) {
|
if (VECINRECT(COORDS, currentPos.x, currentPos.y, currentPos.x + b.size + BUTTONS_PAD, currentPos.y + b.size)) {
|
||||||
|
@ -356,16 +369,17 @@ void CHyprBar::draw(CMonitor* pMonitor, float a, const Vector2D& offset) {
|
||||||
|
|
||||||
m_seExtents = {{0, *PHEIGHT}, {}};
|
m_seExtents = {{0, *PHEIGHT}, {}};
|
||||||
|
|
||||||
const auto BARBUF = Vector2D{m_vLastWindowSize.x + 2 * BORDERSIZE, *PHEIGHT} * pMonitor->scale;
|
const auto DECOBOX = assignedBoxGlobal();
|
||||||
|
|
||||||
CBox titleBarBox = {m_vLastWindowPos.x - pMonitor->vecPosition.x, m_vLastWindowPos.y - pMonitor->vecPosition.y, m_vLastWindowSize.x,
|
const auto BARBUF = DECOBOX.size() * pMonitor->scale;
|
||||||
*PHEIGHT + ROUNDING * 3 /* to fill the bottom cuz we can't disable rounding there */};
|
|
||||||
|
CBox titleBarBox = {DECOBOX.x - pMonitor->vecPosition.x, DECOBOX.y - pMonitor->vecPosition.y, DECOBOX.w,
|
||||||
|
DECOBOX.h + ROUNDING * 3 /* to fill the bottom cuz we can't disable rounding there */};
|
||||||
|
|
||||||
titleBarBox.translate(offset).scale(pMonitor->scale).round();
|
titleBarBox.translate(offset).scale(pMonitor->scale).round();
|
||||||
|
|
||||||
titleBarBox.x -= scaledBorderSize;
|
if (titleBarBox.w < 1 || titleBarBox.h < 0)
|
||||||
titleBarBox.y -= scaledBorderSize + static_cast<int>(*PHEIGHT * pMonitor->scale);
|
return;
|
||||||
titleBarBox.w += 2 * scaledBorderSize;
|
|
||||||
|
|
||||||
g_pHyprOpenGL->scissor(&titleBarBox);
|
g_pHyprOpenGL->scissor(&titleBarBox);
|
||||||
|
|
||||||
|
@ -380,8 +394,9 @@ void CHyprBar::draw(CMonitor* pMonitor, float a, const Vector2D& offset) {
|
||||||
|
|
||||||
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
|
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
|
||||||
// the +1 is a shit garbage temp fix until renderRect supports an alpha matte
|
// the +1 is a shit garbage temp fix until renderRect supports an alpha matte
|
||||||
CBox windowBox = {m_vLastWindowPos.x + offset.x - pMonitor->vecPosition.x - BORDERSIZE + 1, m_vLastWindowPos.y + offset.y - pMonitor->vecPosition.y - BORDERSIZE + 1,
|
CBox windowBox = {m_pWindow->m_vRealPosition.vec().x + offset.x - pMonitor->vecPosition.x - BORDERSIZE + 1,
|
||||||
m_vLastWindowSize.x + 2 * BORDERSIZE - 2, m_vLastWindowSize.y + 2 * BORDERSIZE - 2};
|
m_pWindow->m_vRealPosition.vec().y + offset.y - pMonitor->vecPosition.y - BORDERSIZE + 1, m_pWindow->m_vRealSize.vec().x + 2 * BORDERSIZE - 2,
|
||||||
|
m_pWindow->m_vRealSize.vec().y + 2 * BORDERSIZE - 2};
|
||||||
windowBox.scale(pMonitor->scale).round();
|
windowBox.scale(pMonitor->scale).round();
|
||||||
g_pHyprOpenGL->renderRect(&windowBox, CColor(0, 0, 0, 0), scaledRounding);
|
g_pHyprOpenGL->renderRect(&windowBox, CColor(0, 0, 0, 0), scaledRounding);
|
||||||
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||||
|
@ -435,34 +450,15 @@ eDecorationType CHyprBar::getDecorationType() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHyprBar::updateWindow(CWindow* pWindow) {
|
void CHyprBar::updateWindow(CWindow* pWindow) {
|
||||||
const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(pWindow->m_iWorkspaceID);
|
|
||||||
|
|
||||||
const auto WORKSPACEOFFSET = PWORKSPACE && !pWindow->m_bPinned ? PWORKSPACE->m_vRenderOffset.vec() : Vector2D();
|
|
||||||
|
|
||||||
if (m_vLastWindowSize != pWindow->m_vRealSize.vec())
|
|
||||||
m_bWindowSizeChanged = true;
|
|
||||||
|
|
||||||
m_vLastWindowPos = pWindow->m_vRealPosition.vec() + WORKSPACEOFFSET;
|
|
||||||
m_vLastWindowSize = pWindow->m_vRealSize.vec();
|
|
||||||
|
|
||||||
damageEntire();
|
damageEntire();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHyprBar::damageEntire() {
|
void CHyprBar::damageEntire() {
|
||||||
CBox dm = {(int)(m_vLastWindowPos.x - m_seExtents.topLeft.x - 2), (int)(m_vLastWindowPos.y - m_seExtents.topLeft.y - 2),
|
; // ignored
|
||||||
(int)(m_vLastWindowSize.x + m_seExtents.topLeft.x + m_seExtents.bottomRight.x + 4), (int)m_seExtents.topLeft.y + 4};
|
|
||||||
g_pHyprRenderer->damageBox(&dm);
|
|
||||||
}
|
|
||||||
|
|
||||||
SWindowDecorationExtents CHyprBar::getWindowDecorationReservedArea() {
|
|
||||||
static auto* const PHEIGHT = &HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprbars:bar_height")->intValue;
|
|
||||||
return SWindowDecorationExtents{{0, *PHEIGHT}, {}};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector2D CHyprBar::cursorRelativeToBar() {
|
Vector2D CHyprBar::cursorRelativeToBar() {
|
||||||
static auto* const PHEIGHT = &HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprbars:bar_height")->intValue;
|
return g_pInputManager->getMouseCoordsInternal() - assignedBoxGlobal().pos();
|
||||||
static auto* const PBORDER = &HyprlandAPI::getConfigValue(PHANDLE, "general:border_size")->intValue;
|
|
||||||
return g_pInputManager->getMouseCoordsInternal() - m_pWindow->m_vRealPosition.vec() + Vector2D{*PBORDER, *PHEIGHT + *PBORDER};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
eDecorationLayer CHyprBar::getDecorationLayer() {
|
eDecorationLayer CHyprBar::getDecorationLayer() {
|
||||||
|
@ -472,3 +468,8 @@ eDecorationLayer CHyprBar::getDecorationLayer() {
|
||||||
uint64_t CHyprBar::getDecorationFlags() {
|
uint64_t CHyprBar::getDecorationFlags() {
|
||||||
return DECORATION_ALLOWS_MOUSE_INPUT | DECORATION_PART_OF_MAIN_WINDOW;
|
return DECORATION_ALLOWS_MOUSE_INPUT | DECORATION_PART_OF_MAIN_WINDOW;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CBox CHyprBar::assignedBoxGlobal() {
|
||||||
|
CBox box = m_bAssignedBox;
|
||||||
|
return box.translate(g_pDecorationPositioner->getEdgeDefinedPoint(DECORATION_EDGE_TOP, m_pWindow));
|
||||||
|
}
|
|
@ -11,31 +11,30 @@ class CHyprBar : public IHyprWindowDecoration {
|
||||||
CHyprBar(CWindow*);
|
CHyprBar(CWindow*);
|
||||||
virtual ~CHyprBar();
|
virtual ~CHyprBar();
|
||||||
|
|
||||||
virtual SWindowDecorationExtents getWindowDecorationExtents();
|
virtual SDecorationPositioningInfo getPositioningInfo();
|
||||||
|
|
||||||
virtual void draw(CMonitor*, float a, const Vector2D& offset);
|
virtual void onPositioningReply(const SDecorationPositioningReply& reply);
|
||||||
|
|
||||||
virtual eDecorationType getDecorationType();
|
virtual void draw(CMonitor*, float a, const Vector2D& offset);
|
||||||
|
|
||||||
virtual void updateWindow(CWindow*);
|
virtual eDecorationType getDecorationType();
|
||||||
|
|
||||||
virtual void damageEntire();
|
virtual void updateWindow(CWindow*);
|
||||||
|
|
||||||
virtual SWindowDecorationExtents getWindowDecorationReservedArea();
|
virtual void damageEntire();
|
||||||
|
|
||||||
virtual eDecorationLayer getDecorationLayer();
|
virtual eDecorationLayer getDecorationLayer();
|
||||||
|
|
||||||
virtual uint64_t getDecorationFlags();
|
virtual uint64_t getDecorationFlags();
|
||||||
|
|
||||||
bool m_bButtonsDirty = true;
|
bool m_bButtonsDirty = true;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SWindowDecorationExtents m_seExtents;
|
SWindowDecorationExtents m_seExtents;
|
||||||
|
|
||||||
CWindow* m_pWindow = nullptr;
|
CWindow* m_pWindow = nullptr;
|
||||||
|
|
||||||
Vector2D m_vLastWindowPos;
|
CBox m_bAssignedBox;
|
||||||
Vector2D m_vLastWindowSize;
|
|
||||||
|
|
||||||
CTexture m_tTextTex;
|
CTexture m_tTextTex;
|
||||||
CTexture m_tButtonsTex;
|
CTexture m_tButtonsTex;
|
||||||
|
@ -50,6 +49,7 @@ class CHyprBar : public IHyprWindowDecoration {
|
||||||
void renderBarButtonsText(CBox* barBox, const float scale, const float a);
|
void renderBarButtonsText(CBox* barBox, const float scale, const float a);
|
||||||
void onMouseDown(SCallbackInfo& info, wlr_pointer_button_event* e);
|
void onMouseDown(SCallbackInfo& info, wlr_pointer_button_event* e);
|
||||||
void onMouseMove(Vector2D coords);
|
void onMouseMove(Vector2D coords);
|
||||||
|
CBox assignedBoxGlobal();
|
||||||
|
|
||||||
HOOK_CALLBACK_FN* m_pMouseButtonCallback;
|
HOOK_CALLBACK_FN* m_pMouseButtonCallback;
|
||||||
HOOK_CALLBACK_FN* m_pMouseMoveCallback;
|
HOOK_CALLBACK_FN* m_pMouseMoveCallback;
|
||||||
|
|
|
@ -20,9 +20,9 @@ void onNewWindow(void* self, std::any data) {
|
||||||
auto* const PWINDOW = std::any_cast<CWindow*>(data);
|
auto* const PWINDOW = std::any_cast<CWindow*>(data);
|
||||||
|
|
||||||
if (!PWINDOW->m_bX11DoesntWantBorders) {
|
if (!PWINDOW->m_bX11DoesntWantBorders) {
|
||||||
CHyprBar* bar = new CHyprBar(PWINDOW);
|
std::unique_ptr<CHyprBar> bar = std::make_unique<CHyprBar>(PWINDOW);
|
||||||
HyprlandAPI::addWindowDecoration(PHANDLE, PWINDOW, static_cast<IHyprWindowDecoration*>(bar));
|
g_pGlobalState->bars.push_back(bar.get());
|
||||||
g_pGlobalState->bars.push_back(bar);
|
HyprlandAPI::addWindowDecoration(PHANDLE, PWINDOW, std::move(bar));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,13 +13,15 @@
|
||||||
#include "trail.hpp"
|
#include "trail.hpp"
|
||||||
|
|
||||||
// Do NOT change this function.
|
// Do NOT change this function.
|
||||||
APICALL EXPORT std::string PLUGIN_API_VERSION() { return HYPRLAND_API_VERSION; }
|
APICALL EXPORT std::string PLUGIN_API_VERSION() {
|
||||||
|
return HYPRLAND_API_VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
void onNewWindow(void* self, std::any data) {
|
void onNewWindow(void* self, std::any data) {
|
||||||
// data is guaranteed
|
// data is guaranteed
|
||||||
auto* const PWINDOW = std::any_cast<CWindow*>(data);
|
auto* const PWINDOW = std::any_cast<CWindow*>(data);
|
||||||
|
|
||||||
HyprlandAPI::addWindowDecoration(PHANDLE, PWINDOW, new CTrail(PWINDOW));
|
HyprlandAPI::addWindowDecoration(PHANDLE, PWINDOW, std::make_unique<CTrail>(PWINDOW));
|
||||||
}
|
}
|
||||||
|
|
||||||
GLuint CompileShader(const GLuint& type, std::string src) {
|
GLuint CompileShader(const GLuint& type, std::string src) {
|
||||||
|
@ -33,7 +35,8 @@ GLuint CompileShader(const GLuint& type, std::string src) {
|
||||||
GLint ok;
|
GLint ok;
|
||||||
glGetShaderiv(shader, GL_COMPILE_STATUS, &ok);
|
glGetShaderiv(shader, GL_COMPILE_STATUS, &ok);
|
||||||
|
|
||||||
if (ok == GL_FALSE) throw std::runtime_error("compileShader() failed!");
|
if (ok == GL_FALSE)
|
||||||
|
throw std::runtime_error("compileShader() failed!");
|
||||||
|
|
||||||
return shader;
|
return shader;
|
||||||
}
|
}
|
||||||
|
@ -41,11 +44,13 @@ GLuint CompileShader(const GLuint& type, std::string src) {
|
||||||
GLuint CreateProgram(const std::string& vert, const std::string& frag) {
|
GLuint CreateProgram(const std::string& vert, const std::string& frag) {
|
||||||
auto vertCompiled = CompileShader(GL_VERTEX_SHADER, vert);
|
auto vertCompiled = CompileShader(GL_VERTEX_SHADER, vert);
|
||||||
|
|
||||||
if (!vertCompiled) throw std::runtime_error("Compiling vshader failed.");
|
if (!vertCompiled)
|
||||||
|
throw std::runtime_error("Compiling vshader failed.");
|
||||||
|
|
||||||
auto fragCompiled = CompileShader(GL_FRAGMENT_SHADER, frag);
|
auto fragCompiled = CompileShader(GL_FRAGMENT_SHADER, frag);
|
||||||
|
|
||||||
if (!fragCompiled) throw std::runtime_error("Compiling fshader failed.");
|
if (!fragCompiled)
|
||||||
|
throw std::runtime_error("Compiling fshader failed.");
|
||||||
|
|
||||||
auto prog = glCreateProgram();
|
auto prog = glCreateProgram();
|
||||||
glAttachShader(prog, vertCompiled);
|
glAttachShader(prog, vertCompiled);
|
||||||
|
@ -60,7 +65,8 @@ GLuint CreateProgram(const std::string& vert, const std::string& frag) {
|
||||||
GLint ok;
|
GLint ok;
|
||||||
glGetProgramiv(prog, GL_LINK_STATUS, &ok);
|
glGetProgramiv(prog, GL_LINK_STATUS, &ok);
|
||||||
|
|
||||||
if (ok == GL_FALSE) throw std::runtime_error("createProgram() failed! GL_LINK_STATUS not OK!");
|
if (ok == GL_FALSE)
|
||||||
|
throw std::runtime_error("createProgram() failed! GL_LINK_STATUS not OK!");
|
||||||
|
|
||||||
return prog;
|
return prog;
|
||||||
}
|
}
|
||||||
|
@ -75,21 +81,19 @@ int onTick(void* data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void initGlobal() {
|
void initGlobal() {
|
||||||
RASSERT(
|
RASSERT(eglMakeCurrent(wlr_egl_get_display(g_pCompositor->m_sWLREGL), EGL_NO_SURFACE, EGL_NO_SURFACE, wlr_egl_get_context(g_pCompositor->m_sWLREGL)),
|
||||||
eglMakeCurrent(wlr_egl_get_display(g_pCompositor->m_sWLREGL), EGL_NO_SURFACE, EGL_NO_SURFACE, wlr_egl_get_context(g_pCompositor->m_sWLREGL)),
|
"Couldn't set current EGL!");
|
||||||
"Couldn't set current EGL!");
|
|
||||||
|
|
||||||
GLuint prog = CreateProgram(QUADTRAIL, FRAGTRAIL);
|
GLuint prog = CreateProgram(QUADTRAIL, FRAGTRAIL);
|
||||||
g_pGlobalState->trailShader.program = prog;
|
g_pGlobalState->trailShader.program = prog;
|
||||||
g_pGlobalState->trailShader.proj = glGetUniformLocation(prog, "proj");
|
g_pGlobalState->trailShader.proj = glGetUniformLocation(prog, "proj");
|
||||||
g_pGlobalState->trailShader.tex = glGetUniformLocation(prog, "tex");
|
g_pGlobalState->trailShader.tex = glGetUniformLocation(prog, "tex");
|
||||||
g_pGlobalState->trailShader.color = glGetUniformLocation(prog, "color");
|
g_pGlobalState->trailShader.color = glGetUniformLocation(prog, "color");
|
||||||
g_pGlobalState->trailShader.texAttrib = glGetAttribLocation(prog, "colors");
|
g_pGlobalState->trailShader.texAttrib = glGetAttribLocation(prog, "colors");
|
||||||
g_pGlobalState->trailShader.posAttrib = glGetAttribLocation(prog, "pos");
|
g_pGlobalState->trailShader.posAttrib = glGetAttribLocation(prog, "pos");
|
||||||
g_pGlobalState->trailShader.gradient = glGetUniformLocation(prog, "snapshots");
|
g_pGlobalState->trailShader.gradient = glGetUniformLocation(prog, "snapshots");
|
||||||
|
|
||||||
RASSERT(eglMakeCurrent(wlr_egl_get_display(g_pCompositor->m_sWLREGL), EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT),
|
RASSERT(eglMakeCurrent(wlr_egl_get_display(g_pCompositor->m_sWLREGL), EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT), "Couldn't unset current EGL!");
|
||||||
"Couldn't unset current EGL!");
|
|
||||||
|
|
||||||
g_pGlobalState->tick = wl_event_loop_add_timer(g_pCompositor->m_sWLEventLoop, &onTick, nullptr);
|
g_pGlobalState->tick = wl_event_loop_add_timer(g_pCompositor->m_sWLEventLoop, &onTick, nullptr);
|
||||||
wl_event_source_timer_update(g_pGlobalState->tick, 1);
|
wl_event_source_timer_update(g_pGlobalState->tick, 1);
|
||||||
|
@ -101,8 +105,8 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
|
||||||
const std::string HASH = __hyprland_api_get_hash();
|
const std::string HASH = __hyprland_api_get_hash();
|
||||||
|
|
||||||
if (HASH != GIT_COMMIT_HASH) {
|
if (HASH != GIT_COMMIT_HASH) {
|
||||||
HyprlandAPI::addNotification(PHANDLE, "[ht] Failure in initialization: Version mismatch (headers ver is not equal to running hyprland ver)",
|
HyprlandAPI::addNotification(PHANDLE, "[ht] Failure in initialization: Version mismatch (headers ver is not equal to running hyprland ver)", CColor{1.0, 0.2, 0.2, 1.0},
|
||||||
CColor{1.0, 0.2, 0.2, 1.0}, 5000);
|
5000);
|
||||||
throw std::runtime_error("[ht] Version mismatch");
|
throw std::runtime_error("[ht] Version mismatch");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,9 +123,10 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
|
||||||
|
|
||||||
// add deco to existing windows
|
// add deco to existing windows
|
||||||
for (auto& w : g_pCompositor->m_vWindows) {
|
for (auto& w : g_pCompositor->m_vWindows) {
|
||||||
if (w->isHidden() || !w->m_bIsMapped) continue;
|
if (w->isHidden() || !w->m_bIsMapped)
|
||||||
|
continue;
|
||||||
|
|
||||||
HyprlandAPI::addWindowDecoration(PHANDLE, w.get(), new CTrail(w.get()));
|
HyprlandAPI::addWindowDecoration(PHANDLE, w.get(), std::make_unique<CTrail>(w.get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
HyprlandAPI::reloadConfig();
|
HyprlandAPI::reloadConfig();
|
||||||
|
@ -131,4 +136,6 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
|
||||||
return {"hyprtrails", "A plugin to add trails behind moving windows", "Vaxry", "1.0"};
|
return {"hyprtrails", "A plugin to add trails behind moving windows", "Vaxry", "1.0"};
|
||||||
}
|
}
|
||||||
|
|
||||||
APICALL EXPORT void PLUGIN_EXIT() { wl_event_source_remove(g_pGlobalState->tick); }
|
APICALL EXPORT void PLUGIN_EXIT() {
|
||||||
|
wl_event_source_remove(g_pGlobalState->tick);
|
||||||
|
}
|
|
@ -39,12 +39,12 @@ CTrail::~CTrail() {
|
||||||
g_pHookSystem->unhook(pTickCb);
|
g_pHookSystem->unhook(pTickCb);
|
||||||
}
|
}
|
||||||
|
|
||||||
SWindowDecorationExtents CTrail::getWindowDecorationExtents() {
|
SDecorationPositioningInfo CTrail::getPositioningInfo() {
|
||||||
return m_seExtents;
|
return {DECORATION_POSITION_ABSOLUTE};
|
||||||
}
|
}
|
||||||
|
|
||||||
SWindowDecorationExtents CTrail::getWindowDecorationReservedArea() {
|
void CTrail::onPositioningReply(const SDecorationPositioningReply& reply) {
|
||||||
return m_seExtents;
|
; // ignored
|
||||||
}
|
}
|
||||||
|
|
||||||
void scaleBox2(box& box, float coeff) {
|
void scaleBox2(box& box, float coeff) {
|
||||||
|
|
|
@ -33,17 +33,17 @@ class CTrail : public IHyprWindowDecoration {
|
||||||
CTrail(CWindow*);
|
CTrail(CWindow*);
|
||||||
virtual ~CTrail();
|
virtual ~CTrail();
|
||||||
|
|
||||||
virtual SWindowDecorationExtents getWindowDecorationExtents();
|
virtual SDecorationPositioningInfo getPositioningInfo();
|
||||||
|
|
||||||
virtual void draw(CMonitor*, float a, const Vector2D& offset);
|
virtual void onPositioningReply(const SDecorationPositioningReply& reply);
|
||||||
|
|
||||||
virtual eDecorationType getDecorationType();
|
virtual void draw(CMonitor*, float a, const Vector2D& offset);
|
||||||
|
|
||||||
virtual void updateWindow(CWindow*);
|
virtual eDecorationType getDecorationType();
|
||||||
|
|
||||||
virtual void damageEntire();
|
virtual void updateWindow(CWindow*);
|
||||||
|
|
||||||
virtual SWindowDecorationExtents getWindowDecorationReservedArea();
|
virtual void damageEntire();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
HOOK_CALLBACK_FN* pTickCb = nullptr;
|
HOOK_CALLBACK_FN* pTickCb = nullptr;
|
||||||
|
|
Loading…
Reference in a new issue