diff options
Diffstat (limited to 'src/protocols')
| -rw-r--r-- | src/protocols/Screencopy.cpp | 22 | ||||
| -rw-r--r-- | src/protocols/Screencopy.hpp | 5 | ||||
| -rw-r--r-- | src/protocols/ToplevelExport.cpp | 19 |
3 files changed, 26 insertions, 20 deletions
diff --git a/src/protocols/Screencopy.cpp b/src/protocols/Screencopy.cpp index 476df0b8..a4d62506 100644 --- a/src/protocols/Screencopy.cpp +++ b/src/protocols/Screencopy.cpp @@ -1,5 +1,6 @@ #include "Screencopy.hpp" #include "../Compositor.hpp" +#include "../managers/PointerManager.hpp" #include <algorithm> @@ -183,6 +184,11 @@ void CScreencopyProtocolManager::removeFrame(SScreencopyFrame* frame, bool force if (!frame) return; + if (frame->lockedSWCursors) { + g_pPointerManager->unlockSoftwareForMonitor(frame->pMonitor->self.lock()); + g_pPointerManager->damageCursor(frame->pMonitor->self.lock()); + } + std::erase_if(m_vFramesAwaitingWrite, [&](const auto& other) { return other == frame; }); wl_resource_set_user_data(frame->resource, nullptr); @@ -352,8 +358,11 @@ void CScreencopyProtocolManager::copyFrame(wl_client* client, wl_resource* resou m_vFramesAwaitingWrite.emplace_back(PFRAME); g_pHyprRenderer->m_bDirectScanoutBlocked = true; - if (PFRAME->overlayCursor) - g_pHyprRenderer->m_bSoftwareCursorsLocked = true; + if (PFRAME->overlayCursor && !PFRAME->lockedSWCursors) { + PFRAME->lockedSWCursors = true; + g_pPointerManager->lockSoftwareForMonitor(PFRAME->pMonitor->self.lock()); + g_pPointerManager->damageCursor(PFRAME->pMonitor->self.lock()); + } if (!PFRAME->withDamage) g_pHyprRenderer->damageMonitor(PFRAME->pMonitor); @@ -393,17 +402,8 @@ void CScreencopyProtocolManager::shareAllFrames(CMonitor* pMonitor) { removeFrame(f); } - g_pHyprRenderer->m_bSoftwareCursorsLocked = false; - if (m_vFramesAwaitingWrite.empty()) { g_pHyprRenderer->m_bDirectScanoutBlocked = false; - } else { - for (auto& f : m_vFramesAwaitingWrite) { - if (f->overlayCursor) { - g_pHyprRenderer->m_bSoftwareCursorsLocked = true; - break; - } - } } } diff --git a/src/protocols/Screencopy.hpp b/src/protocols/Screencopy.hpp index c39152d8..7b9a5770 100644 --- a/src/protocols/Screencopy.hpp +++ b/src/protocols/Screencopy.hpp @@ -48,8 +48,9 @@ struct SScreencopyFrame { CBox box = {}; int shmStride = 0; - bool overlayCursor = false; - bool withDamage = false; + bool overlayCursor = false; + bool withDamage = false; + bool lockedSWCursors = false; wlr_buffer_cap bufferCap = WLR_BUFFER_CAP_SHM; diff --git a/src/protocols/ToplevelExport.cpp b/src/protocols/ToplevelExport.cpp index 70f00fa1..d3b71a9e 100644 --- a/src/protocols/ToplevelExport.cpp +++ b/src/protocols/ToplevelExport.cpp @@ -1,6 +1,7 @@ #include "ToplevelExport.hpp" #include "../Compositor.hpp" #include "ForeignToplevelWlr.hpp" +#include "../managers/PointerManager.hpp" #include <algorithm> @@ -313,7 +314,7 @@ void CToplevelExportProtocolManager::onOutputCommit(CMonitor* pMonitor, wlr_outp CBox geometry = {PWINDOW->m_vRealPosition.value().x, PWINDOW->m_vRealPosition.value().y, PWINDOW->m_vRealSize.value().x, PWINDOW->m_vRealSize.value().y}; - if (!wlr_output_layout_intersects(g_pCompositor->m_sWLROutputLayout, pMonitor->output, geometry.pWlr())) + if (geometry.intersection({pMonitor->vecPosition, pMonitor->vecSize}).empty()) continue; shareFrame(f); @@ -382,8 +383,10 @@ bool CToplevelExportProtocolManager::copyFrameShm(SScreencopyFrame* frame, times return false; } - if (frame->overlayCursor) - wlr_output_lock_software_cursors(PMONITOR->output, true); + if (frame->overlayCursor) { + g_pPointerManager->lockSoftwareForMonitor(PMONITOR->self.lock()); + g_pPointerManager->damageCursor(PMONITOR->self.lock()); + } g_pHyprOpenGL->clear(CColor(0, 0, 0, 1.0)); @@ -393,7 +396,7 @@ bool CToplevelExportProtocolManager::copyFrameShm(SScreencopyFrame* frame, times g_pHyprRenderer->m_bBlockSurfaceFeedback = false; if (frame->overlayCursor) - g_pHyprRenderer->renderSoftwareCursors(PMONITOR, fakeDamage, g_pInputManager->getMouseCoordsInternal() - frame->pWindow->m_vRealPosition.value()); + g_pPointerManager->renderSoftwareCursorsFor(PMONITOR->self.lock(), now, fakeDamage, g_pInputManager->getMouseCoordsInternal() - frame->pWindow->m_vRealPosition.value()); const auto PFORMAT = g_pHyprOpenGL->getPixelFormatFromDRM(format); if (!PFORMAT) { @@ -419,8 +422,10 @@ bool CToplevelExportProtocolManager::copyFrameShm(SScreencopyFrame* frame, times wlr_buffer_end_data_ptr_access(frame->buffer); - if (frame->overlayCursor) - wlr_output_lock_software_cursors(PMONITOR->output, false); + if (frame->overlayCursor) { + g_pPointerManager->unlockSoftwareForMonitor(PMONITOR->self.lock()); + g_pPointerManager->damageCursor(PMONITOR->self.lock()); + } return true; } @@ -440,7 +445,7 @@ bool CToplevelExportProtocolManager::copyFrameDmabuf(SScreencopyFrame* frame, ti g_pHyprRenderer->m_bBlockSurfaceFeedback = false; if (frame->overlayCursor) - g_pHyprRenderer->renderSoftwareCursors(PMONITOR, fakeDamage, g_pInputManager->getMouseCoordsInternal() - frame->pWindow->m_vRealPosition.value()); + g_pPointerManager->renderSoftwareCursorsFor(PMONITOR->self.lock(), now, fakeDamage, g_pInputManager->getMouseCoordsInternal() - frame->pWindow->m_vRealPosition.value()); g_pHyprOpenGL->m_RenderData.blockScreenShader = true; g_pHyprRenderer->endRender(); |
