core: buffer handling fixes

fixes #101
This commit is contained in:
Vaxry 2025-03-31 21:27:04 +01:00
parent 09101f77a4
commit 6692091d56
3 changed files with 18 additions and 9 deletions

View file

@ -66,8 +66,10 @@ CLayerSurface::~CLayerSurface() {
static void onCallbackDone(CLayerSurface* surf, uint32_t when) { static void onCallbackDone(CLayerSurface* surf, uint32_t when) {
surf->frameCallback.reset(); surf->frameCallback.reset();
if (surf->dirty || !surf->rendered) if (surf->dirty || !surf->rendered || surf->forceRerender)
g_pHyprpicker->renderSurface(g_pHyprpicker->m_pLastSurface); g_pHyprpicker->renderSurface(surf);
surf->forceRerender = false;
} }
void CLayerSurface::sendFrame() { void CLayerSurface::sendFrame() {

View file

@ -38,4 +38,5 @@ class CLayerSurface {
bool rendered = false; bool rendered = false;
SP<CCWlCallback> frameCallback = nullptr; SP<CCWlCallback> frameCallback = nullptr;
bool forceRerender = false;
}; };

View file

@ -169,8 +169,10 @@ void CHyprpicker::recheckACK() {
void CHyprpicker::markDirty() { void CHyprpicker::markDirty() {
for (auto& ls : m_vLayerSurfaces) { for (auto& ls : m_vLayerSurfaces) {
if (ls->frameCallback) if (ls->frameCallback) {
ls->forceRerender = true;
continue; continue;
}
ls->markDirty(); ls->markDirty();
} }
@ -341,7 +343,7 @@ void CHyprpicker::renderSurface(CLayerSurface* pSurface, bool forceInactive) {
const auto PBUFFER = getBufferForLS(pSurface); const auto PBUFFER = getBufferForLS(pSurface);
if (!PBUFFER || !pSurface->screenBuffer) { 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; return;
} }
@ -583,8 +585,6 @@ void CHyprpicker::initMouse() {
m_vLastCoords = {x, y}; m_vLastCoords = {x, y};
markDirty();
for (auto& ls : m_vLayerSurfaces) { for (auto& ls : m_vLayerSurfaces) {
if (ls->pSurface->resource() == surface) { if (ls->pSurface->resource() == surface) {
m_pLastSurface = ls.get(); m_pLastSurface = ls.get();
@ -593,13 +593,19 @@ void CHyprpicker::initMouse() {
} }
m_pCursorShapeDevice->sendSetShape(serial, WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_CROSSHAIR); 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) { for (auto& ls : m_vLayerSurfaces) {
if (ls->pSurface->resource() == surf) { if (ls->pSurface->resource() == surface) {
renderSurface(ls.get(), true); 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) { 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); auto x = wl_fixed_to_double(surface_x);