-
Notifications
You must be signed in to change notification settings - Fork 47
Expand file tree
/
Copy pathoutput.h
More file actions
174 lines (143 loc) · 5.93 KB
/
Copy pathoutput.h
File metadata and controls
174 lines (143 loc) · 5.93 KB
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
// Copyright (C) 2024-2026 UnionTech Software Technology Co., Ltd.
// SPDX-License-Identifier: Apache-2.0 OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#pragma once
#include "surface/surfacecontainer.h"
#include "backlight.h"
#include <wglobal.h>
#include <woutputviewport.h>
#include <QMargins>
#include <QObject>
#include <QQmlComponent>
Q_MOC_INCLUDE(<woutputitem.h>)
WAYLIB_SERVER_BEGIN_NAMESPACE
class WOutput;
class WOutputItem;
class WOutputViewport;
class WOutputLayout;
class WOutputLayer;
class WQuickTextureProxy;
class WSeat;
WAYLIB_SERVER_END_NAMESPACE
WAYLIB_SERVER_USE_NAMESPACE
class SurfaceWrapper;
class OutputConfig;
class Output : public SurfaceListModel
{
Q_OBJECT
QML_ANONYMOUS
Q_PROPERTY(QMargins exclusiveZone READ exclusiveZone NOTIFY exclusiveZoneChanged FINAL)
Q_PROPERTY(QRectF validRect READ validRect NOTIFY exclusiveZoneChanged FINAL)
Q_PROPERTY(WOutputItem* outputItem MEMBER m_item CONSTANT)
Q_PROPERTY(SurfaceListModel* minimizedSurfaces MEMBER minimizedSurfaces CONSTANT)
Q_PROPERTY(WOutputViewport* screenViewport MEMBER m_outputViewport CONSTANT)
Q_PROPERTY(OutputConfig* config READ config CONSTANT FINAL)
public:
enum class Type
{
Primary,
Proxy
};
enum class PlaceDirection
{
TopLeft,
BottomRight,
};
enum class ArrangeReason
{
InitialPlacement,
ExclusiveZoneChanged,
LayerSurfaceRemoved,
OutputGeometryChanged,
};
static Output *create(WOutput *output, QQmlEngine *engine, QObject *parent = nullptr);
static Output *createCopy(WOutput *output,
Output *proxy,
QQmlEngine *engine,
QObject *parent = nullptr);
explicit Output(WOutputItem *output, QObject *parent = nullptr);
~Output() override;
bool isPrimary() const;
void addSurface(SurfaceWrapper *surface) override;
void removeSurface(SurfaceWrapper *surface) override;
WOutput *output() const;
WOutputItem *outputItem() const;
QMargins exclusiveZone() const;
QRectF rect() const;
QRectF geometry() const;
QRectF validRect() const;
QRectF validGeometry() const;
WOutputViewport *screenViewport() const;
void updatePositionFromLayout();
QQuickItem *debugMenuBar() const;
static double calcPreferredScale(double widthPx,
double heightPx,
double widthMm,
double heightMm);
static QPointF constrainToValidArea(const QPointF &pos,
const QSizeF &windowSize,
const QRectF &validGeo);
qreal preferredScaleFactor(const QSize &pixelSize) const;
OutputConfig* config() const;
void adjustToOutputBounds(QPointF &pos,
const QRectF &normalGeo,
const QRectF &outputRect) const;
Q_SIGNALS:
void exclusiveZoneChanged();
void moveResizeFinised();
void brightnessChanged();
void colorTemperatureChanged();
public Q_SLOTS:
void enable();
void updateOutputHardwareLayers();
void setOutputColor(qreal brightness,
uint32_t colorTemperature,
std::function<void(bool)> resultCallback = nullptr);
private:
friend class SurfaceWrapper;
void setExclusiveZone(Qt::Edge edge, QObject *object, int value);
bool removeExclusiveZone(QObject *object);
void arrangeLayerSurface(SurfaceWrapper *surface);
void arrangeLayerSurfaces();
void arrangeNonLayerSurface(SurfaceWrapper *surface, ArrangeReason reason);
void arrangePopupSurface(SurfaceWrapper *surface);
void arrangeNonLayerSurfaces(ArrangeReason reason);
void arrangeAllSurfaces();
void applyOutputColorConfig();
std::pair<WOutputViewport *, QQuickItem *> getOutputItemProperty();
void placeUnderCursor(SurfaceWrapper *surface, quint32 yOffset);
void placeClientRequstPos(SurfaceWrapper *surface, QPoint clientRequstPos);
void placeCentered(SurfaceWrapper *surface);
void placeSmartCascaded(SurfaceWrapper *surface);
QPointF calculateBottomRightPosition(const QRectF &activeGeo,
const QRectF &normalGeo,
const QRectF &validGeo,
const QSizeF &offset);
QPointF calculateTopLeftPosition(const QRectF &activeGeo,
const QRectF &normalGeo,
const QRectF &validGeo,
const QSizeF &offset);
qreal preferredScaleFactor() const;
QPointF calculateBasePosition(SurfaceWrapper *surface, const QPointF &dPos) const;
void handleLayerShellPopup(SurfaceWrapper *surface, const QRectF &normalGeo);
void handleRegularPopup(SurfaceWrapper *surface, const QRectF &normalGeo, bool isSubMenu, WOutputItem *targetOutput);
void clearPopupCache(SurfaceWrapper *surface);
Type m_type;
WOutputItem *m_item;
Output *m_proxy = nullptr;
SurfaceFilterModel *minimizedSurfaces;
QPointer<QQuickItem> m_taskBar;
QPointer<QQuickItem> m_debugMenuBar;
WOutputViewport *m_outputViewport = nullptr;
QMargins m_exclusiveZone;
QList<std::pair<QObject *, int>> m_topExclusiveZones;
QList<std::pair<QObject *, int>> m_bottomExclusiveZones;
QList<std::pair<QObject *, int>> m_leftExclusiveZones;
QList<std::pair<QObject *, int>> m_rightExclusiveZones;
QList<WOutputLayer *> m_hardwareLayersOfPrimaryOutput;
PlaceDirection m_nextPlaceDirection = PlaceDirection::BottomRight;
QMap<SurfaceWrapper*, QPair<QPointF, QRectF>> m_positionCache;
QHash<SurfaceWrapper*, QPointF> m_initialWindowPositionRatio;
std::unique_ptr<Backlight> m_backlight = nullptr;
OutputConfig *m_config;
};
Q_DECLARE_OPAQUE_POINTER(WAYLIB_SERVER_NAMESPACE::WOutputItem *)