summaryrefslogtreecommitdiff
path: root/src/protocols/FractionalScale.hpp
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.hpp
parentea954494024cb596aaf9a40c77c3e0fcaf0e0322 (diff)
Fractional-scale: move to new impl
Diffstat (limited to 'src/protocols/FractionalScale.hpp')
-rw-r--r--src/protocols/FractionalScale.hpp74
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