diff --git a/src/protocols/FractionalScale.cpp b/src/protocols/FractionalScale.cpp index f659a63a..19e60295 100644 --- a/src/protocols/FractionalScale.cpp +++ b/src/protocols/FractionalScale.cpp @@ -76,7 +76,13 @@ static void handleAddonDestroy(wl_resource* resource) { void CFractionalScaleProtocolManager::getFractionalScale(wl_client* client, wl_resource* resource, uint32_t id, wl_resource* surface) { const auto PSURFACE = wlr_surface_from_resource(surface); - const auto PADDON = getAddonForSurface(PSURFACE); + + if (addonExists(PSURFACE)) { + wl_resource_post_error(resource, WP_FRACTIONAL_SCALE_MANAGER_V1_ERROR_FRACTIONAL_SCALE_EXISTS, "Fractional scale exists."); + return; + } + + const auto PADDON = getAddonForSurface(PSURFACE); PADDON->pResource = wl_resource_create(client, &wp_fractional_scale_v1_interface, wl_resource_get_version(resource), id); wl_resource_set_implementation(PADDON->pResource, &fractionalScaleAddonImpl, PADDON, handleAddonDestroy); @@ -84,6 +90,12 @@ void CFractionalScaleProtocolManager::getFractionalScale(wl_client* client, wl_r wp_fractional_scale_v1_send_preferred_scale(PADDON->pResource, (uint32_t)std::round(PADDON->preferredScale * 120.0)); } +bool CFractionalScaleProtocolManager::addonExists(wlr_surface* surface) { + const auto IT = std::find_if(m_vFractionalScaleAddons.begin(), m_vFractionalScaleAddons.end(), [&](const auto& other) { return other->pSurface == surface; }); + + return IT != m_vFractionalScaleAddons.end(); +} + SFractionalScaleAddon* CFractionalScaleProtocolManager::getAddonForSurface(wlr_surface* surface) { const auto IT = std::find_if(m_vFractionalScaleAddons.begin(), m_vFractionalScaleAddons.end(), [&](const auto& other) { return other->pSurface == surface; }); diff --git a/src/protocols/FractionalScale.hpp b/src/protocols/FractionalScale.hpp index 71b2c858..99696319 100644 --- a/src/protocols/FractionalScale.hpp +++ b/src/protocols/FractionalScale.hpp @@ -30,6 +30,7 @@ class CFractionalScaleProtocolManager { private: SFractionalScaleAddon* getAddonForSurface(wlr_surface*); + bool addonExists(wlr_surface*); std::vector> m_vFractionalScaleAddons;