summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorvaxerski <vaxry@vaxry.net>2023-12-23 22:30:49 +0100
committervaxerski <vaxry@vaxry.net>2023-12-23 22:30:56 +0100
commitd5811283d27619711b031a26db0d04c8d859e6be (patch)
tree8b8140686ac97249b2da1f40b5ce784183fb3134 /src
parent5c7e23f86b2a1c79650772dfc8e85cff9475a14c (diff)
xdgshell: bump to 6, send suspended states
Diffstat (limited to 'src')
-rw-r--r--src/Compositor.cpp11
-rw-r--r--src/Compositor.hpp1
-rw-r--r--src/Window.cpp12
-rw-r--r--src/Window.hpp4
-rw-r--r--src/helpers/Monitor.cpp6
5 files changed, 32 insertions, 2 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp
index e4243a4e..6d892127 100644
--- a/src/Compositor.cpp
+++ b/src/Compositor.cpp
@@ -193,7 +193,7 @@ void CCompositor::initServer() {
m_sWLROutputPowerMgr = wlr_output_power_manager_v1_create(m_sWLDisplay);
- m_sWLRXDGShell = wlr_xdg_shell_create(m_sWLDisplay, 5);
+ m_sWLRXDGShell = wlr_xdg_shell_create(m_sWLDisplay, 6);
m_sWLRCursor = wlr_cursor_create();
wlr_cursor_attach_output_layout(m_sWLRCursor, m_sWLROutputLayout);
@@ -2781,3 +2781,12 @@ void CCompositor::setPreferredScaleForSurface(wlr_surface* pSurface, double scal
void CCompositor::setPreferredTransformForSurface(wlr_surface* pSurface, wl_output_transform transform) {
wlr_surface_set_preferred_buffer_transform(pSurface, transform);
}
+
+void CCompositor::updateSuspendedStates() {
+ for (auto& w : g_pCompositor->m_vWindows) {
+ if (!w->m_bIsMapped)
+ continue;
+
+ w->setSuspended(w->isHidden() || !g_pHyprRenderer->shouldRenderWindow(w.get()));
+ }
+}
diff --git a/src/Compositor.hpp b/src/Compositor.hpp
index 8703f3f1..7bedc806 100644
--- a/src/Compositor.hpp
+++ b/src/Compositor.hpp
@@ -208,6 +208,7 @@ class CCompositor {
void leaveUnsafeState();
void setPreferredScaleForSurface(wlr_surface* pSurface, double scale);
void setPreferredTransformForSurface(wlr_surface* pSurface, wl_output_transform transform);
+ void updateSuspendedStates();
std::string explicitConfigPath;
diff --git a/src/Window.cpp b/src/Window.cpp
index 1c4a326d..9df8ef69 100644
--- a/src/Window.cpp
+++ b/src/Window.cpp
@@ -511,6 +511,8 @@ void CWindow::setHidden(bool hidden) {
if (hidden && g_pCompositor->m_pLastWindow == this) {
g_pCompositor->m_pLastWindow = nullptr;
}
+
+ setSuspended(hidden);
}
bool CWindow::isHidden() {
@@ -1007,3 +1009,13 @@ bool CWindow::shouldSendFullscreenState() {
const auto MODE = g_pCompositor->getWorkspaceByID(m_iWorkspaceID)->m_efFullscreenMode;
return m_bFakeFullscreenState || (m_bIsFullscreen && (MODE == FULLSCREEN_FULL));
}
+
+void CWindow::setSuspended(bool suspend) {
+ if (suspend == m_bSuspended)
+ return;
+
+ if (m_bIsX11)
+ return;
+
+ wlr_xdg_toplevel_set_suspended(m_uSurface.xdg->toplevel, suspend);
+}
diff --git a/src/Window.hpp b/src/Window.hpp
index 8d5f22e5..bef752fb 100644
--- a/src/Window.hpp
+++ b/src/Window.hpp
@@ -367,6 +367,7 @@ class CWindow {
float rounding();
bool canBeTorn();
bool shouldSendFullscreenState();
+ void setSuspended(bool suspend);
int getRealBorderSize();
void updateSpecialRenderData();
@@ -392,7 +393,8 @@ class CWindow {
private:
// For hidden windows and stuff
- bool m_bHidden = false;
+ bool m_bHidden = false;
+ bool m_bSuspended = false;
};
/**
diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp
index c112d07d..ca1318cc 100644
--- a/src/helpers/Monitor.cpp
+++ b/src/helpers/Monitor.cpp
@@ -565,6 +565,8 @@ void CMonitor::changeWorkspace(CWorkspace* const pWorkspace, bool internal, bool
g_pCompositor->updateFullscreenFadeOnWorkspace(pWorkspace);
g_pConfigManager->ensureVRR(this);
+
+ g_pCompositor->updateSuspendedStates();
}
void CMonitor::changeWorkspace(const int& id, bool internal) {
@@ -590,6 +592,8 @@ void CMonitor::setSpecialWorkspace(CWorkspace* const pWorkspace) {
else
g_pInputManager->refocus();
+ g_pCompositor->updateSuspendedStates();
+
return;
}
@@ -631,6 +635,8 @@ void CMonitor::setSpecialWorkspace(CWorkspace* const pWorkspace) {
g_pEventManager->postEvent(SHyprIPCEvent{"activespecial", pWorkspace->m_szName + "," + szName});
g_pHyprRenderer->damageMonitor(this);
+
+ g_pCompositor->updateSuspendedStates();
}
void CMonitor::setSpecialWorkspace(const int& id) {