diff options
| author | Vaxry <vaxry@vaxry.net> | 2024-04-20 14:14:54 +0100 |
|---|---|---|
| committer | Vaxry <vaxry@vaxry.net> | 2024-04-20 14:19:16 +0100 |
| commit | ea47e8c92ae283c4b41be0aafbdad9b0701a1624 (patch) | |
| tree | 30d064d286864e95c0886cf6177f01d1a41ace64 /src/protocols/FractionalScale.hpp | |
| parent | ea954494024cb596aaf9a40c77c3e0fcaf0e0322 (diff) | |
Fractional-scale: move to new impl
Diffstat (limited to 'src/protocols/FractionalScale.hpp')
| -rw-r--r-- | src/protocols/FractionalScale.hpp | 74 |
1 files changed, 52 insertions, 22 deletions
diff --git a/src/protocols/FractionalScale.hpp b/src/protocols/FractionalScale.hpp index 71b2c858..b800124f 100644 --- a/src/protocols/FractionalScale.hpp +++ b/src/protocols/FractionalScale.hpp @@ -1,38 +1,68 @@ #pragma once -#include "../defines.hpp" -#include "fractional-scale-v1-protocol.h" +#include <memory> +#include <unordered_map> +#include "WaylandProtocol.hpp" +#include "fractional-scale-v1.hpp" -#include <vector> -#include <algorithm> +class CFractionalScaleProtocol; -struct SFractionalScaleAddon { - wlr_surface* pSurface = nullptr; - double preferredScale = 1.0; - wl_resource* pResource = nullptr; -}; - -class CFractionalScaleProtocolManager { +class CFractionalScaleAddon { public: - CFractionalScaleProtocolManager(); + CFractionalScaleAddon(SP<CWpFractionalScaleV1> resource_, wlr_surface* surf_); + + void setScale(const float& scale); + void onSurfaceDestroy(); + + bool good(); - void bindManager(wl_client* client, void* data, uint32_t version, uint32_t id); + wlr_surface* surf(); - void displayDestroy(); + bool operator==(const wl_resource* other) const { + return other == resource->resource(); + } - void setPreferredScaleForSurface(wlr_surface*, double); + bool operator==(const CFractionalScaleAddon* other) const { + return other->resource == resource; + } - void removeAddon(wlr_surface*); + private: + SP<CWpFractionalScaleV1> resource; + float scale = 1.F; + wlr_surface* surface = nullptr; + bool surfaceGone = false; - // handlers + friend class CFractionalScaleProtocol; +}; - void getFractionalScale(wl_client* client, wl_resource* resource, uint32_t id, wl_resource* surface); +struct SSurfaceListener { + DYNLISTENER(surfaceDestroy); +}; + +class CFractionalScaleProtocol : public IWaylandProtocol { + public: + CFractionalScaleProtocol(const wl_interface* iface, const int& ver, const std::string& name); + + virtual void bindManager(wl_client* client, void* data, uint32_t ver, uint32_t id); + + void onManagerResourceDestroy(wl_resource* res); + void onGetFractionalScale(CWpFractionalScaleManagerV1* pMgr, uint32_t id, wlr_surface* surface); + + void sendScale(wlr_surface* surf, const float& scale); + void onSurfaceDestroy(wlr_surface* surf); + + void removeAddon(CFractionalScaleAddon*); private: - SFractionalScaleAddon* getAddonForSurface(wlr_surface*); + void registerSurface(wlr_surface*); + + std::unordered_map<wlr_surface*, SSurfaceListener> m_mSurfaceDestroyListeners; - std::vector<std::unique_ptr<SFractionalScaleAddon>> m_vFractionalScaleAddons; + std::unordered_map<wlr_surface*, float> m_mSurfaceScales; + std::unordered_map<wlr_surface*, UP<CFractionalScaleAddon>> m_mAddons; + std::vector<UP<CWpFractionalScaleManagerV1>> m_vManagers; +}; - wl_global* m_pGlobal = nullptr; - wl_listener m_liDisplayDestroy; +namespace PROTO { + inline UP<CFractionalScaleProtocol> fractional; };
\ No newline at end of file |
