diff --git a/src/protocols/ToplevelExport.cpp b/src/protocols/ToplevelExport.cpp index 2c934b40..68561533 100644 --- a/src/protocols/ToplevelExport.cpp +++ b/src/protocols/ToplevelExport.cpp @@ -2,6 +2,7 @@ #include "../Compositor.hpp" #include "ForeignToplevelWlr.hpp" #include "../managers/PointerManager.hpp" +#include "../managers/SeatManager.hpp" #include "types/WLBuffer.hpp" #include "types/Buffer.hpp" #include "../helpers/Format.hpp" @@ -77,7 +78,7 @@ CToplevelExportFrame::CToplevelExportFrame(SP re if (!good()) return; - overlayCursor = !!overlayCursor_; + cursorOverlayRequested = !!overlayCursor_; if (!pWindow) { LOGM(ERR, "Client requested sharing of window handle {:x} which does not exist!", pWindow); @@ -247,6 +248,8 @@ bool CToplevelExportFrame::copyShm(timespec* now) { CFramebuffer outFB; outFB.alloc(PMONITOR->vecPixelSize.x, PMONITOR->vecPixelSize.y, PMONITOR->output->state->state().drmFormat); + auto overlayCursor = shouldOverlayCursor(); + if (overlayCursor) { g_pPointerManager->lockSoftwareForMonitor(PMONITOR->self.lock()); g_pPointerManager->damageCursor(PMONITOR->self.lock()); @@ -300,6 +303,8 @@ bool CToplevelExportFrame::copyDmabuf(timespec* now) { CRegion fakeDamage{0, 0, INT16_MAX, INT16_MAX}; + auto overlayCursor = shouldOverlayCursor(); + if (overlayCursor) { g_pPointerManager->lockSoftwareForMonitor(PMONITOR->self.lock()); g_pPointerManager->damageCursor(PMONITOR->self.lock()); @@ -328,6 +333,20 @@ bool CToplevelExportFrame::copyDmabuf(timespec* now) { return true; } +bool CToplevelExportFrame::shouldOverlayCursor() const { + if (!cursorOverlayRequested) + return false; + + auto pointerSurfaceResource = g_pSeatManager->state.pointerFocus.lock(); + + if (!pointerSurfaceResource) + return false; + + auto pointerSurface = CWLSurface::fromResource(pointerSurfaceResource); + + return pointerSurface && pointerSurface->getWindow() == pWindow; +} + bool CToplevelExportFrame::good() { return resource->resource(); } diff --git a/src/protocols/ToplevelExport.hpp b/src/protocols/ToplevelExport.hpp index 1ca3e5aa..956a085b 100644 --- a/src/protocols/ToplevelExport.hpp +++ b/src/protocols/ToplevelExport.hpp @@ -51,9 +51,9 @@ class CToplevelExportFrame { SP resource; PHLWINDOW pWindow; - bool overlayCursor = false; - bool ignoreDamage = false; - bool lockedSWCursors = false; + bool cursorOverlayRequested = false; + bool ignoreDamage = false; + bool lockedSWCursors = false; WP buffer; bool bufferDMA = false; @@ -66,6 +66,7 @@ class CToplevelExportFrame { bool copyDmabuf(timespec* now); bool copyShm(timespec* now); void share(); + bool shouldOverlayCursor() const; friend class CToplevelExportProtocol; };