2024-02-29 15:26:02 +01:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
#include <memory>
|
|
|
|
#include "Subsurface.hpp"
|
|
|
|
|
|
|
|
struct SLayerSurface;
|
|
|
|
|
|
|
|
class CPopup {
|
|
|
|
public:
|
|
|
|
// dummy head nodes
|
|
|
|
CPopup(CWindow* pOwner);
|
|
|
|
CPopup(SLayerSurface* pOwner);
|
|
|
|
|
|
|
|
// real nodes
|
|
|
|
CPopup(wlr_xdg_popup* popup, CPopup* pOwner);
|
|
|
|
|
|
|
|
~CPopup();
|
|
|
|
|
|
|
|
Vector2D coordsRelativeToParent();
|
|
|
|
Vector2D coordsGlobal();
|
|
|
|
|
2024-02-29 16:07:11 +01:00
|
|
|
Vector2D size();
|
|
|
|
|
2024-02-29 15:26:02 +01:00
|
|
|
void onNewPopup(wlr_xdg_popup* popup);
|
|
|
|
void onDestroy();
|
|
|
|
void onMap();
|
|
|
|
void onUnmap();
|
|
|
|
void onCommit();
|
|
|
|
void onReposition();
|
|
|
|
|
|
|
|
void recheckTree();
|
|
|
|
|
|
|
|
CWLSurface m_sWLSurface;
|
|
|
|
|
|
|
|
private:
|
|
|
|
// T1 owners, each popup has to have one of these
|
|
|
|
CWindow* m_pWindowOwner = nullptr;
|
|
|
|
SLayerSurface* m_pLayerOwner = nullptr;
|
|
|
|
|
|
|
|
// T2 owners
|
|
|
|
CPopup* m_pParent = nullptr;
|
|
|
|
|
|
|
|
wlr_xdg_popup* m_pWLR = nullptr;
|
|
|
|
|
|
|
|
Vector2D m_vLastSize = {};
|
|
|
|
Vector2D m_vLastPos = {};
|
|
|
|
|
|
|
|
bool m_bRequestedReposition = false;
|
|
|
|
|
|
|
|
bool m_bInert = false;
|
|
|
|
|
|
|
|
//
|
|
|
|
std::vector<std::unique_ptr<CPopup>> m_vChildren;
|
|
|
|
std::unique_ptr<CSubsurface> m_pSubsurfaceHead;
|
|
|
|
|
|
|
|
// signals
|
|
|
|
DYNLISTENER(newPopup);
|
|
|
|
DYNLISTENER(destroyPopup);
|
|
|
|
DYNLISTENER(mapPopup);
|
|
|
|
DYNLISTENER(unmapPopup);
|
|
|
|
DYNLISTENER(commitPopup);
|
|
|
|
DYNLISTENER(repositionPopup);
|
|
|
|
|
|
|
|
void initAllSignals();
|
|
|
|
void unconstrain();
|
|
|
|
void recheckChildrenRecursive();
|
|
|
|
|
|
|
|
Vector2D localToGlobal(const Vector2D& rel);
|
|
|
|
Vector2D t1ParentCoords();
|
|
|
|
};
|