mirror of
https://git.allpurposem.at/mat/WiggleWobble.git
synced 2025-12-23 13:01:28 +01:00
feat: attempt to register a callback, but it does not work!
This commit is contained in:
parent
4840855ee0
commit
24134f9f90
@ -1,7 +1,11 @@
|
|||||||
monitor=,preferred,auto,auto
|
monitor=,preferred,auto,auto
|
||||||
|
|
||||||
# exec_once=kitty --hold sh -c "hyprctl plugin load $(pwd)/build/src/libhyprwiggle.so"
|
# TODO: does not work!!
|
||||||
|
exec-once=sh -c "hyprctl plugin load $(pwd)/build/src/libhyprwiggle.so"
|
||||||
|
|
||||||
|
debug {
|
||||||
|
disable_logs = false
|
||||||
|
}
|
||||||
general {
|
general {
|
||||||
gaps_in = 5
|
gaps_in = 5
|
||||||
gaps_out = 20
|
gaps_out = 20
|
||||||
|
|||||||
123
src/main.cpp
123
src/main.cpp
@ -1,20 +1,132 @@
|
|||||||
|
#include "src/helpers/math/Math.hpp"
|
||||||
|
#include <hyprgraphics/color/Color.hpp>
|
||||||
#define WLR_USE_UNSTABLE
|
#define WLR_USE_UNSTABLE
|
||||||
|
|
||||||
#include "globals.hpp"
|
#include "globals.hpp"
|
||||||
// version.hpp will be generated by meson
|
// version.hpp will be generated by meson
|
||||||
#include "version.hpp"
|
#include "version.hpp"
|
||||||
|
|
||||||
// #include <hyprland/src/Window.hpp>
|
|
||||||
#include <hyprland/src/Compositor.hpp>
|
#include <hyprland/src/Compositor.hpp>
|
||||||
|
#include <hyprland/src/render/Renderer.hpp>
|
||||||
|
#include <hyprland/src/render/Transformer.hpp>
|
||||||
|
#include <hyprland/src/desktop/Window.hpp>
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <thread>
|
|
||||||
|
|
||||||
// Do NOT change this function.
|
// Do NOT change this function.
|
||||||
APICALL EXPORT std::string PLUGIN_API_VERSION() {
|
APICALL EXPORT std::string PLUGIN_API_VERSION() {
|
||||||
return HYPRLAND_API_VERSION;
|
return HYPRLAND_API_VERSION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class CWindowTransformer : public IWindowTransformer {
|
||||||
|
public:
|
||||||
|
virtual CFramebuffer* transform(CFramebuffer* in);
|
||||||
|
virtual void preWindowRender(CSurfacePassElement::SRenderData* pRenderData);
|
||||||
|
|
||||||
|
private:
|
||||||
|
float rot = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<CWindowTransformer*> ptrs;
|
||||||
|
Vector2D oldPos, newPos;
|
||||||
|
|
||||||
|
void renderTex(CBox monbox, CTexture& tex, float rot) {
|
||||||
|
if (g_pHyprOpenGL->m_renderData.damage.empty()) return;
|
||||||
|
|
||||||
|
CBox newBox = monbox.scale(g_pHyprOpenGL->m_renderData.renderModif.combinedScale());
|
||||||
|
g_pHyprOpenGL->m_renderData.renderModif.applyToBox(newBox);
|
||||||
|
|
||||||
|
Mat3x3 matrix = g_pHyprOpenGL->m_renderData.monitorProjection.projectBox(monbox, wlTransformToHyprutils(invertTransform(WL_OUTPUT_TRANSFORM_NORMAL)), monbox.rot);
|
||||||
|
Mat3x3 glMatrix = g_pHyprOpenGL->m_renderData.projection.copy().multiply(matrix);
|
||||||
|
|
||||||
|
SShader* shader = &g_pHyprOpenGL->m_shaders->m_shPASSTHRURGBA;
|
||||||
|
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
glBindTexture(tex.m_target, tex.m_texID);
|
||||||
|
|
||||||
|
glUseProgram(shader->program);
|
||||||
|
|
||||||
|
#ifndef GLES2
|
||||||
|
glUniformMatrix3fv(shader->proj, 1, GL_TRUE, glMatrix.getMatrix().data());
|
||||||
|
#else
|
||||||
|
glMatrix.transpose();
|
||||||
|
glUniformMatrix3fv(shader->proj, 1, GL_FALSE, glMatrix.getMatrix().data());
|
||||||
|
#endif
|
||||||
|
glUniform1i(shader->tex, 0);
|
||||||
|
|
||||||
|
const auto TOPLEFT = Vector2D(newBox.x, newBox.y);
|
||||||
|
const auto FULLSIZE = Vector2D(newBox.width, newBox.height);
|
||||||
|
|
||||||
|
glUniform2f(shader->topLeft, TOPLEFT.x, TOPLEFT.y);
|
||||||
|
glUniform2f(shader->fullSize, FULLSIZE.x, FULLSIZE.y);
|
||||||
|
glUniform1f(shader->radius, 0);
|
||||||
|
|
||||||
|
glUniform1i(shader->discardOpaque, 0);
|
||||||
|
glUniform1i(shader->discardAlpha, 0);
|
||||||
|
|
||||||
|
glUniform1f(shader->alpha, 1);
|
||||||
|
|
||||||
|
glVertexAttribPointer(shader->posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts);
|
||||||
|
glVertexAttribPointer(shader->texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts);
|
||||||
|
|
||||||
|
glEnableVertexAttribArray(shader->posAttrib);
|
||||||
|
glEnableVertexAttribArray(shader->texAttrib);
|
||||||
|
|
||||||
|
for (auto& RECT : g_pHyprOpenGL->m_renderData.damage.getRects()) {
|
||||||
|
g_pHyprOpenGL->scissor(&RECT);
|
||||||
|
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_pHyprOpenGL->scissor(nullptr);
|
||||||
|
|
||||||
|
glDisableVertexAttribArray(shader->posAttrib);
|
||||||
|
glDisableVertexAttribArray(shader->texAttrib);
|
||||||
|
|
||||||
|
glBindTexture(tex.m_target, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CWindowTransformer::preWindowRender(CSurfacePassElement::SRenderData* pRenderData) {
|
||||||
|
oldPos = pRenderData->pos;
|
||||||
|
|
||||||
|
pRenderData->pos.x = pRenderData->pMonitor->m_size.x / 2.f - pRenderData->w / 2.f;
|
||||||
|
pRenderData->pos.y = pRenderData->pMonitor->m_size.y / 2.f - pRenderData->h / 2.f;
|
||||||
|
|
||||||
|
newPos = {(double)pRenderData->pos.x, (double)pRenderData->pos.y};
|
||||||
|
}
|
||||||
|
|
||||||
|
CFramebuffer* CWindowTransformer::transform(CFramebuffer* in) {
|
||||||
|
static CFramebuffer off;
|
||||||
|
|
||||||
|
if (!off.isAllocated() || off.m_size != in->m_size) {
|
||||||
|
off.release();
|
||||||
|
off.alloc(in->m_size.x, in->m_size.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
off.bind();
|
||||||
|
g_pHyprOpenGL->clear(CHyprColor{0,0,0,0});
|
||||||
|
|
||||||
|
CBox monbox = {oldPos.x - newPos.x, oldPos.y - newPos.y, g_pHyprOpenGL->m_renderData.pMonitor->m_transformedSize.x,
|
||||||
|
g_pHyprOpenGL->m_renderData.pMonitor->m_transformedSize.y};
|
||||||
|
|
||||||
|
renderTex(monbox, *in->getTexture(), rot);
|
||||||
|
|
||||||
|
rot += 0.01;
|
||||||
|
|
||||||
|
return &off;
|
||||||
|
}
|
||||||
|
|
||||||
|
void onNewWindow(void* self, std::any data) {
|
||||||
|
// data is guaranteed
|
||||||
|
auto* const PWINDOW = std::any_cast<CWindow*>(data);
|
||||||
|
|
||||||
|
ptrs.push_back(static_cast<CWindowTransformer*>(PWINDOW->m_transformers.emplace_back(new CWindowTransformer{}).get()));
|
||||||
|
|
||||||
|
HyprlandAPI::addNotification(PHANDLE, "onnewwindow", CHyprColor{0.f, 1.f, 1.f, 1.f}, 5000);
|
||||||
|
std::println("onnewwindow");
|
||||||
|
throw "up";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
|
APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
|
||||||
PHANDLE = handle;
|
PHANDLE = handle;
|
||||||
|
|
||||||
@ -28,13 +140,16 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
|
|||||||
throw std::runtime_error("[WiggleWobble] Version mismatch");
|
throw std::runtime_error("[WiggleWobble] Version mismatch");
|
||||||
}
|
}
|
||||||
|
|
||||||
HyprlandAPI::addNotification(PHANDLE, "WiggleWobble loaded!", CHyprColor{0.f, 1.f, 1.f, 1.f}, 5000);
|
|
||||||
|
static auto P = HyprlandAPI::registerCallbackDynamic(PHANDLE, "openWindow", [&](void* self, SCallbackInfo& info, std::any data) { onNewWindow(self, data); });
|
||||||
|
|
||||||
HyprlandAPI::reloadConfig();
|
HyprlandAPI::reloadConfig();
|
||||||
|
|
||||||
|
HyprlandAPI::addNotification(PHANDLE, "[WiggleWobble] Successfully loaded!", CHyprColor{0.f, 1.f, 1.f, 1.f}, 5000);
|
||||||
|
|
||||||
return {"wigglewobble", "Wobbly windows for Hyprland", "All-Purpose Mat", PLUGIN_VERSION};
|
return {"wigglewobble", "Wobbly windows for Hyprland", "All-Purpose Mat", PLUGIN_VERSION};
|
||||||
}
|
}
|
||||||
|
|
||||||
APICALL EXPORT void PLUGIN_EXIT() {
|
APICALL EXPORT void PLUGIN_EXIT() {
|
||||||
HyprlandAPI::invokeHyprctlCommand("seterror", "disable");
|
throw "down";
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user