summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--flake.lock24
-rw-r--r--protocols/meson.build2
-rw-r--r--src/managers/ProtocolManager.cpp2
-rw-r--r--src/protocols/CTMControl.cpp22
-rw-r--r--src/protocols/CTMControl.hpp5
m---------subprojects/hyprland-protocols0
7 files changed, 40 insertions, 17 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9c286831..34e9a8ed 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -304,7 +304,7 @@ endfunction()
target_link_libraries(Hyprland OpenGL::EGL OpenGL::GL Threads::Threads)
-pkg_check_modules(hyprland_protocols_dep hyprland-protocols>=0.6.0)
+pkg_check_modules(hyprland_protocols_dep hyprland-protocols>=0.6.2)
if(hyprland_protocols_dep_FOUND)
pkg_get_variable(HYPRLAND_PROTOCOLS hyprland-protocols pkgdatadir)
message(STATUS "hyprland-protocols dependency set to ${HYPRLAND_PROTOCOLS}")
diff --git a/flake.lock b/flake.lock
index dfdd8c5b..7637a2c7 100644
--- a/flake.lock
+++ b/flake.lock
@@ -16,11 +16,11 @@
]
},
"locked": {
- "lastModified": 1738183445,
- "narHash": "sha256-C1He3N1SA8D2u+TSlldbA9wiYwDvXI4GxX3zKaeD7qU=",
+ "lastModified": 1738456976,
+ "narHash": "sha256-cufyHbOMnSt9V4w4OVSzNcpJ+8DwzRZRJaca2Q89KVI=",
"owner": "hyprwm",
"repo": "aquamarine",
- "rev": "48a000cf35dd10bfeb231152735aebbe875f4b74",
+ "rev": "257b2050790ab3b1eb389e0f8bdc400eb9510139",
"type": "github"
},
"original": {
@@ -105,11 +105,11 @@
]
},
"locked": {
- "lastModified": 1738018829,
- "narHash": "sha256-5Ol5iahMlELx3lWuChyZsqqLk6sP6aqaJCJFw92OZGo=",
+ "lastModified": 1738437059,
+ "narHash": "sha256-J+8ecqaP3zD9GHeN8Y4hUapoELSoggp0IZI8laTFt/0=",
"owner": "hyprwm",
"repo": "hyprgraphics",
- "rev": "12cd7034e441a5ebfdef1a090c0788413b4a635b",
+ "rev": "5ac80e3686a4dfa55d2bd15c81a266b89594a295",
"type": "github"
},
"original": {
@@ -128,11 +128,11 @@
]
},
"locked": {
- "lastModified": 1737556638,
- "narHash": "sha256-laKgI3mr2qz6tas/q3tuGPxMdsGhBi/w+HO+hO2f1AY=",
+ "lastModified": 1738422629,
+ "narHash": "sha256-5v+bv75wJWvahyM2xcMTSNNxmV8a7hb01Eey5zYnBJw=",
"owner": "hyprwm",
"repo": "hyprland-protocols",
- "rev": "4c75dd5c015c8a0e5a34c6d02a018a650f57feb5",
+ "rev": "755aef8dab49d0fc4663c715fa4ad221b2aedaed",
"type": "github"
},
"original": {
@@ -276,11 +276,11 @@
},
"nixpkgs": {
"locked": {
- "lastModified": 1737885589,
- "narHash": "sha256-Zf0hSrtzaM1DEz8//+Xs51k/wdSajticVrATqDrfQjg=",
+ "lastModified": 1738410390,
+ "narHash": "sha256-xvTo0Aw0+veek7hvEVLzErmJyQkEcRk6PSR4zsRQFEc=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "852ff1d9e153d8875a83602e03fdef8a63f0ecf8",
+ "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
"type": "github"
},
"original": {
diff --git a/protocols/meson.build b/protocols/meson.build
index aa20940d..6ed1b11a 100644
--- a/protocols/meson.build
+++ b/protocols/meson.build
@@ -7,7 +7,7 @@ wayland_protos = dependency(
hyprland_protos = dependency(
'hyprland-protocols',
- version: '>=0.6',
+ version: '>=0.6.2',
fallback: 'hyprland-protocols',
)
diff --git a/src/managers/ProtocolManager.cpp b/src/managers/ProtocolManager.cpp
index d3270fe2..62736ae5 100644
--- a/src/managers/ProtocolManager.cpp
+++ b/src/managers/ProtocolManager.cpp
@@ -167,7 +167,7 @@ CProtocolManager::CProtocolManager() {
PROTO::xdgDialog = makeUnique<CXDGDialogProtocol>(&xdg_dialog_v1_interface, 1, "XDGDialog");
PROTO::singlePixel = makeUnique<CSinglePixelProtocol>(&wp_single_pixel_buffer_manager_v1_interface, 1, "SinglePixel");
PROTO::securityContext = makeUnique<CSecurityContextProtocol>(&wp_security_context_manager_v1_interface, 1, "SecurityContext");
- PROTO::ctm = makeUnique<CHyprlandCTMControlProtocol>(&hyprland_ctm_control_manager_v1_interface, 1, "CTMControl");
+ PROTO::ctm = makeUnique<CHyprlandCTMControlProtocol>(&hyprland_ctm_control_manager_v1_interface, 2, "CTMControl");
PROTO::hyprlandSurface = makeUnique<CHyprlandSurfaceProtocol>(&hyprland_surface_manager_v1_interface, 2, "HyprlandSurface");
if (*PENABLEXXCM) {
diff --git a/src/protocols/CTMControl.cpp b/src/protocols/CTMControl.cpp
index 5560271f..322f95e2 100644
--- a/src/protocols/CTMControl.cpp
+++ b/src/protocols/CTMControl.cpp
@@ -15,6 +15,9 @@ CHyprlandCTMControlResource::CHyprlandCTMControlResource(SP<CHyprlandCtmControlM
resource->setSetCtmForOutput([this](CHyprlandCtmControlManagerV1* r, wl_resource* output, wl_fixed_t mat0, wl_fixed_t mat1, wl_fixed_t mat2, wl_fixed_t mat3, wl_fixed_t mat4,
wl_fixed_t mat5, wl_fixed_t mat6, wl_fixed_t mat7, wl_fixed_t mat8) {
+ if (blocked)
+ return;
+
const auto OUTPUTRESOURCE = CWLOutputResource::fromResource(output);
if UNLIKELY (!OUTPUTRESOURCE)
@@ -41,6 +44,9 @@ CHyprlandCTMControlResource::CHyprlandCTMControlResource(SP<CHyprlandCtmControlM
});
resource->setCommit([this](CHyprlandCtmControlManagerV1* r) {
+ if (blocked)
+ return;
+
LOGM(LOG, "Committing ctms to outputs");
for (auto& m : g_pCompositor->m_vMonitors) {
@@ -54,7 +60,17 @@ CHyprlandCTMControlResource::CHyprlandCTMControlResource(SP<CHyprlandCtmControlM
});
}
+void CHyprlandCTMControlResource::block() {
+ blocked = true;
+
+ if (resource->version() >= 2)
+ resource->sendBlocked();
+}
+
CHyprlandCTMControlResource::~CHyprlandCTMControlResource() {
+ if (blocked)
+ return;
+
for (auto& m : g_pCompositor->m_vMonitors) {
PROTO::ctm->setCTM(m, Mat3x3::identity());
}
@@ -69,7 +85,6 @@ CHyprlandCTMControlProtocol::CHyprlandCTMControlProtocol(const wl_interface* ifa
}
void CHyprlandCTMControlProtocol::bindManager(wl_client* client, void* data, uint32_t ver, uint32_t id) {
-
const auto RESOURCE = m_vManagers.emplace_back(makeShared<CHyprlandCTMControlResource>(makeShared<CHyprlandCtmControlManagerV1>(client, ver, id)));
if UNLIKELY (!RESOURCE->good()) {
@@ -78,6 +93,11 @@ void CHyprlandCTMControlProtocol::bindManager(wl_client* client, void* data, uin
return;
}
+ if (m_pManager)
+ RESOURCE->block();
+ else
+ m_pManager = RESOURCE;
+
LOGM(LOG, "New CTM Manager at 0x{:x}", (uintptr_t)RESOURCE.get());
}
diff --git a/src/protocols/CTMControl.hpp b/src/protocols/CTMControl.hpp
index 2c168acd..eb54a3aa 100644
--- a/src/protocols/CTMControl.hpp
+++ b/src/protocols/CTMControl.hpp
@@ -16,11 +16,13 @@ class CHyprlandCTMControlResource {
~CHyprlandCTMControlResource();
bool good();
+ void block();
private:
SP<CHyprlandCtmControlManagerV1> resource;
std::unordered_map<std::string, Mat3x3> ctms;
+ bool blocked = false;
};
class CHyprlandCTMControlProtocol : public IWaylandProtocol {
@@ -37,6 +39,7 @@ class CHyprlandCTMControlProtocol : public IWaylandProtocol {
//
std::vector<SP<CHyprlandCTMControlResource>> m_vManagers;
+ WP<CHyprlandCTMControlResource> m_pManager;
//
struct SCTMData {
@@ -51,4 +54,4 @@ class CHyprlandCTMControlProtocol : public IWaylandProtocol {
namespace PROTO {
inline UP<CHyprlandCTMControlProtocol> ctm;
-}; \ No newline at end of file
+};
diff --git a/subprojects/hyprland-protocols b/subprojects/hyprland-protocols
-Subproject 4c75dd5c015c8a0e5a34c6d02a018a650f57feb
+Subproject 755aef8dab49d0fc4663c715fa4ad221b2aedae