From e9f226797e43cedf17b094bc498272213ed53687 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Tue, 13 Sep 2022 15:25:42 +0200 Subject: Added monitor mirroring --- src/render/Renderer.cpp | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'src/render/Renderer.cpp') diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index fc02af61..a1699f36 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -778,7 +778,7 @@ void CHyprRenderer::damageWindow(CWindow* pWindow) { } void CHyprRenderer::damageMonitor(CMonitor* pMonitor) { - if (g_pCompositor->m_bUnsafeState) + if (g_pCompositor->m_bUnsafeState || pMonitor->isMirror()) return; wlr_box damageBox = {0, 0, pMonitor->vecPixelSize.x, pMonitor->vecPixelSize.y}; @@ -795,6 +795,9 @@ void CHyprRenderer::damageBox(wlr_box* pBox) { return; for (auto& m : g_pCompositor->m_vMonitors) { + if (m->isMirror()) + continue; // don't damage mirrors traditionally + wlr_box damageBox = {pBox->x - m->vecPosition.x, pBox->y - m->vecPosition.y, pBox->width, pBox->height}; scaleBox(&damageBox, m->scale); m->addDamage(&damageBox); @@ -818,6 +821,19 @@ void CHyprRenderer::damageRegion(pixman_region32_t* rg) { } } +void CHyprRenderer::damageMirrorsWith(CMonitor* pMonitor, pixman_region32_t* pRegion) { + for (auto& mirror : pMonitor->mirrors) { + Vector2D scale = {mirror->vecSize.x / pMonitor->vecSize.x, mirror->vecSize.y / pMonitor->vecSize.y}; + + pixman_region32_t rg; + pixman_region32_init(&rg); + pixman_region32_copy(&rg, pRegion); + wlr_region_scale_xy(&rg, &rg, scale.x, scale.y); + pMonitor->addDamage(&rg); + pixman_region32_fini(&rg); + } +} + void CHyprRenderer::renderDragIcon(CMonitor* pMonitor, timespec* time) { if (!(g_pInputManager->m_sDrag.dragIcon && g_pInputManager->m_sDrag.iconMapped && g_pInputManager->m_sDrag.dragIcon->surface)) return; @@ -1029,7 +1045,8 @@ bool CHyprRenderer::applyMonitorRule(CMonitor* pMonitor, SMonitorRule* pMonitorR pMonitor->vecPosition = finalPos; } - wlr_output_layout_add(g_pCompositor->m_sWLROutputLayout, pMonitor->output, (int)pMonitor->vecPosition.x, (int)pMonitor->vecPosition.y); + if (!pMonitor->isMirror()) + wlr_output_layout_add(g_pCompositor->m_sWLROutputLayout, pMonitor->output, (int)pMonitor->vecPosition.x, (int)pMonitor->vecPosition.y); wlr_output_enable(pMonitor->output, true); @@ -1042,6 +1059,9 @@ bool CHyprRenderer::applyMonitorRule(CMonitor* pMonitor, SMonitorRule* pMonitorR // frame skip pMonitor->framesToSkip = 1; + // reload to fix mirrors + g_pConfigManager->m_bWantsMonitorReload = true; + return true; } -- cgit v1.2.3