KWin
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
surfaceitem_wayland.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2021 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
8#include "compositor.h"
10#include "core/renderbackend.h"
12#include "wayland/surface.h"
13#include "window.h"
14#include "x11window.h"
15
16namespace KWin
17{
18
20 : SurfaceItem(scene, parent)
21 , m_surface(surface)
22{
24 this, &SurfaceItemWayland::handleSurfaceSizeChanged);
26 this, &SurfaceItemWayland::handleBufferSizeChanged);
28 this, &SurfaceItemWayland::handleBufferSourceBoxChanged);
30 this, &SurfaceItemWayland::handleBufferTransformChanged);
31
33 this, &SurfaceItemWayland::handleChildSubSurfacesChanged);
35 this, &SurfaceItemWayland::handleSurfaceCommitted);
39 this, &SurfaceItemWayland::handleChildSubSurfaceRemoved);
41 this, &SurfaceItemWayland::handleColorDescriptionChanged);
43 this, &SurfaceItemWayland::handlePresentationModeHintChanged);
44
45 SubSurfaceInterface *subsurface = surface->subSurface();
46 if (subsurface) {
48 this, &SurfaceItemWayland::handleSubSurfaceMappedChanged);
50 this, &SurfaceItemWayland::handleSubSurfaceMappedChanged);
51 connect(subsurface, &SubSurfaceInterface::positionChanged,
52 this, &SurfaceItemWayland::handleSubSurfacePositionChanged);
54 setPosition(subsurface->position());
55 }
56
57 handleChildSubSurfacesChanged();
63}
64
65QList<QRectF> SurfaceItemWayland::shape() const
66{
67 return {rect()};
68}
69
71{
72 if (m_surface) {
73 return m_surface->opaque();
74 }
75 return QRegion();
76}
77
79{
80 return m_surface;
81}
82
83void SurfaceItemWayland::handleSurfaceSizeChanged()
84{
85 setDestinationSize(m_surface->size());
86}
87
88void SurfaceItemWayland::handleBufferSizeChanged()
89{
90 setBufferSize(m_surface->bufferSize());
91}
92
93void SurfaceItemWayland::handleBufferSourceBoxChanged()
94{
95 setBufferSourceBox(m_surface->bufferSourceBox());
96}
97
98void SurfaceItemWayland::handleBufferTransformChanged()
99{
100 setBufferTransform(m_surface->bufferTransform());
101}
102
103void SurfaceItemWayland::handleSurfaceCommitted()
104{
105 if (m_surface->hasFrameCallbacks()) {
107 }
108}
109
110SurfaceItemWayland *SurfaceItemWayland::getOrCreateSubSurfaceItem(SubSurfaceInterface *child)
111{
112 auto &item = m_subsurfaces[child];
113 if (!item) {
114 item = std::make_unique<SurfaceItemWayland>(child->surface(), scene());
115 item->setParentItem(this);
116 }
117 return item.get();
118}
119
120void SurfaceItemWayland::handleChildSubSurfaceRemoved(SubSurfaceInterface *child)
121{
122 m_subsurfaces.erase(child);
123}
124
125void SurfaceItemWayland::handleChildSubSurfacesChanged()
126{
127 const QList<SubSurfaceInterface *> below = m_surface->below();
128 const QList<SubSurfaceInterface *> above = m_surface->above();
129
130 for (int i = 0; i < below.count(); ++i) {
131 SurfaceItemWayland *subsurfaceItem = getOrCreateSubSurfaceItem(below[i]);
132 subsurfaceItem->setZ(i - below.count());
133 }
134
135 for (int i = 0; i < above.count(); ++i) {
136 SurfaceItemWayland *subsurfaceItem = getOrCreateSubSurfaceItem(above[i]);
137 subsurfaceItem->setZ(i);
138 }
139}
140
141void SurfaceItemWayland::handleSubSurfacePositionChanged()
142{
143 setPosition(m_surface->subSurface()->position());
144}
145
146void SurfaceItemWayland::handleSubSurfaceMappedChanged()
147{
148 setVisible(m_surface->isMapped());
149}
150
151std::unique_ptr<SurfacePixmap> SurfaceItemWayland::createPixmap()
152{
153 return std::make_unique<SurfacePixmapWayland>(this);
154}
155
157{
158 return m_surface ? m_surface->contentType() : ContentType::None;
159}
160
162{
163 if (!m_surface) {
164 return;
165 }
166
167 m_surface->disconnect(this);
168 if (auto subsurface = m_surface->subSurface()) {
169 subsurface->disconnect(this);
170 }
171
172 for (auto &[subsurface, subsurfaceItem] : m_subsurfaces) {
173 subsurfaceItem->freeze();
174 }
175}
176
177void SurfaceItemWayland::handleColorDescriptionChanged()
178{
179 setColorDescription(m_surface->colorDescription());
180}
181
182void SurfaceItemWayland::handlePresentationModeHintChanged()
183{
184 setPresentationHint(m_surface->presentationModeHint());
185}
186
188 : SurfacePixmap(Compositor::self()->backend()->createSurfaceTextureWayland(this), parent)
189 , m_item(item)
190{
191}
192
194{
195 update();
196}
197
199{
200 SurfaceInterface *surface = m_item->surface();
201 if (surface) {
202 setBuffer(surface->buffer());
203 }
204}
205
207{
208 return m_bufferRef;
209}
210
212 : SurfaceItemWayland(window->surface(), scene, parent)
213 , m_window(window)
214{
216}
217
218QList<QRectF> SurfaceItemXwayland::shape() const
219{
220 QList<QRectF> shape = m_window->shapeRegion();
221 for (QRectF &shapePart : shape) {
222 shapePart = shapePart.intersected(rect());
223 }
224 return shape;
225}
226
228{
229 QRegion shapeRegion;
230 for (const QRectF &shapePart : shape()) {
231 shapeRegion += shapePart.toRect();
232 }
233 if (!m_window->hasAlpha()) {
234 return shapeRegion;
235 } else {
236 return m_window->opaqueRegion() & shapeRegion;
237 }
238 return QRegion();
239}
240
241} // namespace KWin
242
243#include "moc_surfaceitem_wayland.cpp"
void setColorDescription(const ColorDescription &description)
Definition item.cpp:450
Scene * scene() const
Definition item.cpp:32
void setVisible(bool visible)
Definition item.cpp:388
void scheduleFrame()
Definition item.cpp:327
QRectF rect() const
Definition item.cpp:152
void setPresentationHint(PresentationModeHint hint)
Definition item.cpp:460
void discardQuads()
Definition item.cpp:350
void setPosition(const QPointF &point)
Definition item.cpp:122
void positionChanged(const QPoint &position)
Resource representing a wl_surface.
Definition surface.h:80
const ColorDescription & colorDescription() const
Definition surface.cpp:1086
void damaged(const QRegion &)
QRectF bufferSourceBox() const
Definition surface.cpp:799
void childSubSurfaceRemoved(SubSurfaceInterface *subSurface)
bool isMapped() const
Definition surface.cpp:891
OutputTransform bufferTransform() const
Definition surface.cpp:804
GraphicsBuffer * buffer() const
Definition surface.cpp:809
QSize bufferSize() const
Definition surface.cpp:1061
void bufferTransformChanged(KWin::OutputTransform)
SubSurfaceInterface * subSurface() const
Definition surface.cpp:845
void presentationModeHintChanged()
void setDestinationSize(const QSizeF &size)
void setBufferTransform(OutputTransform transform)
void setBufferSize(const QSize &size)
void addDamage(const QRegion &region)
void setBufferSourceBox(const QRectF &box)
QList< QRectF > shape() const override
std::unique_ptr< SurfacePixmap > createPixmap() override
ContentType contentType() const override
QRegion opaque() const override
SurfaceInterface * surface() const
SurfaceItemWayland(SurfaceInterface *surface, Scene *scene, Item *parent=nullptr)
QRegion opaque() const override
QList< QRectF > shape() const override
SurfaceItemXwayland(X11Window *window, Scene *scene, Item *parent=nullptr)
GraphicsBufferRef m_bufferRef
void setBuffer(GraphicsBuffer *buffer)
SurfacePixmapWayland(SurfaceItemWayland *item, QObject *parent=nullptr)
bool hasAlpha() const
Definition x11window.h:540
QList< QRectF > shapeRegion() const
QRegion opaqueRegion() const
Definition x11window.h:545
ContentType
Definition globals.h:284