17#include <KDecoration2/DecoratedClient>
18#include <KDecoration2/Decoration>
25 , m_imageSizesDirty(true)
27 connect(
client->decoration(), &KDecoration2::Decoration::damaged,
30 connect(
client->decoration(), &KDecoration2::Decoration::bordersChanged,
46 addDamage(m_client->window()->rect().toAlignedRect());
48 m_imageSizesDirty =
true;
75 return m_devicePixelRatio;
80 if (m_devicePixelRatio != dpr) {
81 m_devicePixelRatio = dpr;
88 client()->decoration()->paint(painter, rect);
94 , m_decoration(decoration)
99 this, &DecorationItem::handleOutputChanged);
101 connect(decoration->client(), &KDecoration2::DecoratedClient::sizeChanged,
102 this, &DecorationItem::handleDecorationGeometryChanged);
103 connect(decoration, &KDecoration2::Decoration::bordersChanged,
104 this, &DecorationItem::handleDecorationGeometryChanged);
110 handleOutputChanged();
115 QRectF left, top, right, bottom;
117 return {left, top, right, bottom};
125 QRectF left, top, right, bottom;
131 const QMargins roundingPad = QMargins(1, 1, 1, 1);
132 QRegion roundedLeft = left.toAlignedRect().marginsRemoved(roundingPad);
133 QRegion roundedTop = top.toAlignedRect().marginsRemoved(roundingPad);
134 QRegion roundedRight = right.toAlignedRect().marginsRemoved(roundingPad);
135 QRegion roundedBottom = bottom.toAlignedRect().marginsRemoved(roundingPad);
137 return roundedLeft | roundedTop | roundedRight | roundedBottom;
142 const QRegion damage = m_renderer->damage();
143 if (!damage.isEmpty()) {
144 m_renderer->render(damage);
145 m_renderer->resetDamage();
149void DecorationItem::handleOutputChanged()
155 m_output = m_window->
output();
158 handleOutputScaleChanged();
163void DecorationItem::handleOutputScaleChanged()
165 const qreal dpr = m_output->scale();
166 if (m_renderer->devicePixelRatio() != dpr) {
167 m_renderer->setDevicePixelRatio(dpr);
172void DecorationItem::handleDecorationGeometryChanged()
180 return m_renderer.get();
189 const qreal devicePixelRatio,
bool rotated)
191 const QRectF &r = partRect;
194 const int x0 = r.x();
195 const int y0 = r.y();
196 const int x1 = r.x() + r.width();
197 const int y1 = r.y() + r.height();
201 const int u0 = textureOffset.y() + p;
202 const int v0 = textureOffset.x() + p;
203 const int u1 = textureOffset.y() + p + std::round(r.width() * devicePixelRatio);
204 const int v1 = textureOffset.x() + p + std::round(r.height() * devicePixelRatio);
211 const int u0 = textureOffset.x() + p;
212 const int v0 = textureOffset.y() + p;
213 const int u1 = textureOffset.x() + p + std::round(r.width() * devicePixelRatio);
214 const int v1 = textureOffset.y() + p + std::round(r.height() * devicePixelRatio);
230 QRectF left, top, right, bottom;
231 const qreal devicePixelRatio = m_renderer->effectiveDevicePixelRatio();
236 const int topHeight = std::round(top.height() * devicePixelRatio);
237 const int bottomHeight = std::round(bottom.height() * devicePixelRatio);
238 const int leftWidth = std::round(left.width() * devicePixelRatio);
240 const QPoint topPosition(0, 0);
241 const QPoint bottomPosition(0, topPosition.y() + topHeight + (2 * texturePad));
242 const QPoint leftPosition(0, bottomPosition.y() + bottomHeight + (2 * texturePad));
243 const QPoint rightPosition(0, leftPosition.y() + leftWidth + (2 * texturePad));
246 if (left.isValid()) {
247 list.append(
buildQuad(left, leftPosition, devicePixelRatio,
true));
250 list.append(
buildQuad(top, topPosition, devicePixelRatio,
false));
252 if (right.isValid()) {
253 list.append(
buildQuad(right, rightPosition, devicePixelRatio,
true));
255 if (bottom.isValid()) {
256 list.append(
buildQuad(bottom, bottomPosition, devicePixelRatio,
false));
263#include "moc_decorationitem.cpp"
WorkspaceScene * scene() const
static Compositor * self()
KDecoration2::DecoratedClient * decoratedClient()
void preprocess() override
WindowQuadList buildQuads() const override
DecorationRenderer * renderer() const
QList< QRectF > shape() const override final
DecorationItem(KDecoration2::Decoration *decoration, Window *window, Scene *scene, Item *parent=nullptr)
QRegion opaque() const override final
static const int TexturePad
void renderToPainter(QPainter *painter, const QRect &rect)
void damaged(const QRegion ®ion)
DecorationRenderer(Decoration::DecoratedClientImpl *client)
Decoration::DecoratedClientImpl * client() const
void addDamage(const QRegion ®ion)
qreal devicePixelRatio() const
qreal effectiveDevicePixelRatio() const
void setDevicePixelRatio(qreal dpr)
void setSize(const QSizeF &size)
void scheduleRepaint(const QRectF ®ion)
Decoration::DecoratedClientImpl * decoratedClient() const
QMargins frameMargins() const
void layoutDecorationRects(QRectF &left, QRectF &top, QRectF &right, QRectF &bottom) const
Class representing one area of a window.
virtual std::unique_ptr< DecorationRenderer > createDecorationRenderer(Decoration::DecoratedClientImpl *)=0
WindowQuad buildQuad(const QRectF &partRect, const QPoint &textureOffset, const qreal devicePixelRatio, bool rotated)