all: update for hyprland#3800

This commit is contained in:
Vaxry 2023-11-11 14:39:46 +00:00
parent 344e5a145e
commit 2cc193e6dc
9 changed files with 149 additions and 96 deletions

View file

@ -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() {

View file

@ -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;
}; };

View file

@ -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"};

View file

@ -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() {
@ -471,4 +467,9 @@ 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));
} }

View file

@ -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;

View file

@ -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));
} }
} }

View file

@ -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);
}

View file

@ -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) {

View file

@ -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;