Hyprland/src/desktop/WLSurface.hpp

118 lines
3.6 KiB
C++
Raw Normal View History

2023-03-20 16:00:58 +01:00
#pragma once
#include "../defines.hpp"
#include "../helpers/math/Math.hpp"
2024-04-27 00:55:41 +02:00
#include "../helpers/signal/Signal.hpp"
2024-02-29 16:07:11 +01:00
class CSubsurface;
class CPopup;
2024-04-27 00:55:41 +02:00
class CPointerConstraint;
class CWLSurfaceResource;
2023-03-20 16:00:58 +01:00
class CWLSurface {
public:
static SP<CWLSurface> create() {
auto p = SP<CWLSurface>(new CWLSurface);
p->self = p;
return p;
}
2023-03-20 16:00:58 +01:00
~CWLSurface();
2024-02-29 16:07:11 +01:00
// anonymous surfaces are non-desktop components, e.g. a cursor surface or a DnD
void assign(SP<CWLSurfaceResource> pSurface);
void assign(SP<CWLSurfaceResource> pSurface, PHLWINDOW pOwner);
void assign(SP<CWLSurfaceResource> pSurface, PHLLS pOwner);
void assign(SP<CWLSurfaceResource> pSurface, CSubsurface* pOwner);
void assign(SP<CWLSurfaceResource> pSurface, CPopup* pOwner);
2023-03-23 01:39:32 +01:00
void unassign();
2023-03-20 16:00:58 +01:00
CWLSurface(const CWLSurface&) = delete;
CWLSurface(CWLSurface&&) = delete;
CWLSurface& operator=(const CWLSurface&) = delete;
CWLSurface& operator=(CWLSurface&&) = delete;
2023-03-20 16:00:58 +01:00
SP<CWLSurfaceResource> 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 visible();
2024-02-29 16:07:11 +01:00
// getters for owners.
PHLWINDOW getWindow() const;
PHLLS getLayer() const;
CPopup* getPopup() const;
CSubsurface* getSubsurface() const;
2024-02-29 16:07:11 +01:00
// desktop components misc utils
std::optional<CBox> getSurfaceBoxGlobal() const;
void appendConstraint(WP<CPointerConstraint> constraint);
SP<CPointerConstraint> constraint() const;
2024-02-29 16:07:11 +01:00
// allow stretching. Useful for plugins.
bool m_bFillIgnoreSmall = false;
2023-03-20 16:00:58 +01:00
// track surface data and avoid dupes
float m_fLastScale = 0;
int m_iLastScale = 0;
wl_output_transform m_eLastTransform = (wl_output_transform)-1;
//
CWLSurface& operator=(SP<CWLSurfaceResource> pSurface) {
destroy();
m_pResource = pSurface;
init();
return *this;
2023-03-20 16:00:58 +01:00
}
bool operator==(const CWLSurface& other) const {
return other.resource() == resource();
2023-03-20 16:00:58 +01:00
}
bool operator==(const SP<CWLSurfaceResource> other) const {
return other == resource();
2023-03-20 16:00:58 +01:00
}
explicit operator bool() const {
return exists();
}
static SP<CWLSurface> fromResource(SP<CWLSurfaceResource> pSurface);
// used by the alpha-modifier protocol
float m_pAlphaModifier = 1.F;
2024-04-27 00:55:41 +02:00
struct {
CSignal destroy;
} events;
WP<CWLSurface> self;
2023-03-20 16:00:58 +01:00
private:
CWLSurface() = default;
bool m_bInert = true;
2024-02-29 16:07:11 +01:00
WP<CWLSurfaceResource> m_pResource;
2024-02-29 16:07:11 +01:00
PHLWINDOWREF m_pWindowOwner;
PHLLSREF m_pLayerOwner;
CPopup* m_pPopupOwner = nullptr;
CSubsurface* m_pSubsurfaceOwner = nullptr;
2023-03-20 16:00:58 +01:00
//
WP<CPointerConstraint> m_pConstraint;
void destroy();
void init();
bool desktopComponent() const;
2023-03-20 16:00:58 +01:00
struct {
CHyprSignalListener destroy;
} listeners;
2024-04-27 00:55:41 +02:00
friend class CPointerConstraint;
2023-03-20 16:00:58 +01:00
};