#pragma once #include "../../defines.hpp" #include "../../helpers/math/Math.hpp" #include "../../helpers/signal/Signal.hpp" class CPointerConstraint; class CWLSurfaceResource; namespace Desktop::View { class CSubsurface; class CPopup; class IView; class CWLSurface { public: static SP create() { auto p = SP(new CWLSurface); p->m_self = p; return p; } ~CWLSurface(); // anonymous surfaces are non-desktop components, e.g. a cursor surface or a DnD void assign(SP pSurface); void assign(SP pSurface, SP pOwner); void unassign(); CWLSurface(const CWLSurface&) = delete; CWLSurface(CWLSurface&&) = delete; CWLSurface& operator=(const CWLSurface&) = delete; CWLSurface& operator=(CWLSurface&&) = delete; SP resource() const; bool exists() const; bool small() const; // means surface is smaller than the requested size Vector2D correctSmallVec() const; // returns a corrective vector for small() surfaces Vector2D correctSmallVecBuf() const; // returns a corrective vector for small() surfaces, in BL coords Vector2D getViewporterCorrectedSize() const; CRegion computeDamage() const; // logical coordinates. May be wrong if the surface is unassigned bool keyboardFocusable() const; SP view() const; // desktop components misc utils std::optional getSurfaceBoxGlobal() const; void appendConstraint(WP constraint); SP constraint() const; // allow stretching. Useful for plugins. bool m_fillIgnoreSmall = false; // track surface data and avoid dupes float m_lastScaleFloat = 0; int m_lastScaleInt = 0; wl_output_transform m_lastTransform = sc(-1); // CWLSurface& operator=(SP pSurface) { destroy(); m_resource = pSurface; init(); return *this; } bool operator==(const CWLSurface& other) const { return other.resource() == resource(); } bool operator==(const SP other) const { return other == resource(); } explicit operator bool() const { return exists(); } static SP fromResource(SP pSurface); // used by the alpha-modifier protocol float m_alphaModifier = 1.F; // used by the hyprland-surface protocol float m_overallOpacity = 1.F; CRegion m_visibleRegion; struct { CSignalT<> destroy; } m_events; WP m_self; private: CWLSurface() = default; bool m_inert = true; WP m_resource; WP m_view; // WP m_constraint; void destroy(); void init(); bool desktopComponent() const; struct { CHyprSignalListener destroy; } m_listeners; friend class ::CPointerConstraint; }; }