[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kwayland] /: Return SurfaceInterface::size in global compositor space
From: David Edmundson <kde () davidedmundson ! co ! uk>
Date: 2016-11-16 14:51:03
Message-ID: E1c71YF-0001Ys-OI () code ! kde ! org
[Download RAW message or body]
Git commit 49cbe7b23c54352e84ef127961a0d3123e3ef2f6 by David Edmundson.
Committed on 16/11/2016 at 14:50.
Pushed by davidedmundson into branch 'master'.
Return SurfaceInterface::size in global compositor space
REVIEW: 129358
M +47 -0 autotests/client/test_wayland_surface.cpp
M +5 -2 src/server/surface_interface.cpp
M +3 -1 src/server/surface_interface.h
http://commits.kde.org/kwayland/49cbe7b23c54352e84ef127961a0d3123e3ef2f6
diff --git a/autotests/client/test_wayland_surface.cpp b/autotests/client/test_wayland_surface.cpp
index d13db9a..a906433 100644
--- a/autotests/client/test_wayland_surface.cpp
+++ b/autotests/client/test_wayland_surface.cpp
@@ -671,6 +671,10 @@ void TestWaylandSurface::testScale()
// let's change the scale factor
QSignalSpy scaleChangedSpy(serverSurface, &SurfaceInterface::scaleChanged);
+
+ //changing the scale implicitly changes the size
+ QSignalSpy sizeChangedSpy(serverSurface, &SurfaceInterface::sizeChanged);
+
QVERIFY(scaleChangedSpy.isValid());
s->setScale(2);
QCOMPARE(s->scale(), 2);
@@ -682,6 +686,11 @@ void TestWaylandSurface::testScale()
QCOMPARE(scaleChangedSpy.first().first().toInt(), 2);
QCOMPARE(serverSurface->scale(), 2);
+ //even though we've changed the scale, if we don't have a buffer we
+ //don't have a size. If we don't have a size it can't have changed
+ QCOMPARE(sizeChangedSpy.count(), 0);
+ QVERIFY(!serverSurface->size().isValid());
+
// let's try changing to same factor, should not emit changed on server
s->setScale(2);
s->commit(Surface::CommitFlag::None);
@@ -695,6 +704,44 @@ void TestWaylandSurface::testScale()
QCOMPARE(scaleChangedSpy.first().first().toInt(), 2);
QCOMPARE(scaleChangedSpy.last().first().toInt(), 4);
QCOMPARE(serverSurface->scale(), 4);
+ scaleChangedSpy.clear();
+
+ //attach a buffer of 100x100, our scale is 4, so this should be a size of 25x25
+ QImage red(100, 100, QImage::Format_ARGB32);
+ red.fill(QColor(255, 0, 0, 128));
+ auto redBuffer = m_shm->createBuffer(red);
+ s->attachBuffer(redBuffer.data());
+ s->damage(QRect(0,0, 25,25));
+ s->commit(Surface::CommitFlag::None);
+ QVERIFY(sizeChangedSpy.wait());
+ QCOMPARE(sizeChangedSpy.count(), 1);
+ QCOMPARE(serverSurface->size(), QSize(25,25));
+ sizeChangedSpy.clear();
+ scaleChangedSpy.clear();
+
+ //set the scale to 1, buffer is still 100x100 so size should change to 100x100
+ s->setScale(1);
+ s->commit(Surface::CommitFlag::None);
+ QVERIFY(sizeChangedSpy.wait());
+ QCOMPARE(sizeChangedSpy.count(), 1);
+ QCOMPARE(scaleChangedSpy.count(), 1);
+ QCOMPARE(serverSurface->scale(), 1);
+ QCOMPARE(serverSurface->size(), QSize(100,100));
+ sizeChangedSpy.clear();
+ scaleChangedSpy.clear();
+
+ //set scale and size in one commit, buffer is 50x50 at scale 2 so size should be 25x25
+ QImage blue(50, 50, QImage::Format_ARGB32);
+ red.fill(QColor(255, 0, 0, 128));
+ auto blueBuffer = m_shm->createBuffer(blue);
+ s->attachBuffer(blueBuffer.data());
+ s->setScale(2);
+ s->commit(Surface::CommitFlag::None);
+ QVERIFY(sizeChangedSpy.wait());
+ QCOMPARE(sizeChangedSpy.count(), 1);
+ QCOMPARE(scaleChangedSpy.count(), 1);
+ QCOMPARE(serverSurface->scale(), 2);
+ QCOMPARE(serverSurface->size(), QSize(25,25));
}
void TestWaylandSurface::testDestroy()
diff --git a/src/server/surface_interface.cpp b/src/server/surface_interface.cpp
index 1579072..49b8e71 100644
--- a/src/server/surface_interface.cpp
+++ b/src/server/surface_interface.cpp
@@ -335,6 +335,9 @@ void SurfaceInterface::Private::swapStates(State *source, State *target, bool em
}
if (scaleFactorChanged) {
emit q->scaleChanged(target->scale);
+ if (buffer && !sizeChanged) {
+ emit q->sizeChanged();
+ }
}
if (transformChanged) {
emit q->transformChanged(target->transform);
@@ -634,9 +637,9 @@ QPointer< SubSurfaceInterface > SurfaceInterface::subSurface() const
QSize SurfaceInterface::size() const
{
Q_D();
- // TODO: apply transform and scale to the buffer size
+ // TODO: apply transform to the buffer size
if (d->current.buffer) {
- return d->current.buffer->size();
+ return d->current.buffer->size() / scale();
}
return QSize();
}
diff --git a/src/server/surface_interface.h b/src/server/surface_interface.h
index de74ef3..c3f38c8 100644
--- a/src/server/surface_interface.h
+++ b/src/server/surface_interface.h
@@ -114,7 +114,9 @@ public:
BufferInterface *buffer();
QPoint offset() const;
/**
- * The size of the Surface.
+ * The size of the Surface in global compositor space.
+ * @see For buffer size use BufferInterface::size
+ * from SurfaceInterface::buffer
* @since 5.3
**/
QSize size() const;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic