summaryrefslogtreecommitdiff
path: root/src/protocols
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2024-05-05 22:18:10 +0100
committerVaxry <43317083+vaxerski@users.noreply.github.com>2024-05-09 13:37:39 +0100
commited411f53bdcf8d455f9e6ca769693aa84dc8372f (patch)
treeaacedb349acdd1022975d7b622dc7cfe11388223 /src/protocols
parente4e84064f2d07810e0c150bce1369a0a00503e9a (diff)
cursor: move to a hyprland impl
This moves wlr_cursor to a completely new impl mostly under CPointerManager Also adds beginSimple to OpenGL for simple render passes (e.g. cursor)
Diffstat (limited to 'src/protocols')
-rw-r--r--src/protocols/Screencopy.cpp22
-rw-r--r--src/protocols/Screencopy.hpp5
-rw-r--r--src/protocols/ToplevelExport.cpp19
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();