#pragma once /* Implementations for: - wl_compositor - wl_surface - wl_region - wl_callback */ #include #include #include "../WaylandProtocol.hpp" #include "wayland.hpp" #include "../../helpers/signal/Signal.hpp" #include "../../helpers/math/Math.hpp" #include "../types/Buffer.hpp" #include "../types/SurfaceRole.hpp" #include "../types/SurfaceState.hpp" class CWLOutputResource; class CMonitor; class CWLSurface; class CWLSurfaceResource; class CWLSubsurfaceResource; class CViewportResource; class CDRMSyncobjSurfaceResource; class CColorManagementSurface; class CFrogColorManagementSurface; class CContentType; class CWLCallbackResource { public: CWLCallbackResource(SP resource_); bool good(); void send(timespec* now); private: SP resource; }; class CWLRegionResource { public: CWLRegionResource(SP resource_); static SP fromResource(wl_resource* res); bool good(); CRegion region; WP self; private: SP resource; }; class CWLSurfaceResource { public: CWLSurfaceResource(SP resource_); ~CWLSurfaceResource(); static SP fromResource(wl_resource* res); bool good(); wl_client* client(); void enter(PHLMONITOR monitor); void leave(PHLMONITOR monitor); void sendPreferredTransform(wl_output_transform t); void sendPreferredScale(int32_t scale); void frame(timespec* now); uint32_t id(); void map(); void unmap(); void error(int code, const std::string& str); SP getResource(); CBox extends(); void resetRole(); Vector2D sourceSize(); struct { CSignal precommit; // before commit CSignal commit; // after commit CSignal map; CSignal unmap; CSignal newSubsurface; CSignal destroy; } events; SSurfaceState current, pending; std::vector> callbacks; WP self; WP hlSurface; std::vector enteredOutputs; bool mapped = false; std::vector> subsurfaces; SP role; WP viewportResource; WP syncobj; // may not be present WP colorManagement; WP contentType; void breadthfirst(std::function, const Vector2D&, void*)> fn, void* data); SP findFirstPreorder(std::function)> fn); CRegion accumulateCurrentBufferDamage(); void presentFeedback(timespec* when, PHLMONITOR pMonitor, bool discarded = false); void commitPendingState(SSurfaceState& state); // returns a pair: found surface (null if not found) and surface local coords. // localCoords param is relative to 0,0 of this surface std::pair, Vector2D> at(const Vector2D& localCoords, bool allowsInput = false); private: SP resource; wl_client* pClient = nullptr; void destroy(); void releaseBuffers(bool onlyCurrent = true); void dropPendingBuffer(); void dropCurrentBuffer(); void bfHelper(std::vector> const& nodes, std::function, const Vector2D&, void*)> fn, void* data); SP findFirstPreorderHelper(SP root, std::function)> fn); void updateCursorShm(CRegion damage = CBox{0, 0, INT16_MAX, INT16_MAX}); friend class CWLPointerResource; }; class CWLCompositorResource { public: CWLCompositorResource(SP resource_); bool good(); private: SP resource; }; class CWLCompositorProtocol : public IWaylandProtocol { public: CWLCompositorProtocol(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 forEachSurface(std::function)> fn); struct { CSignal newSurface; // SP } events; private: void destroyResource(CWLCompositorResource* resource); void destroyResource(CWLSurfaceResource* resource); void destroyResource(CWLRegionResource* resource); // std::vector> m_vManagers; std::vector> m_vSurfaces; std::vector> m_vRegions; friend class CWLSurfaceResource; friend class CWLCompositorResource; friend class CWLRegionResource; friend class CWLCallbackResource; }; namespace PROTO { inline UP compositor; };