protocols: do not capture cursor in toplevel without pointer focus (#9042)

This commit is contained in:
outfoxxed 2025-01-12 09:09:02 -08:00 committed by GitHub
parent a3a7499317
commit 4f0f512cab
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 24 additions and 4 deletions

View file

@ -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<CHyprlandToplevelExportFrameV1> 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();
}

View file

@ -51,9 +51,9 @@ class CToplevelExportFrame {
SP<CHyprlandToplevelExportFrameV1> resource;
PHLWINDOW pWindow;
bool overlayCursor = false;
bool ignoreDamage = false;
bool lockedSWCursors = false;
bool cursorOverlayRequested = false;
bool ignoreDamage = false;
bool lockedSWCursors = false;
WP<IHLBuffer> 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;
};