hyprerror: make hyprerror reserve space (#8040)

This commit is contained in:
Vaxry 2024-10-08 21:20:25 +01:00 committed by GitHub
parent 60308a2bb5
commit 91299f7039
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 45 additions and 4 deletions

View File

@ -3,6 +3,9 @@
#include "../Compositor.hpp"
#include "../config/ConfigValue.hpp"
#include <hyprutils/utils/ScopeGuard.hpp>
using namespace Hyprutils::Utils;
CHyprError::CHyprError() {
m_fFadeOpacity.create(AVARTYPE_FLOAT, g_pConfigManager->getAnimationPropertyConfig("fadeIn"), AVARDAMAGE_NONE);
m_fFadeOpacity.registerVar();
@ -130,6 +133,8 @@ void CHyprError::createQueued() {
}
m_szQueued = "";
m_fLastHeight = yoffset + PAD + 1;
pango_font_description_free(pangoFD);
g_object_unref(layoutText);
@ -158,6 +163,8 @@ void CHyprError::createQueued() {
m_cQueued = CColor();
g_pHyprRenderer->damageMonitor(PMONITOR);
g_pHyprRenderer->arrangeLayersForMonitor(PMONITOR->ID);
}
void CHyprError::draw() {
@ -174,6 +181,11 @@ void CHyprError::draw() {
m_pTexture->destroyTexture();
m_bIsCreated = false;
m_szQueued = "";
for (auto& m : g_pCompositor->m_vMonitors) {
g_pHyprRenderer->arrangeLayersForMonitor(m->ID);
}
return;
} else {
m_fFadeOpacity.setConfig(g_pConfigManager->getAnimationPropertyConfig("fadeOut"));
@ -203,3 +215,11 @@ void CHyprError::destroy() {
else
m_szQueued = "";
}
bool CHyprError::active() {
return m_bIsCreated;
}
float CHyprError::height() {
return m_fLastHeight;
}

View File

@ -11,9 +11,12 @@ class CHyprError {
CHyprError();
~CHyprError();
void queueCreate(std::string message, const CColor& color);
void draw();
void destroy();
void queueCreate(std::string message, const CColor& color);
void draw();
void destroy();
bool active();
float height(); // logical
private:
void createQueued();
@ -23,7 +26,8 @@ class CHyprError {
bool m_bIsCreated = false;
SP<CTexture> m_pTexture;
CAnimatedVariable<float> m_fFadeOpacity;
CBox m_bDamageBox = {0, 0, 0, 0};
CBox m_bDamageBox = {0, 0, 0, 0};
float m_fLastHeight = 0.F;
bool m_bMonitorChanged = false;
};

View File

@ -97,6 +97,16 @@ CHyprRenderer::CHyprRenderer() {
ensureCursorRenderingMode();
});
static auto P3 = g_pHookSystem->hookDynamic("focusedMon", [&](void* self, SCallbackInfo& info, std::any param) {
g_pEventLoopManager->doLater([this]() {
if (!g_pHyprError->active())
return;
for (auto& m : g_pCompositor->m_vMonitors) {
arrangeLayersForMonitor(m->ID);
}
});
});
m_pCursorTicker = wl_event_loop_add_timer(g_pCompositor->m_sWLEventLoop, cursorTicker, nullptr);
wl_event_source_timer_update(m_pCursorTicker, 500);
@ -1757,6 +1767,13 @@ void CHyprRenderer::arrangeLayersForMonitor(const MONITORID& monitor) {
CBox usableArea = {PMONITOR->vecPosition.x, PMONITOR->vecPosition.y, PMONITOR->vecSize.x, PMONITOR->vecSize.y};
if (g_pHyprError->active() && g_pCompositor->m_pLastMonitor == PMONITOR->self) {
const auto HEIGHT = g_pHyprError->height();
PMONITOR->vecReservedTopLeft.y = HEIGHT;
usableArea.y += HEIGHT;
usableArea.h -= HEIGHT;
}
for (auto& la : PMONITOR->m_aLayerSurfaceLayers) {
std::stable_sort(la.begin(), la.end(), [](const PHLLSREF& a, const PHLLSREF& b) { return a->order > b->order; });
}