diff options
| author | Vaxry <43317083+vaxerski@users.noreply.github.com> | 2023-04-03 17:01:05 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-03 17:01:05 +0100 |
| commit | 0a099ca2ab8e4b5da01189202740bbc4bbe81f5b (patch) | |
| tree | db8a0ea733d92ed236353261a42a7c3906b960eb /src/render/Renderer.cpp | |
| parent | e6211eef00a96c0dc7f8c06a6a151f5485977a0d (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.cpp | 21 |
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); |
