summaryrefslogtreecommitdiff
path: root/src/render
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2024-08-30 17:37:52 +0200
committerGitHub <noreply@github.com>2024-08-30 17:37:52 +0200
commitc5fd5771814958ad274ea9abb961fff621a35b9c (patch)
treee955a8465ef0b8680603b8f7860b012b2991a09f /src/render
parentfbd63543930417f3cefe36bdb9f2cdd20fc3693a (diff)
config: Add a window rule to render while unfocused (#7582)
Diffstat (limited to 'src/render')
-rw-r--r--src/render/Renderer.cpp50
-rw-r--r--src/render/Renderer.hpp4
2 files changed, 54 insertions, 0 deletions
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index 420f8d4c..c5866e4a 100644
--- a/src/render/Renderer.cpp
+++ b/src/render/Renderer.cpp
@@ -97,6 +97,44 @@ CHyprRenderer::CHyprRenderer() {
m_pCursorTicker = wl_event_loop_add_timer(g_pCompositor->m_sWLEventLoop, cursorTicker, nullptr);
wl_event_source_timer_update(m_pCursorTicker, 500);
+
+ m_tRenderUnfocusedTimer = makeShared<CEventLoopTimer>(
+ std::nullopt,
+ [this](SP<CEventLoopTimer> self, void* data) {
+ static auto PFPS = CConfigValue<Hyprlang::INT>("misc:render_unfocused_fps");
+
+ if (m_vRenderUnfocused.empty())
+ return;
+
+ timespec now;
+ clock_gettime(CLOCK_MONOTONIC, &now);
+
+ bool dirty = false;
+ for (auto& w : m_vRenderUnfocused) {
+ if (!w) {
+ dirty = true;
+ continue;
+ }
+
+ if (!w->m_pWLSurface || !w->m_pWLSurface->resource() || shouldRenderWindow(w.lock()))
+ continue;
+
+ w->m_pWLSurface->resource()->frame(&now);
+ auto FEEDBACK = makeShared<CQueuedPresentationData>(w->m_pWLSurface->resource());
+ FEEDBACK->attachMonitor(g_pCompositor->m_pLastMonitor.lock());
+ FEEDBACK->discarded();
+ PROTO::presentation->queueData(FEEDBACK);
+ }
+
+ if (dirty)
+ std::erase_if(m_vRenderUnfocused, [](const auto& e) { return !e || !e->m_sWindowData.renderUnfocused.valueOr(false); });
+
+ if (!m_vRenderUnfocused.empty())
+ m_tRenderUnfocusedTimer->updateTimeout(std::chrono::milliseconds(1000 / *PFPS));
+ },
+ nullptr);
+
+ g_pEventLoopManager->addTimer(m_tRenderUnfocusedTimer);
}
CHyprRenderer::~CHyprRenderer() {
@@ -2800,3 +2838,15 @@ SExplicitSyncSettings CHyprRenderer::getExplicitSyncSettings() {
return settings;
}
+
+void CHyprRenderer::addWindowToRenderUnfocused(PHLWINDOW window) {
+ static auto PFPS = CConfigValue<Hyprlang::INT>("misc:render_unfocused_fps");
+
+ if (std::find(m_vRenderUnfocused.begin(), m_vRenderUnfocused.end(), window) != m_vRenderUnfocused.end())
+ return;
+
+ m_vRenderUnfocused.emplace_back(window);
+
+ if (!m_tRenderUnfocusedTimer->armed())
+ m_tRenderUnfocusedTimer->updateTimeout(std::chrono::milliseconds(1000 / *PFPS));
+}
diff --git a/src/render/Renderer.hpp b/src/render/Renderer.hpp
index d00c0a17..b730d589 100644
--- a/src/render/Renderer.hpp
+++ b/src/render/Renderer.hpp
@@ -13,6 +13,7 @@ class CWorkspace;
class CWindow;
class CInputPopup;
class IHLBuffer;
+class CEventLoopTimer;
// TODO: add fuller damage tracking for updating only parts of a window
enum DAMAGETRACKINGMODES {
@@ -78,6 +79,7 @@ class CHyprRenderer {
void makeEGLCurrent();
void unsetEGL();
SExplicitSyncSettings getExplicitSyncSettings();
+ void addWindowToRenderUnfocused(PHLWINDOW window);
// if RENDER_MODE_NORMAL, provided damage will be written to.
// otherwise, it will be the one used.
@@ -143,6 +145,8 @@ class CHyprRenderer {
SP<CRenderbuffer> getOrCreateRenderbuffer(SP<Aquamarine::IBuffer> buffer, uint32_t fmt);
std::vector<SP<CRenderbuffer>> m_vRenderbuffers;
+ std::vector<PHLWINDOWREF> m_vRenderUnfocused;
+ SP<CEventLoopTimer> m_tRenderUnfocusedTimer;
friend class CHyprOpenGLImpl;
friend class CToplevelExportFrame;