fix(hyprexpo): update for latest hyprland - Migrate globals to Config and Render::GL namespaces - Update IPassElement interface (type, draw) - Replace CFramebuffer with SP<IFramebuffer> - Remove obsolete renderer calls (clear, makeEGLCurrent) - Switch to CConstVarList for config parsing

This commit is contained in:
imperishableSecret 2026-04-14 18:41:43 +05:30
parent 3e38db916a
commit 4a3cfcbc34
5 changed files with 36 additions and 24 deletions

View file

@ -6,8 +6,9 @@ COverviewPassElement::COverviewPassElement() {
;
}
void COverviewPassElement::draw(const CRegion& damage) {
std::vector<UP<IPassElement>> COverviewPassElement::draw() {
g_pOverview->fullRender();
return {};
}
bool COverviewPassElement::needsLiveBlur() {

View file

@ -8,12 +8,14 @@ class COverviewPassElement : public IPassElement {
COverviewPassElement();
virtual ~COverviewPassElement() = default;
virtual void draw(const CRegion& damage);
virtual std::vector<UP<IPassElement>> draw() override;
virtual bool needsLiveBlur();
virtual bool needsPrecomputeBlur();
virtual std::optional<CBox> boundingBox();
virtual CRegion opaqueRegion();
virtual ePassElementType type() override { return EK_CUSTOM; }
virtual const char* passName() {
return "COverviewPassElement";
}

View file

@ -263,5 +263,5 @@ APICALL EXPORT void PLUGIN_EXIT() {
g_unloading = true;
g_pConfigManager->reload(); // we need to reload now to clear all the gestures
Config::mgr()->reload(); // we need to reload now to clear all the gestures
}

View file

@ -1,6 +1,12 @@
#include "overview.hpp"
#include <any>
#include <hyprland/src/render/gl/GLFramebuffer.hpp>
#include <hyprland/src/render/pass/ClearPassElement.hpp>
#include <hyprland/src/config/shared/animation/AnimationTree.hpp>
#include <hyprutils/string/ConstVarList.hpp>
using namespace Hyprutils::String;
#define private public
#define protected public
#include <hyprland/src/render/Renderer.hpp>
#include <hyprland/src/Compositor.hpp>
#include <hyprland/src/desktop/state/FocusState.hpp>
@ -20,10 +26,10 @@ static void damageMonitor(WP<Hyprutils::Animation::CBaseAnimatedVariable> thispt
}
COverview::~COverview() {
g_pHyprRenderer->makeEGLCurrent();
images.clear(); // otherwise we get a vram leak
Cursor::overrideController->unsetOverride(Cursor::CURSOR_OVERRIDE_UNKNOWN);
g_pHyprOpenGL->markBlurDirtyForMonitor(pMonitor.lock());
// (pMonitor.lock());
}
COverview::COverview(PHLWORKSPACE startedOn_, bool swipe_) : startedOn(startedOn_), swipe(swipe_) {
@ -43,12 +49,12 @@ COverview::COverview(PHLWORKSPACE startedOn_, bool swipe_) : startedOn(startedOn
// process the method
bool methodCenter = true;
int methodStartID = pMonitor->activeWorkspaceID();
CVarList method{*PMETHOD, 0, 's', true};
CConstVarList method{*PMETHOD, 0, 's', true};
if (method.size() < 2)
Log::logger->log(Log::ERR, "[he] invalid workspace_method");
else {
methodCenter = method[0] == "center";
methodStartID = getWorkspaceIDNameFromString(method[1]).id;
methodStartID = getWorkspaceIDNameFromString(std::string(method[1])).id;
if (methodStartID == WORKSPACE_INVALID)
methodStartID = pMonitor->activeWorkspaceID();
}
@ -120,7 +126,7 @@ COverview::COverview(PHLWORKSPACE startedOn_, bool swipe_) : startedOn(startedOn
pMonitor->m_activeWorkspace = startedOn;
}
g_pHyprRenderer->makeEGLCurrent();
Vector2D tileSize = pMonitor->m_size / SIDE_LENGTH;
Vector2D tileRenderSize = (pMonitor->m_size - Vector2D{GAP_WIDTH * pMonitor->m_scale, GAP_WIDTH * pMonitor->m_scale} * (SIDE_LENGTH - 1)) / SIDE_LENGTH;
@ -141,12 +147,12 @@ COverview::COverview(PHLWORKSPACE startedOn_, bool swipe_) : startedOn(startedOn
for (size_t i = 0; i < (size_t)(SIDE_LENGTH * SIDE_LENGTH); ++i) {
COverview::SWorkspaceImage& image = images[i];
image.fb.alloc(monbox.w, monbox.h, PMONITOR->m_output->state->state().drmFormat);
image.fb = makeShared<Render::GL::CGLFramebuffer>(); image.fb->alloc(monbox.w, monbox.h, PMONITOR->m_output->state->state().drmFormat);
CRegion fakeDamage{0, 0, INT16_MAX, INT16_MAX};
g_pHyprRenderer->beginRender(PMONITOR, fakeDamage, RENDER_MODE_FULL_FAKE, nullptr, &image.fb);
g_pHyprRenderer->beginRender(PMONITOR, fakeDamage, Render::RENDER_MODE_FULL_FAKE, nullptr, image.fb);
g_pHyprOpenGL->clear(CHyprColor{0, 0, 0, 1.0});
g_pHyprRenderer->draw(CClearPassElement::SClearData{CHyprColor{0, 0, 0, 1.0}});
const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(image.workspaceID);
@ -175,7 +181,7 @@ COverview::COverview(PHLWORKSPACE startedOn_, bool swipe_) : startedOn(startedOn
image.box = {(i % SIDE_LENGTH) * tileRenderSize.x + (i % SIDE_LENGTH) * GAP_WIDTH, (i / SIDE_LENGTH) * tileRenderSize.y + (i / SIDE_LENGTH) * GAP_WIDTH, tileRenderSize.x,
tileRenderSize.y};
g_pHyprOpenGL->m_renderData.blockScreenShader = true;
g_pHyprRenderer->m_renderData.blockScreenShader = true;
g_pHyprRenderer->endRender();
}
@ -189,10 +195,10 @@ COverview::COverview(PHLWORKSPACE startedOn_, bool swipe_) : startedOn(startedOn
// zoom on the current workspace.
// const auto& TILE = images[std::clamp(currentid, 0, SIDE_LENGTH * SIDE_LENGTH)];
g_pAnimationManager->createAnimation(pMonitor->m_size * pMonitor->m_size / tileSize, size, g_pConfigManager->getAnimationPropertyConfig("windowsMove"), AVARDAMAGE_NONE);
g_pAnimationManager->createAnimation(pMonitor->m_size * pMonitor->m_size / tileSize, size, Config::animationTree()->getAnimationPropertyConfig("windowsMove"), AVARDAMAGE_NONE);
g_pAnimationManager->createAnimation((-((pMonitor->m_size / (double)SIDE_LENGTH) * Vector2D{currentid % SIDE_LENGTH, currentid / SIDE_LENGTH}) * pMonitor->m_scale) *
(pMonitor->m_size / tileSize),
pos, g_pConfigManager->getAnimationPropertyConfig("windowsMove"), AVARDAMAGE_NONE);
pos, Config::animationTree()->getAnimationPropertyConfig("windowsMove"), AVARDAMAGE_NONE);
size->setUpdateCallback(damageMonitor);
pos->setUpdateCallback(damageMonitor);
@ -257,7 +263,7 @@ void COverview::redrawID(int id, bool forcelowres) {
blockOverviewRendering = true;
g_pHyprRenderer->makeEGLCurrent();
id = std::clamp(id, 0, SIDE_LENGTH * SIDE_LENGTH);
@ -273,15 +279,15 @@ void COverview::redrawID(int id, bool forcelowres) {
auto& image = images[id];
if (image.fb.m_size != monbox.size()) {
image.fb.release();
image.fb.alloc(monbox.w, monbox.h, pMonitor->m_output->state->state().drmFormat);
if (image.fb->m_size != monbox.size()) {
image.fb->release();
image.fb = makeShared<Render::GL::CGLFramebuffer>(); image.fb->alloc(monbox.w, monbox.h, pMonitor->m_output->state->state().drmFormat);
}
CRegion fakeDamage{0, 0, INT16_MAX, INT16_MAX};
g_pHyprRenderer->beginRender(pMonitor.lock(), fakeDamage, RENDER_MODE_FULL_FAKE, nullptr, &image.fb);
g_pHyprRenderer->beginRender(pMonitor.lock(), fakeDamage, Render::RENDER_MODE_FULL_FAKE, nullptr, image.fb);
g_pHyprOpenGL->clear(CHyprColor{0, 0, 0, 1.0});
g_pHyprRenderer->draw(CClearPassElement::SClearData{CHyprColor{0, 0, 0, 1.0}});
const auto PWORKSPACE = image.pWorkspace;
@ -309,7 +315,7 @@ void COverview::redrawID(int id, bool forcelowres) {
} else
g_pHyprRenderer->renderWorkspace(pMonitor.lock(), PWORKSPACE, Time::steadyNow(), monbox);
g_pHyprOpenGL->m_renderData.blockScreenShader = true;
g_pHyprRenderer->m_renderData.blockScreenShader = true;
g_pHyprRenderer->endRender();
pMonitor->m_activeSpecialWorkspace = openSpecial;
@ -443,7 +449,7 @@ void COverview::fullRender() {
Vector2D tileSize = (SIZE / SIDE_LENGTH);
Vector2D tileRenderSize = (SIZE - Vector2D{GAPSIZE, GAPSIZE} * (SIDE_LENGTH - 1)) / SIDE_LENGTH;
g_pHyprOpenGL->clear(BG_COLOR.stripA());
g_pHyprRenderer->draw(CClearPassElement::SClearData{BG_COLOR.stripA()});
for (size_t y = 0; y < (size_t)SIDE_LENGTH; ++y) {
for (size_t x = 0; x < (size_t)SIDE_LENGTH; ++x) {
@ -451,7 +457,7 @@ void COverview::fullRender() {
texbox.scale(pMonitor->m_scale).translate(pos->value());
texbox.round();
CRegion damage{0, 0, INT16_MAX, INT16_MAX};
g_pHyprOpenGL->renderTextureInternal(images[x + y * SIDE_LENGTH].fb.getTexture(), texbox, {.damage = &damage, .a = 1.0});
Render::GL::g_pHyprOpenGL->renderTextureInternal(images[x + y * SIDE_LENGTH].fb->getTexture(), texbox, {.damage = &damage, .a = 1.0});
}
}
}

View file

@ -5,6 +5,9 @@
#include "globals.hpp"
#include <hyprland/src/desktop/DesktopTypes.hpp>
#include <hyprland/src/render/Framebuffer.hpp>
#include <hyprutils/memory/SharedPtr.hpp>
#include <hyprutils/memory/UniquePtr.hpp>
using namespace Hyprutils::Memory;
#include <hyprland/src/helpers/AnimatedVariable.hpp>
#include <hyprland/src/event/EventBus.hpp>
#include <vector>
@ -54,7 +57,7 @@ class COverview {
bool damageDirty = false;
struct SWorkspaceImage {
CFramebuffer fb;
SP<Render::IFramebuffer> fb;
int64_t workspaceID = -1;
PHLWORKSPACE pWorkspace;
CBox box;