summaryrefslogtreecommitdiff
path: root/src/render/Renderer.cpp
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2023-04-03 17:01:05 +0100
committerGitHub <noreply@github.com>2023-04-03 17:01:05 +0100
commit0a099ca2ab8e4b5da01189202740bbc4bbe81f5b (patch)
treedb8a0ea733d92ed236353261a42a7c3906b960eb /src/render/Renderer.cpp
parente6211eef00a96c0dc7f8c06a6a151f5485977a0d (diff)
Hyprland Screencopy impl (#1800)
--------- Co-authored-by: Mihai Fufezan <fufexan@protonmail.com>
Diffstat (limited to 'src/render/Renderer.cpp')
-rw-r--r--src/render/Renderer.cpp21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index b7945dee..a8ba8b22 100644
--- a/src/render/Renderer.cpp
+++ b/src/render/Renderer.cpp
@@ -662,7 +662,7 @@ void countSubsurfacesIter(wlr_surface* pSurface, int x, int y, void* data) {
}
bool CHyprRenderer::attemptDirectScanout(CMonitor* pMonitor) {
- if (!pMonitor->mirrors.empty() || pMonitor->isMirror())
+ if (!pMonitor->mirrors.empty() || pMonitor->isMirror() || m_bDirectScanoutBlocked)
return false; // do not DS if this monitor is being mirrored. Will break the functionality.
const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(pMonitor->activeWorkspace);
@@ -820,6 +820,10 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) {
return;
}
+ const bool UNLOCK_SC = g_pHyprRenderer->m_bSoftwareCursorsLocked;
+ if (UNLOCK_SC)
+ wlr_output_lock_software_cursors(pMonitor->output, true);
+
if (!wlr_output_damage_attach_render(pMonitor->damage, &hasChanged, &damage)) {
Debug::log(ERR, "Couldn't attach render to display %s ???", pMonitor->szName.c_str());
return;
@@ -938,12 +942,23 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) {
g_pHyprRenderer->damageMirrorsWith(pMonitor, &frameDamage);
pixman_region32_fini(&frameDamage);
- pixman_region32_fini(&damage);
pMonitor->renderingActive = false;
- if (!wlr_output_commit(pMonitor->output))
+ if (!wlr_output_commit(pMonitor->output)) {
+ pixman_region32_fini(&damage);
+
+ if (UNLOCK_SC)
+ wlr_output_lock_software_cursors(pMonitor->output, false);
+
return;
+ }
+
+ g_pProtocolManager->m_pScreencopyProtocolManager->onRenderEnd(pMonitor);
+ pixman_region32_fini(&damage);
+
+ if (UNLOCK_SC)
+ wlr_output_lock_software_cursors(pMonitor->output, false);
if (*PDAMAGEBLINK || *PVFR == 0 || pMonitor->pendingFrame)
g_pCompositor->scheduleFrameForMonitor(pMonitor);