summaryrefslogtreecommitdiff
path: root/src/Window.hpp
blob: 2d0dd0cc4b1e48a9a5ccd7a186598f12819af412 (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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
#pragma once

#include "defines.hpp"
#include "events/Events.hpp"
#include "helpers/SubsurfaceTree.hpp"
#include "helpers/AnimatedVariable.hpp"
#include "render/decorations/IHyprWindowDecoration.hpp"
#include <deque>
#include "config/ConfigDataValues.hpp"

enum eIdleInhibitMode
{
    IDLEINHIBIT_NONE = 0,
    IDLEINHIBIT_ALWAYS,
    IDLEINHIBIT_FULLSCREEN,
    IDLEINHIBIT_FOCUS
};

struct SWindowSpecialRenderData {
    bool    alphaOverride         = false;
    float   alpha                 = 1.f;
    bool    alphaInactiveOverride = false;
    float   alphaInactive         = -1.f; // -1 means unset

    int64_t activeBorderColor   = -1; // -1 means unset
    int64_t inactiveBorderColor = -1; // -1 means unset

    // set by the layout
    bool    rounding = true;
    bool    border   = true;
    bool    decorate = true;
};

struct SWindowAdditionalConfigData {
    std::string animationStyle       = "";
    int         rounding             = -1; // -1 means no
    bool        forceNoBlur          = false;
    bool        forceOpaque          = false;
    bool        forceOpaqueOverriden = false; // if true, a rule will not change the forceOpaque state. This is for the force opaque dispatcher.
    bool        forceAllowsInput     = false;
    bool        forceNoAnims         = false;
    bool        forceNoBorder        = false;
    bool        forceNoShadow        = false;
    bool        windowDanceCompat    = false;
    bool        noMaxSize            = false;
};

struct SWindowRule {
    std::string szRule;
    std::string szValue;

    bool        v2 = false;
    std::string szTitle;
    std::string szClass;
    int         bX11        = -1; // -1 means "ANY"
    int         bFloating   = -1;
    int         bFullscreen = -1;
    int         bPinned     = -1;
};

class CWindow {
  public:
    CWindow();
    ~CWindow();

    DYNLISTENER(commitWindow);
    DYNLISTENER(mapWindow);
    DYNLISTENER(unmapWindow);
    DYNLISTENER(destroyWindow);
    DYNLISTENER(setTitleWindow);
    DYNLISTENER(setGeometryX11U);
    DYNLISTENER(fullscreenWindow);
    DYNLISTENER(newPopupXDG);
    DYNLISTENER(requestMove);
    DYNLISTENER(requestMinimize);
    DYNLISTENER(requestMaximize);
    DYNLISTENER(requestResize);
    DYNLISTENER(activateX11);
    DYNLISTENER(configureX11);
    DYNLISTENER(toplevelClose);
    DYNLISTENER(toplevelActivate);
    DYNLISTENER(toplevelFullscreen);
    // DYNLISTENER(newSubsurfaceWindow);

    union {
        wlr_xdg_surface*      xdg;
        wlr_xwayland_surface* xwayland;
    } m_uSurface;

    // this is the position and size of the "bounding box"
    Vector2D                                           m_vPosition = Vector2D(0, 0);
    Vector2D                                           m_vSize     = Vector2D(0, 0);

    // this is the real position and size used to draw the thing
    CAnimatedVariable                                  m_vRealPosition;
    CAnimatedVariable                                  m_vRealSize;

    // for not spamming the protocols
    Vector2D                                           m_vReportedPosition;
    Vector2D                                           m_vReportedSize;

    // for restoring floating statuses
    Vector2D                                           m_vLastFloatingSize;

    // this is used for pseudotiling
    bool                                               m_bIsPseudotiled = false;
    Vector2D                                           m_vPseudoSize    = Vector2D(0, 0);

    uint64_t                                           m_iTags          = 0;
    bool                                               m_bIsFloating    = false;
    bool                                               m_bDraggingTiled = false; // for dragging around tiled windows
    bool                                               m_bIsFullscreen  = false;
    uint64_t                                           m_iMonitorID     = -1;
    std::string                                        m_szTitle        = "";
    int                                                m_iWorkspaceID   = -1;

    bool                                               m_bIsMapped = false;

    bool                                               m_bRequestsFloat = false;

    // This is for fullscreen apps
    bool                                               m_bCreatedOverFullscreen = false;

    // XWayland stuff
    bool                                               m_bIsX11                = false;
    bool                                               m_bMappedX11            = false;
    CWindow*                                           m_pX11Parent            = nullptr;
    uint64_t                                           m_iX11Type              = 0;
    bool                                               m_bIsModal              = false;
    bool                                               m_bX11DoesntWantBorders = false;
    bool                                               m_bX11ShouldntFocus     = false;
    //

    // For nofocus
    bool                                               m_bNoFocus        = false;
    bool                                               m_bNoInitialFocus = false;

    // initial fullscreen and fullscreen disabled
    bool                                               m_bWantsInitialFullscreen = false;
    bool                                               m_bNoFullscreenRequest    = false;

    SSurfaceTreeNode*                                  m_pSurfaceTree = nullptr;

    // Animated border
    CGradientValueData                                 m_cRealBorderColor         = {0};
    CGradientValueData                                 m_cRealBorderColorPrevious = {0};
    CAnimatedVariable                                  m_fBorderAnimationProgress;

    // Fade in-out
    CAnimatedVariable                                  m_fAlpha;
    bool                                               m_bFadingOut     = false;
    bool                                               m_bReadyToDelete = false;
    Vector2D                                           m_vOriginalClosedPos;  // these will be used for calculations later on in
    Vector2D                                           m_vOriginalClosedSize; // drawing the closing animations

    // For pinned (sticky) windows
    bool                                               m_bPinned = false;

    // for proper cycling. While cycling we can't just move the pointers, so we need to keep track of the last cycled window.
    CWindow*                                           m_pLastCycledWindow = nullptr;

    // Foreign Toplevel proto
    wlr_foreign_toplevel_handle_v1*                    m_phForeignToplevel = nullptr;

    // Window decorations
    std::deque<std::unique_ptr<IHyprWindowDecoration>> m_dWindowDecorations;
    std::vector<IHyprWindowDecoration*>                m_vDecosToRemove;

    // Special render data, rules, etc
    SWindowSpecialRenderData                           m_sSpecialRenderData;
    SWindowAdditionalConfigData                        m_sAdditionalConfigData;

    // for alpha
    CAnimatedVariable                                  m_fActiveInactiveAlpha;

    // animated shadow color
    CAnimatedVariable                                  m_cRealShadowColor;

    // animated tint
    CAnimatedVariable                                  m_fDimPercent;

    // swallowing
    CWindow*                                           m_pSwallowed = nullptr;

    // for toplevel monitor events
    uint64_t                                           m_iLastToplevelMonitorID = -1;
    uint64_t                                           m_iLastSurfaceMonitorID  = -1;

    // for idle inhibiting windows
    eIdleInhibitMode                                   m_eIdleInhibitMode = IDLEINHIBIT_NONE;

    // For the list lookup
    bool                                               operator==(const CWindow& rhs) {
        return m_uSurface.xdg == rhs.m_uSurface.xdg && m_uSurface.xwayland == rhs.m_uSurface.xwayland && m_vPosition == rhs.m_vPosition && m_vSize == rhs.m_vSize &&
            m_bFadingOut == rhs.m_bFadingOut;
    }

    // methods
    wlr_box                getFullWindowBoundingBox();
    wlr_box                getWindowIdealBoundingBoxIgnoreReserved();
    void                   updateWindowDecos();
    pid_t                  getPID();
    IHyprWindowDecoration* getDecorationByType(eDecorationType);
    void                   removeDecorationByType(eDecorationType);
    void                   createToplevelHandle();
    void                   destroyToplevelHandle();
    void                   updateToplevel();
    void                   updateSurfaceOutputs();
    void                   moveToWorkspace(int);
    CWindow*               X11TransientFor();
    void                   onUnmap();
    void                   onMap();
    void                   setHidden(bool hidden);
    bool                   isHidden();
    void                   applyDynamicRule(const SWindowRule& r);
    void                   updateDynamicRules();

  private:
    // For hidden windows and stuff
    bool m_bHidden = false;
};