aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/desktop/Popup.hpp
blob: 6aa7ce613299191b2a54662249ebaf0f1c7d7380 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#pragma once

#include <vector>
#include <memory>
#include "Subsurface.hpp"
#include "../helpers/signal/Listener.hpp"

class CPopup {
  public:
    // dummy head nodes
    CPopup(PHLWINDOW pOwner);
    CPopup(PHLLS pOwner);

    // real nodes
    CPopup(wlr_xdg_popup* popup, CPopup* pOwner);

    ~CPopup();

    Vector2D coordsRelativeToParent();
    Vector2D coordsGlobal();

    Vector2D size();

    void     onNewPopup(wlr_xdg_popup* popup);
    void     onDestroy();
    void     onMap();
    void     onUnmap();
    void     onCommit(bool ignoreSiblings = false);
    void     onReposition();

    void     recheckTree();

    bool     visible();

    // will also loop over this node
    void    breadthfirst(std::function<void(CPopup*, void*)> fn, void* data);
    CPopup* at(const Vector2D& globalCoords, bool allowsInput = false);

    //
    CWLSurface m_sWLSurface;

  private:
    // T1 owners, each popup has to have one of these
    PHLWINDOWREF m_pWindowOwner;
    PHLLSREF     m_pLayerOwner;

    // 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);

    struct {
        CHyprSignalListener newPopup;
    } listeners;

    void        initAllSignals();
    void        unconstrain();
    void        recheckChildrenRecursive();
    void        sendScale();

    Vector2D    localToGlobal(const Vector2D& rel);
    Vector2D    t1ParentCoords();
    static void bfHelper(std::vector<CPopup*> nodes, std::function<void(CPopup*, void*)> fn, void* data);
};