mirror of
https://github.com/hyprwm/Hyprland
synced 2025-01-23 22:09:50 +01:00
protocols: do not capture cursor in toplevel without pointer focus (#9042)
This commit is contained in:
parent
a3a7499317
commit
4f0f512cab
2 changed files with 24 additions and 4 deletions
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue