diff --git a/src/helpers/LayerSurface.cpp b/src/helpers/LayerSurface.cpp index ab7c7de..05fb41a 100644 --- a/src/helpers/LayerSurface.cpp +++ b/src/helpers/LayerSurface.cpp @@ -66,8 +66,10 @@ CLayerSurface::~CLayerSurface() { static void onCallbackDone(CLayerSurface* surf, uint32_t when) { surf->frameCallback.reset(); - if (surf->dirty || !surf->rendered) - g_pHyprpicker->renderSurface(g_pHyprpicker->m_pLastSurface); + if (surf->dirty || !surf->rendered || surf->forceRerender) + g_pHyprpicker->renderSurface(surf); + + surf->forceRerender = false; } void CLayerSurface::sendFrame() { diff --git a/src/helpers/LayerSurface.hpp b/src/helpers/LayerSurface.hpp index 46bc87c..c3e50c6 100644 --- a/src/helpers/LayerSurface.hpp +++ b/src/helpers/LayerSurface.hpp @@ -38,4 +38,5 @@ class CLayerSurface { bool rendered = false; SP frameCallback = nullptr; + bool forceRerender = false; }; \ No newline at end of file diff --git a/src/hyprpicker.cpp b/src/hyprpicker.cpp index f33d94f..dfbd394 100644 --- a/src/hyprpicker.cpp +++ b/src/hyprpicker.cpp @@ -169,8 +169,10 @@ void CHyprpicker::recheckACK() { void CHyprpicker::markDirty() { for (auto& ls : m_vLayerSurfaces) { - if (ls->frameCallback) + if (ls->frameCallback) { + ls->forceRerender = true; continue; + } ls->markDirty(); } @@ -341,7 +343,7 @@ void CHyprpicker::renderSurface(CLayerSurface* pSurface, bool forceInactive) { const auto PBUFFER = getBufferForLS(pSurface); if (!PBUFFER || !pSurface->screenBuffer) { - // Debug::log(ERR, PBUFFER ? "renderSurface: pSurface->screenBuffer null" : "renderSurface: PBUFFER null"); + Debug::log(ERR, PBUFFER ? "renderSurface: pSurface->screenBuffer null" : "renderSurface: PBUFFER null"); return; } @@ -583,8 +585,6 @@ void CHyprpicker::initMouse() { m_vLastCoords = {x, y}; - markDirty(); - for (auto& ls : m_vLayerSurfaces) { if (ls->pSurface->resource() == surface) { m_pLastSurface = ls.get(); @@ -593,13 +593,19 @@ void CHyprpicker::initMouse() { } m_pCursorShapeDevice->sendSetShape(serial, WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_CROSSHAIR); + + markDirty(); }); - m_pPointer->setLeave([this](CCWlPointer* r, uint32_t timeMs, wl_proxy* surf) { + m_pPointer->setLeave([this](CCWlPointer* r, uint32_t timeMs, wl_proxy* surface) { for (auto& ls : m_vLayerSurfaces) { - if (ls->pSurface->resource() == surf) { - renderSurface(ls.get(), true); + if (ls->pSurface->resource() == surface) { + if (m_pLastSurface == ls.get()) + m_pLastSurface = nullptr; + break; } } + + markDirty(); }); m_pPointer->setMotion([this](CCWlPointer* r, uint32_t timeMs, wl_fixed_t surface_x, wl_fixed_t surface_y) { auto x = wl_fixed_to_double(surface_x);