summaryrefslogtreecommitdiff
path: root/src/protocols/FractionalScale.cpp
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2024-04-20 14:14:54 +0100
committerVaxry <vaxry@vaxry.net>2024-04-20 14:19:16 +0100
commitea47e8c92ae283c4b41be0aafbdad9b0701a1624 (patch)
tree30d064d286864e95c0886cf6177f01d1a41ace64 /src/protocols/FractionalScale.cpp
parentea954494024cb596aaf9a40c77c3e0fcaf0e0322 (diff)
Fractional-scale: move to new impl
Diffstat (limited to 'src/protocols/FractionalScale.cpp')
-rw-r--r--src/protocols/FractionalScale.cpp139
1 files changed, 57 insertions, 82 deletions
diff --git a/src/protocols/FractionalScale.cpp b/src/protocols/FractionalScale.cpp
index 86b5afbc..993d963b 100644
--- a/src/protocols/FractionalScale.cpp
+++ b/src/protocols/FractionalScale.cpp
@@ -1,118 +1,93 @@
#include "FractionalScale.hpp"
-#include "../Compositor.hpp"
+static void onWlrSurfaceDestroy(void* owner, void* data) {
+ const auto SURF = (wlr_surface*)owner;
-#define FRACTIONAL_SCALE_VERSION 1
-
-static void bindManagerInt(wl_client* client, void* data, uint32_t version, uint32_t id) {
- g_pProtocolManager->m_pFractionalScaleProtocolManager->bindManager(client, data, version, id);
+ PROTO::fractional->onSurfaceDestroy(SURF);
}
-static void handleDisplayDestroy(struct wl_listener* listener, void* data) {
- g_pProtocolManager->m_pFractionalScaleProtocolManager->displayDestroy();
+CFractionalScaleProtocol::CFractionalScaleProtocol(const wl_interface* iface, const int& ver, const std::string& name) : IWaylandProtocol(iface, ver, name) {
+ ;
}
-void CFractionalScaleProtocolManager::displayDestroy() {
- wl_global_destroy(m_pGlobal);
+void CFractionalScaleProtocol::bindManager(wl_client* client, void* data, uint32_t ver, uint32_t id) {
+ const auto RESOURCE = m_vManagers.emplace_back(std::make_unique<CWpFractionalScaleManagerV1>(client, ver, id)).get();
+ RESOURCE->setOnDestroy([this](CWpFractionalScaleManagerV1* p) { this->onManagerResourceDestroy(p->resource()); });
+
+ RESOURCE->setDestroy([this](CWpFractionalScaleManagerV1* pMgr) { this->onManagerResourceDestroy(pMgr->resource()); });
+ RESOURCE->setGetFractionalScale(
+ [this](CWpFractionalScaleManagerV1* pMgr, uint32_t id, wl_resource* surface) { this->onGetFractionalScale(pMgr, id, wlr_surface_from_resource(surface)); });
}
-static void handleDestroy(wl_client* client, wl_resource* resource) {
- wl_resource_destroy(resource);
+void CFractionalScaleProtocol::removeAddon(CFractionalScaleAddon* addon) {
+ m_mAddons.erase(addon->surf());
}
-void handleGetFractionalScale(wl_client* client, wl_resource* resource, uint32_t id, wl_resource* surface) {
- g_pProtocolManager->m_pFractionalScaleProtocolManager->getFractionalScale(client, resource, id, surface);
+void CFractionalScaleProtocol::onManagerResourceDestroy(wl_resource* res) {
+ std::erase_if(m_vManagers, [res](const auto& other) { return other->resource() == res; });
}
-CFractionalScaleProtocolManager::CFractionalScaleProtocolManager() {
- m_pGlobal = wl_global_create(g_pCompositor->m_sWLDisplay, &wp_fractional_scale_manager_v1_interface, FRACTIONAL_SCALE_VERSION, this, bindManagerInt);
+void CFractionalScaleProtocol::onGetFractionalScale(CWpFractionalScaleManagerV1* pMgr, uint32_t id, wlr_surface* surface) {
+ const auto PADDON = m_mAddons
+ .emplace(surface,
+ std::make_unique<CFractionalScaleAddon>(
+ std::make_shared<CWpFractionalScaleV1>(wl_resource_get_client(pMgr->resource()), wl_resource_get_version(pMgr->resource()), id), surface))
+ .first->second.get();
- if (!m_pGlobal) {
- Debug::log(ERR, "FractionalScaleManager could not start! Fractional scaling will not work!");
+ if (!PADDON->good()) {
+ m_mAddons.erase(surface);
+ wl_resource_post_no_memory(pMgr->resource());
return;
}
- m_liDisplayDestroy.notify = handleDisplayDestroy;
- wl_display_add_destroy_listener(g_pCompositor->m_sWLDisplay, &m_liDisplayDestroy);
-
- Debug::log(LOG, "FractionalScaleManager started successfully!");
-}
-
-static const struct wp_fractional_scale_manager_v1_interface fractionalScaleManagerImpl = {
- .destroy = handleDestroy,
- .get_fractional_scale = handleGetFractionalScale,
-};
+ PADDON->resource->setOnDestroy([this, PADDON](CWpFractionalScaleV1* self) { this->removeAddon(PADDON); });
+ PADDON->resource->setDestroy([this, PADDON](CWpFractionalScaleV1* self) { this->removeAddon(PADDON); });
-void CFractionalScaleProtocolManager::bindManager(wl_client* client, void* data, uint32_t version, uint32_t id) {
- const auto RESOURCE = wl_resource_create(client, &wp_fractional_scale_manager_v1_interface, version, id);
- wl_resource_set_implementation(RESOURCE, &fractionalScaleManagerImpl, this, nullptr);
+ if (!m_mSurfaceScales.contains(surface))
+ m_mSurfaceScales[surface] = 1.F;
- Debug::log(LOG, "FractionalScaleManager bound successfully!");
+ PADDON->setScale(m_mSurfaceScales[surface]);
+ registerSurface(surface);
}
-static void handleDestroyScaleAddon(wl_client* client, wl_resource* resource);
-//
+void CFractionalScaleProtocol::sendScale(wlr_surface* surf, const float& scale) {
+ m_mSurfaceScales[surf] = scale;
+ if (m_mAddons.contains(surf))
+ m_mAddons[surf]->setScale(scale);
+ registerSurface(surf);
+}
-static const struct wp_fractional_scale_v1_interface fractionalScaleAddonImpl {
- .destroy = handleDestroyScaleAddon
-};
+void CFractionalScaleProtocol::registerSurface(wlr_surface* surf) {
+ if (m_mSurfaceDestroyListeners.contains(surf))
+ return;
-//
-SFractionalScaleAddon* addonFromResource(wl_resource* resource) {
- ASSERT(wl_resource_instance_of(resource, &wp_fractional_scale_v1_interface, &fractionalScaleAddonImpl));
- return (SFractionalScaleAddon*)wl_resource_get_user_data(resource);
+ m_mSurfaceDestroyListeners[surf].hyprListener_surfaceDestroy.initCallback(&surf->events.destroy, ::onWlrSurfaceDestroy, surf, "FractionalScale");
}
-static void handleDestroyScaleAddon(wl_client* client, wl_resource* resource) {
- wl_resource_destroy(resource);
+void CFractionalScaleProtocol::onSurfaceDestroy(wlr_surface* surf) {
+ m_mSurfaceDestroyListeners.erase(surf);
+ m_mSurfaceScales.erase(surf);
+ if (m_mAddons.contains(surf))
+ m_mAddons[surf]->onSurfaceDestroy();
}
-static void handleAddonDestroy(wl_resource* resource) {
- const auto PADDON = addonFromResource(resource);
- if (PADDON->pResource) {
- wl_resource_set_user_data(PADDON->pResource, nullptr);
- }
-
- g_pProtocolManager->m_pFractionalScaleProtocolManager->removeAddon(PADDON->pSurface);
+CFractionalScaleAddon::CFractionalScaleAddon(SP<CWpFractionalScaleV1> resource_, wlr_surface* surf_) : resource(resource_), surface(surf_) {
+ resource->setDestroy([this](CWpFractionalScaleV1* self) { PROTO::fractional->removeAddon(this); });
+ resource->setOnDestroy([this](CWpFractionalScaleV1* self) { PROTO::fractional->removeAddon(this); });
}
-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 (PADDON->pResource) {
- wl_resource_post_error(resource, WP_FRACTIONAL_SCALE_MANAGER_V1_ERROR_FRACTIONAL_SCALE_EXISTS, "Fractional scale exists.");
- return;
- }
-
- 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);
-
- wp_fractional_scale_v1_send_preferred_scale(PADDON->pResource, (uint32_t)std::round(PADDON->preferredScale * 120.0));
+void CFractionalScaleAddon::onSurfaceDestroy() {
+ surfaceGone = true;
}
-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; });
-
- if (IT != m_vFractionalScaleAddons.end())
- return IT->get();
-
- m_vFractionalScaleAddons.emplace_back(std::make_unique<SFractionalScaleAddon>());
-
- m_vFractionalScaleAddons.back()->pSurface = surface;
-
- return m_vFractionalScaleAddons.back().get();
+void CFractionalScaleAddon::setScale(const float& scale) {
+ resource->sendPreferredScale(std::round(scale * 120.0));
}
-void CFractionalScaleProtocolManager::setPreferredScaleForSurface(wlr_surface* surface, double scale) {
- const auto PADDON = getAddonForSurface(surface);
-
- PADDON->preferredScale = scale;
-
- if (PADDON->pResource)
- wp_fractional_scale_v1_send_preferred_scale(PADDON->pResource, (uint32_t)std::round(scale * 120.0));
+bool CFractionalScaleAddon::good() {
+ return resource->resource();
}
-void CFractionalScaleProtocolManager::removeAddon(wlr_surface* surface) {
- std::erase_if(m_vFractionalScaleAddons, [&](const auto& other) { return other->pSurface == surface; });
+wlr_surface* CFractionalScaleAddon::surf() {
+ return surface;
} \ No newline at end of file